一、学习题目
抛开限制条件整数不谈,其余的部分和我们之前学习的线性模型求解一模一样,先利用matlab求解出答案。
>> f = [-40 -90];
>> A = [9 7; 7 20];
>> b = [56; 70];
>> Aeq = [];
>> beq = [];
>> lb = [0 0];
>> ub = [inf inf];
>> [x,fval]=linprog(f,A,b,Aeq,beq,lb,ub);
Optimal solution found.
>> x
x =
4.8092
1.8168
这里计算出的结果x1和x2并不是整数,所以接下来的学习就是如何将最优整数解答求解出来;
二、分枝定界法步骤
方法用处:分枝定界法可以用于了解纯整数或混合的整数规划问题
2.1 第一步
根据我们出的结果,我们可以暂定z的上限(最大值)可以是356;我们也可以一样看出x1,x2分别为0时,z最小值为0;因此最大值z的范围可以暂定为:0≤z≤356
2.2第二步
因为x1 x2当前均为非整数,不满足整数要求,任选一个x1进行分枝,把可行集分为2个子集;
x1<=[4.8092] = 4, x1>=[4.8092] + 1 = 5
4与5之间没有整数,因此这种方法就叫做分枝。
这两个子集的规划及求解如下:
问题B1:
目标函数:
Max z = 40x1 +90x2
约束条件:
9*x1 + 7*x2 <=56
7*x1 + 20*x2 <=70
0<x1<4 x2>0
因为我们只对x1进行了分枝,因此x2的约束不变。
对B1利用matlab求解:
>> f = [40,90];%用目标函数系数来确定
>> a = [9 7 ;7 20];%约束条件左边约束
>> b = [56 70];%约束条件右边系数
>> aeq = [];%没有等式约束,因此aeq,beq都为空
>> beq = [];
>> lb = [4;inf];%x1的上限为4,x2没有上限
>> [x,y] = linprog(-c,a,b,aeq,beq,lb,ub);
函数或变量 'c' 无法识别。
>> [x,y] = linprog(-f,a,b,aeq,beq,lb,ub);
函数或变量 'ub' 无法识别。
>> lb = [0;0];
>> ub = [4;inf];
>> [x,y] = linprog(-f,a,b,aeq,beq,lb,ub);
Optimal solution found.
>> x
x =
4.0000
2.1000
>> best = c*x
函数或变量 'c' 无法识别。
>> best = f*x
best =
349
根据运行结果,因此我们得出:x1 = 4.0,x2 = 2.1 z1 = 349
我们对下x1做了分枝,因此我们还要计算x1的另一半(我们就是相当于把x1范围划分两半,分别计算,后面我们再求其和)。因此对于x1的问题有了B2:
目标函数:
Max z = 40x1 + 90x2
约束条件:
9*x1 + 7*x2 <=56
7*x1 +20*x2 <=70
x1>=5 x2>0
>> f = [40 90];
>> A = [9 7; 7 20];
>> b = [56;70];
>> Aeq = [];
>> beq = [];
>> lb = [5 0];
>> ub = [inf inf];
>> [x,fval]=(-f,A,b,Aeq,beq,lb,ub);
[x,fval]=(-f,A,b,Aeq,beq,lb,ub);
↑
无效表达式。调用函数或对变量进行索引时,请使用圆括号。否则,请检查不匹配的分隔符。
>> [x,fval]=linprog(-f,A,b,Aeq,beq,lb,ub);
Optimal solution found.
>> x
x =
5.0000
1.5714
>> fval
fval =
-341.4286
可以看到x1= 5 x2= 1.5714 z = 341.4286
现在我们把最优值在定界确定范围为:0<= z<=349
2.3 第三步
对第二步的问题B1 继续分支,我们可以看到问题B1只有x2只有小数,因此我们是对B1问题里的x2进行分枝(按照第一步的方法):
0 <= x2 < [2.1] = 2, x2 > [2.1] +1 =3
得到问题如下:
B11问题目标函数:
Max z = 40x1 + 90 x 2
约束条件:
9* x1 + 7*x2 <= 56
7* x1 + 20* x 2 <= 70
0 <= x1 <= 4 2> x2 >=0
matlab计算代码如下:
>> c = [40 90];
>> a = [9 7;7 20];
>> b = [56 70];
>> aeq = [];
>> beq = [];
>> lb = [0;0];
>> ub = [4;2];
>> [x,y]= linprog(-c,a,b,aeq,beq,lb,ub);
Optimal solution found.
>> x
x =
4
2
>> best = *x
best = *x
↑
运算符的使用无效。
>> best = c*x
best =
340
可以看到x1= 4; x2= 2; z =340
然后我们在计算x2的另外一个分枝,唯一变化的还是x的范围
问题B12:
目标函数:
Max z = 40x1 + 90x2
约束条件:
9*x1 + 7*x2 <= 56
7*x1 + 20*x2 <=70
0<= x1 <= 4 x2 >=3
matlab计算结果:
>> f = [40 90];
>> A = [9 7; 7 20];
>> b = [56 ; 70];
>> Aeq = [];
>> beq = [];
>> lb = [0 3]
lb =
0 3
>> ub = [4 inf];
>> [x,fval]=linprog(-f,A,b,Aeq,beq,lb,ub)
Optimal solution found.
x =
1.4286
3.0000
fval =
-327.1429
因此我们可以确定范围340<z<341
到这里我们已经对B1进行了讨论,因此我们在对问题B2进行分枝。
2.4 第四步
根据上面的结果,x2 = 1.5714为小数,因为我们对B2中的x2进行分枝。
0 <= x2 < [1.5714] = 1, x2>[1.5714]+1 =2
得到问题B21如下:
目标函数:
Max z = 40x1 + 90x2
约束函数:
9*x1 + 7*x2 <= 56
7*x1 + 20*x2 <=70
x1>=5 1>= x2 >= 0
用matlab计算结果如下:
>> f = [40 90];
>> A = [9 7; 7 20];
>> b = [56;70];
>> Aeq = [];
>> beq = [];
>> lb = [5 0];
>> ub = [inf 1];
>> [x fval]= linprog(-f,A,b,Aeq,beq,lb,ub)
Optimal solution found.
x =
5.4444
1.0000
fval =
-307.7778
>>
B22问题如下:
目标函数:
Max z = 40x1 + 90x2
约束条件:
9*x1 + 7*x2 <= 56
7*x1 + 20*x2 <=70
x1>=5 x2 >=2
matlab函数求解:
2.5 结论
B2的两个分枝,B21的分枝结果含有小数,B22的分枝没有结果,即只有B1的1一个枝可以取,即为最优解:
x1 = 4 ; x2 =2 ; z = 340;
三、总结:
整数规划模型相比于线性规划而言,重点是如何分枝,其实就是利用lb,ub的上界,下界寻找最佳整数解。可以在多找一些实际问题,多多练习,多多体会!