Matlab——0-1整数规划

(1)第一个问题:指派问题的0-1整数规划问题,可以使用MATLAB,如果是其他的就不适用。
栗子:
(1) [ 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 ] \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
(纪念一下,运行很多次出现错误,最后查阅很多资料,才他妈的发现缺个分号,我眼睛都看瞎了)

Matlab——0-1整数规划_第1张图片
Matlab——0-1整数规划_第2张图片
结果是,最优指派方案为x(15)=x(23)=x(32)=x(44)=x(51)=1,最优值为21。
(2)第二个问题。生产销售计划问题。
建立模型:
设原油的购买量为x,根据题目可以得出采购的支出c(x)可表示为下列的分段线性函数:
c ( x ) = { 10 x , 0 ≤ x ≤ 500 1000 + 8 x , 500 ≤ x ≤ 1000 3000 + 6 x , 1000 ≤ x ≤ 1500 c(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)))
则利润为:
m a x z = 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 + x x ( 21 ) + x ( 22 ) ≤ 1000 x ≤ 1500 x ( 11 ) x ( 11 ) + x ( 21 ) ≤ 0.5 x ( 12 ) x ( 12 ) + x ( 22 ) ≤ 0.6 x ( 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
模型一:
目标函数:
m a x z = 4.8 [ x ( 11 ) + x ( 21 ) ] + 5.6 [ x ( 21 ) + x ( 22 ) ] − [ 10 x ( 1 ) + 8 x ( 2 ) + 6 x ( 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)]
约束条件:
前 面 的 条 件 加 上 : x 1 = 500 t [ x ( 1 ) − 500 ] x ( 2 ) = 0 [ x ( 2 ) − 500 ] x ( 3 ) = 0 0 ≤ 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元。

你可能感兴趣的:(MATLAB)