Day2.整数规划模型之分枝定界法学习

一、学习题目

抛开限制条件整数不谈,其余的部分和我们之前学习的线性模型求解一模一样,先利用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的上界,下界寻找最佳整数解。可以在多找一些实际问题,多多练习,多多体会!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值