How do I get MatLab to solve the following mixed integer non-linear optimization problem?

38 vues (au cours des 30 derniers jours)
Hello,
Using the opimization toolbox, I'm attempting to solve the following mixed integer non-linear optimization problem. It's a relatively simple set up. The problem involves batch sizes of part i, an amount of changeovers in month j and the problem is designed to always meet demand, while trying to do the amount of changeovers possible in a given month, and minimizes inventory left over in any month. See the code below
I get the following error message when I run the code:
"Error using optim.problemdef.OptimizationProblem/solve
Nonlinear problem with integer variables not supported."
I understand that all these variables could be matrices, but I'm also just learning MatLab syntax so I'm solving the problem this way for a proof of concept first.
Thanks all!
%i = parts = 2, j = months = 3
batchprob = optimproblem('ObjectiveSense','min');
%Demand
D11 = 500;
D12 = 200;
D13 = 600;
D21 = 400;
D22 = 300;
D23 = 100;
%Initial Inventory
I1o = 100;
I2o = 200;
%Holding Cost - Allows inventory to be of similar magnitude to changeovers (For minimizing objective function)
h1 = 0.001;
h2 = 0.001;
%Changeovers possible
Co1 = 2;
Co2 = 3;
Co3 = 2;
%Minimum batch sizes
Bm1 = 300;
Bm2 = 200;
%Calculating demand after subtracting initial inventory
D11 = D11 - I1o;
D21 = D21 - I2o;
%Decision Variables:
%Number of Changeovers
z11 = optimvar('z11','Type','integer','LowerBound',0);
z12 = optimvar('z12','Type','integer','LowerBound',0);
z13 = optimvar('z13','Type','integer','LowerBound',0);
z21 = optimvar('z21','Type','integer','LowerBound',0);
z22 = optimvar('z22','Type','integer','LowerBound',0);
z23 = optimvar('z23','Type','integer','LowerBound',0);
%Batch Sizes
B11 = optimvar('B11','LowerBound',0);
B12 = optimvar('B12','LowerBound',0);
B13 = optimvar('B13','LowerBound',0);
B21 = optimvar('B21','LowerBound',0);
B22 = optimvar('B22','LowerBound',0);
B23 = optimvar('B23','LowerBound',0);
%Inventories LeftOver
I11 = z11*B11 - D11;
I12 = z12*B12 - D12;
I13 = z13*B13 - D13;
I21 = z21*B21 - D21;
I22 = z22*B22 - D22;
I23 = z23*B23 - D23;
batchprob.Constraints.consbatch1 = B11 >= Bm1;
batchprob.Constraints.consbatch2 = B12 >= Bm1;
batchprob.Constraints.consbatch3 = B13 >= Bm1;
batchprob.Constraints.consbatch4 = B21 >= Bm2;
batchprob.Constraints.consbatch5 = B22 >= Bm2;
batchprob.Constraints.consbatch6 = B23 >= Bm2;
batchprob.Constraints.consdemand1 = z11*B11 >= D11;
batchprob.Constraints.consdemand2 = z12*B12 >= D12;
batchprob.Constraints.consdemand3 = z13*B13 >= D13;
batchprob.Constraints.consdemand4 = z21*B21 >= D21;
batchprob.Constraints.consdemand5 = z22*B22 >= D22;
batchprob.Constraints.consdemand6 = z23*B23 >= D23;
batchprob.Constraints.consCO1 = z11 + z21 >= Co1;
batchprob.Constraints.consCO1 = z12 + z22 >= Co2;
batchprob.Constraints.consCO1 = z13 + z23 >= Co3;
%Objective Function
batchprob.Objective = z11 + z12 + z13 + z21 + z22 + z23 + h1*I11 + h1*I12 + h1*I13 + h2*I21 + h2*I22 + h2*I23;
sol = solve(batchprob);

Réponse acceptée

Anmol Dhiman
Anmol Dhiman le 3 Déc 2019
Mixed integer programming is a hard problem to tackle. As in above code, the constraints are non linear making it even harder. As per my knowledge, mixed integer nonlinear programming with nonlinear constraints are not supported in MATLAB.
You may either try to make the constraints linear by taking logarithm of constraints or remove the integer constraints on variables by making the variables real as below.
z11 = optimvar('z11','LowerBound',0);
z12 = optimvar('z12','LowerBound',0);
z13 = optimvar('z13','LowerBound',0);
z21 = optimvar('z21','LowerBound',0);
z22 = optimvar('z22','LowerBound',0);
z23 = optimvar('z23','LowerBound',0);
Also try looking at algorithms such as branch and bound or cutting plane algorithm.
Hope this helps.

Plus de réponses (0)

Catégories

En savoir plus sur Get Started with Optimization Toolbox dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by