运用Matlab进行线性规划求解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
线性规划是处理线性目标函数和线性约束的一种较为成熟的方法,目前已经广泛应用于军事、经济、工业、农业、教育、商业和社会科学等许多方面。
8.2.1 基本数学原理
线性规划问题的标准形式是:
⎪⎪⎪⎪⎩
⎪⎪⎪⎪⎨⎧≥=+++=+++=++++++=0,,,min 21221122222121112
121112211n m n mn m m n n n n n n x x x b x a x a x a b x a x a x a b x a x a x a x c x c x c z ΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛΛ 或
⎪⎪⎪⎩
⎪⎪⎪⎨⎧=≥===∑∑==n j x m i b x a x c z j n j i j ij n j j
j ,,2,1,0,,2,1,min 1
1ΛΛ
写成矩阵形式为:
⎪⎩
⎪⎨⎧≥==O X b AX CX z min
线性规划的标准形式要求使目标函数最小化,约束条件取等式,变量b 非负。不符合这几个条件的线性模型可以转化成标准形式。
MATLAB 采用投影法求解线性规划问题,该方法是单纯形法的变种。
8.2.2 有关函数介绍
在MATLAB 工具箱中,可用linprog 函数求解线性规划问题。
linprog 函数的调用格式如下:
●x=linprog(f,A,b):求解问题minf'*x ,约束条件为A*x<=b 。
●x=linprog(f,A,b,Aeq,beq):求解上面的问题,但增加等式约束,即Aeq*x=beq 。若没有不等式约束,则令A=[ ],b=[ ]。
●x=linprog(f,A,b,Aeq,beq,lb,ub):定义设计x 的下界lb 和上界ub ,使得x 始终在该范围内。若没有等式约束,令Aeq=[ ],beq=[ ]。
●x=linprog(f,A,b,Aeq,beq,lb,ub,x0):设置初值为x0。该选项只适用于中型问题,默认时大型算法将忽略初值。
●x=linprog(f,A,b,Aeq,beq,lb,ub,x0,options):用options 指定的优化参数进行最小化。
●[x,fval]=linprog(…):返回解x 处的目标函数值fval 。
●[x,lambda,exitflag]=linprog(…):返回exitflag 值,描述函数计算的退出条件。 ●[x,lambda,exitflag,output]=linprog(…):返回包含优化信息的输出参数output 。 ●[x,fval,exitflag,output,lambda]=linprog(…):将解x 处的拉格朗日乘子返回到lambda 参数中。
调用格式中,lambda 参数为解x 处包含拉格朗日乘子的结构。它有以下一些字段:
lower —下界lb
upper —上界ub
ineqlin —线性不等式
eqlin —线性等式
exitflag 参数表示算法终止的原因,下面列出不同值对应的退出原因:
1 函数在解x 处有解
0 迭代次数超过
-2 没有找到可行点
-3 问题无解
-4 执行算法时遇到NaN
-5 原问题和对偶问题都不可行
-7 搜索方向太小,不能继续前进。
8.2.3 应用实例
例8-2 某河流边有两个化工厂,流经第一个化工厂的河水流量是每天500万立方米,在两个工厂之间有一条流量为200万立方米的支流(如图8-1所示)。第一个化工厂每天排放工业污水2万立方米,第二个化工厂每天排放工业污水万立方米,从第一个化工厂排出的污水流到第二个化工厂之前,有20%可自然净化。根据环保要求,河流中工业污水的含量应不大于%,因此两个化工厂都必须各自处理净化一部分污水,第一个化工厂处理污水的成本是元∕立方米,第二个化工厂处理污水的成本是元∕立方米。问在满足环保要求的条件下,各化工厂每天应处理多少污水,才能使两厂总的处理污水费用最少?
第一化工厂 第二化工厂
图8-1
解:设1x ,2x 分别表示第一个化工厂和第二个化工厂每天处理的污水量(万立方米∕天)。
则目标函数:218001000x x f +=(元∕天)
约束条件1:
%2.0500
21≤-x ,即11≥x ; 约束条件2:%2.0700
)4.1()2(8.021≤-+-x x ,即6.18.021≥+x x ; 约束条件3:⎩⎨⎧≤≤4.1221x x 。 因此,该问题的线性规划模型归结为:
218001000m in x x f +=
⎪⎪⎪⎩
⎪⎪⎪⎨⎧≥≤≤-≤---≤-0,4.12
6.18.01..2121211x x x x x x x t s 求解程序:
%线性规划问题
f=[1000 800];
A=[-1 0; -1;1 0;0 1];
b=[-1;;2;];
lb=zeros(2,1);
[x,fval,exitflag]=linprog(f,A,b,[],[],lb)
运行结果:
x =
fval =+003
exitflag =1
由上可知,第一个化工厂每天处理的污水量为1万立方米∕天,第二个化工厂每天处理的污水量为万立方米∕天,才能使两厂总的处理污水费用最少。