Matlab线性规划实例
线性规划习题
之前的线性规划的练习题
-
题目
-
-
解答
f = [3 -1 -1];
A = [1 -2 1;4 -1 -2];
b = [11,-3]';
Aeq = [-2 0 1];
beq = [1];
[x,y] = linprog(-f,A,b,Aeq,beq,zeros(3,1));
z = y这里是一个到线性规划的转换,要做一个变量的变换,把每一个绝对值x都替换成一个u和v的表示变量
如:u = (x + |x|) / 2 v = (|x| - x) / 2
代码:clc,clear
c = 1:4;
c = [c,c];
aeq = [1 -1 -1 1;1 -1 1 -3;1 -1 -2 3];
Aeq = [aeq,-aeq];
beq = [0 1 -1/2];
[x,y] = linprog(c,[],[],Aeq,beq,zeros(8,1))
x = x(1:4)-x(5:8)
这里可以看到:
将|x|转换为u和v之后,进行一个8个向量的线性规划,修改Aeq和f的值,但是这里的beq不需要8个向量这里根据三种产品对应的六种工序之间可以分类。原因在于每一种工序的价格和约束不同,基于此,可以发现,第一种产品有5个参数,第二种产品3个参数,但是对于第三种产品而言,题目中要求必须完成A、B这2道工序,因此第三个只有一个参数。
a = [0.25 0.35 0.50];
b = [1.25 2.00 2.80];
c = [6000 10000 4000 7000 4000];
d = [300 321 250 783 200];
f = [b(1)-a(1)-d(1)/c(1)*5,b(1)-a(1)-d(2)/c(2)*7,-d(3)/c(3)*6,-d(4)/c(4)*4,-d(5)/c(5)*7,-d(1)/c(1)*10,-d(2)/c(2)*9,b(2)-a(2)-d(3)/c(3)*8,b(3)-a(3)-d(2)/c(2)*12-d(4)/c(4)*11];
Aeq = [5 0 0 0 0 10 0 0 0;0 7 0 0 0 0 9 0 12;0 0 6 0 0 0 0 8 0;0 0 0 4 0 0 0 0 11;0 0 0 0 7 0 0 0 0];
beq = c;
A = [1 1 -1 -1 -1 0 0 0 0;0 0 0 0 0 1 1 -1 0];
b = [0 0];
ub = zeros(9,1);
[x,y] = intlinprog(-f,ones(9,1),Aeq,beq,A,b,ub);
z = -y
x这里的和第三题类似,分成了3×4=12种情况
c = [3100;3800;3500;2850];
c = c*ones(1,3);
c = c(:);
a1 = zeros(4,12);
for i = 1:4
a1(i,i:4:12) = 1;
end
b1 = [18;15;23;12];
a2 = zeros(3,12);
for i = 1:3
a2(i,4*i-3:4*i) = 1;
end
b2 = [10 16 8]';
bb = [480;650;580;390];
a3 = zeros(3,12);
for j = 1:3
a3(j,4*j-3:4*j) = bb;
end
b3 = [6800 8700 5300]';
a = [a1;a2;a3];
b = [b1;b2;b3];
aeq = zeros(2,12);
aeq(1,1:4) = 1/10;
aeq(1,5:8) = -1/16;
aeq(2,5:8) = 1/16;
aeq(2,9:12) = -1/8;
beq = zeros(2,1);
[x,y] = linprog(-c,a,b,aeq,beq,zeros(12,1));
y = -y
总结
对于单纯的线性规划问题来说的话,lingo其实更加好用,而且对于一些数据量较为大的情况,比如超过lingo默认的32M内存的情况,这个时候可以修改lingo的设置,但是Matlab无法进行求解。
原文地址:http://blog.****.net/qq_34861102/article/details/76736599