线性规划(上)
一、什么是线性规划问题?
在一组线性的等式或不等式下的约束下,求一线性目标函数最大值或最小值的问题。
二、Matlab 中规定线性规划的标准形式
其中 c 和 x 为 n 维列向量, A 、 Aeq 为适当维数的矩阵,b 、beq 为适当维数的列向量。
基本函数形式为 linprog(c,A,b),它的返回值是向量 x 的值。还有其它的一些函数调用形式(在 Matlab 指令窗运行 help linprog 可以看到所有的函数调用形式),如:[x,fval]=linprog(c,A,b,Aeq,beq,LB,UB,X0,OPTIONS)
这里 fval 返回目标函数的值,LB 和 UB 分别是变量 x 的下界和上界, X0是 x 的初始值,OPTIONS 是控制参数。
三、例题
1)
题意为求Z的最大值,后面四个方程为x1,x2,x3的约束条件
matlab代码:
c=[2;3;-5];
a=[-2,5,-1;1,3,1]; b=[-10;12];
aeq=[1,1,1];
beq=7;
x=linprog(-c,a,b,aeq,beq,zeros(3,1))
value=c'*x
linprog中使用-c是因为求解问题为优化最大值,而linprog只优化最小值。
在matlab中运行结果(将代码粘到命令行窗口回车,或新建保存为m文件,再运行该m文件):
如图,当x1=6.4286,x2=0.5714,x3=0时,Z取得最大值14.5714
lingo代码:
model:
sets:
row/1..2/:b;
col/1..3/:c,x;
links(row,col):a;
endsets
data:
c=2 3 -5;
a=-2 5 -1 1 3 1;
b=-10 12;
enddata
max=@sum(col:c*x);
@for(row(i):@sum(col(j):a(i,j)*x(j))<b(i));
@sum(col:x)=7;
end
结果是一样的
2)
matlab代码:
c=[2;3;1];
a=[1,4,2;3,2,0];
b=[8;6];
[x,y]=linprog(c,-a,-b,[],[],zeros(3,1)) %这里没有等式约束,对应的矩阵为空矩阵
linprog中使用-a和-b是因为不等式为>=号,而linprog优化<=。
没有等式条件,也要用[ ]占位。
3)
先将模型转换为线性规划模型,令
则模型变为
matlab代码:
clc, clear
c=1:4; c=[c,c]'; %构造价值列向量
a=[1 -1 -1 1; 1 -1 1 -3; 1 -1 -2 3];
a=[a,-a]; %构造变换后新的系数矩阵
b=[-2 -1 -1/2]';
[y,z]=linprog(c,a,b,[],[],zeros(8,1)) %这里没有等式约束,对应的矩阵为空矩阵
x=y(1:4)-y(5:end) %变换到原问题的解,x=u-v
lingo代码:
model:
sets:
row/1..2/:b;
col/1..3/:c,x;
links(row,col):a;
endsets
data:
c=2 3 -5;
a=-2 5 -1 1 3 1;
b=-10 12;
enddata
max=@sum(col:c*x);
@for(row(i):@sum(col(j):a(i,j)*x(j))<b(i));
@sum(col:x)=7;
end