Matlab——0-1整数规划

本文介绍了如何使用MATLAB解决两个0-1整数规划问题:1) 指派问题,通过实例展示最优解;2) 生产销售计划问题,构建分段线性函数的利润模型,并设定约束条件,最终得出最佳生产和采购策略。

(1)第一个问题:指派问题的0-1整数规划问题,可以使用MATLAB,如果是其他的就不适用。
栗子:
(1)[3821038729764275842359106910]\begin{bmatrix} 3 & 8 & 2 & 10 & 3 \\\\ 8 & 7 & 2 & 9 &7 \\\\ 6 & 4 & 2 & 7 &5 \\\\ 8 & 4 & 2 & 3 &5 \\\\ 9 & 10 & 6 & 9 &10 \end{bmatrix}\tag{1}3868987441022226109739375510(1)

\\\使用MATLAB
c=[3 8 2 10 3;8 7 2 9 7;6 4 2 7 5;8 4 2 3 5;9 10 6 9 10];
c=c(:);
a=zeros(10,25);
for i=1:5
  a(i,(i-1)*5+1:5*i)=1;
  a(5+i,i:5:25)=1;
end
b=ones(10,1);
[x,y]=linprog(c,[],[],a,b);
x=reshape(x,[5,5]),y
\\使用Lingo软件
model:
sets:
var/1..5/;
link(var,var):c,x;
endsets
data:
c=3 8 2 10 3
8 7 2 9 7
6 4 2 7 5
8 4 2 3 5
9 10 6 9 10;
enddata
min=@sum(link:c*x);
@for(var(i):@sum(var(j):x(i,j))=1);
@for(var(j):@sum(var(i):x(i,j))=1);
@for(link:@bin(x));
end
(纪念一下,运行很多次出现错误,最后查阅很多资料,才他妈的发现缺个分号,我眼睛都看瞎了)

在这里插入图片描述
在这里插入图片描述
结果是,最优指派方案为x(15)=x(23)=x(32)=x(44)=x(51)=1,最优值为21。
(2)第二个问题。生产销售计划问题。
建立模型:
设原油的购买量为x,根据题目可以得出采购的支出c(x)可表示为下列的分段线性函数:
c(x)={10x,0≤x≤5001000+8x,500≤x≤10003000+6x,1000≤x≤1500c(x)= \begin{cases} 10x,0\leq x \leq 500&\\ 1000+8x,500\leq x \leq 1000&\\ 3000+6x,1000\leq x \leq 1500 \end{cases} c(x)=10x,0x5001000+8x,500x10003000+6x,1000x1500
设原油A生产甲、乙两种汽油的数量分别是x(11)和x(12),原油B生产甲、乙两种汽油的数量分别是x(21)和x(22),则总的收入为4.8(x(11)+x(21))+5.6(x(21+x(22)))
则利润为:
maxz=4.8[x(11)+x(21)]+5.6[x(21)+x(22)]−c(x)maxz=4.8[x(11)+x(21)]+5.6[x(21)+x(22)]-c(x)maxz=4.8[x(11)+x(21)]+5.6[x(21)+x(22)]c(x)
约束条件为:
x(11)+x(12)≤500+xx(21)+x(22)≤1000x≤1500x(11)x(11)+x(21)≤0.5x(12)x(12)+x(22)≤0.6x(11),x(12),x(21),x(22),x≥0 x(11)+x(12)\leq 500+x\\ x(21)+x(22)\leq 1000\\ x\leq 1500\\ \frac{x(11)}{x(11)+x(21)}\leq 0.5\\ \frac{x(12)}{x(12)+x(22)}\leq 0.6\\ x(11),x(12),x(21),x(22),x\geq 0 x(11)+x(12)500+xx(21)+x(22)1000x1500x(11)+x(21)x(11)0.5x(12)+x(22)x(12)0.6x(11),x(12),x(21),x(22),x0
模型一:
目标函数:
maxz=4.8[x(11)+x(21)]+5.6[x(21)+x(22)]−[10x(1)+8x(2)+6x(3)]maxz=4.8[x(11)+x(21)]+5.6[x(21)+x(22)]-[10x(1)+8x(2)+6x(3)]maxz=4.8[x(11)+x(21)]+5.6[x(21)+x(22)][10x(1)+8x(2)+6x(3)]
约束条件:
前面的条件加上:x1=500t[x(1)−500]x(2)=0[x(2)−500]x(3)=00≤x(1),x(2),x(3)≤500 前面的条件加上: x1=500t\\ [x(1)-500]x(2)=0\\ [x(2)-500]x(3)=0\\ 0\leq x(1),x(2),x(3)\leq500 x1=500t[x(1)500]x(2)=0[x(2)500]x(3)=00x(1),x(2),x(3)500
使用lingo解释模型:

model:
sets:
var1/1..4/:y;  !这里的y(1)=x(11),y(2)=x(12),y(3)=x(21),y(4)=x(22);
var2/1..3/:x,c;
endsets
max=4.8*(y(1)+y(2))+5.6*(y(3)+y(4))-@sum(var2:c*x);
y(1)+y(3)<@sum(var2:x)+500;
y(2)+y(4)<1000;
0.5*(y(1)-y(2))>0;
0.4*y(3)-0.6*y(4)>0;
(x(1)-500)*x(2)=0;
(x(2)-500)*x(3)=0;
@for(var2:@bnd(0,x,500));
data:
c=10 8 6;
enddata
end

得出结果,最后购买1000t原油A,与库存的500t原油A和1000t原油B一起,生产2500t汽油乙,利润是5000元。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值