资源描述
8.2 线性规划
线性规划是处理线性目标函数和线性约束的一种较为成熟的方法,目前已经广泛应用于军事、经济、工业、农业、教育、商业和社会科学等许多方面。
8.2.1 基本数学原理
线性规划问题的标准形式是:
或
写成矩阵形式为:
线性规划的标准形式要求使目标函数最小化,约束条件取等式,变量非负。不符合这几个条件的线性模型可以转化成标准形式。
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 迭代次数超过options.MaxIter
-2 没有找到可行点
-3 问题无解
-4 执行算法时遇到NaN
-5 原问题和对偶问题都不可行
-7 搜索方向太小,不能继续前进。
8.2.3 应用实例
例8-2 某河流边有两个化工厂,流经第一个化工厂的河水流量是每天500万立方米,在两个工厂之间有一条流量为200万立方米的支流(如图8-1所示)。第一个化工厂每天排放工业污水2万立方米,第二个化工厂每天排放工业污水1.4万立方米,从第一个化工厂排出的污水流到第二个化工厂之前,有20%可自然净化。根据环保要求,河流中工业污水的含量应不大于0.2%,因此两个化工厂都必须各自处理净化一部分污水,第一个化工厂处理污水的成本是0.1元∕立方米,第二个化工厂处理污水的成本是0.08元∕立方米。问在满足环保要求的条件下,各化工厂每天应处理多少污水,才能使两厂总的处理污水费用最少?
第一化工厂 第二化工厂
图8-1
解:设,分别表示第一个化工厂和第二个化工厂每天处理的污水量(万立方米∕天)。
则目标函数:(元∕天)
约束条件1:,即;
约束条件2:,即;
约束条件3:。
因此,该问题的线性规划模型归结为:
求解程序:
%线性规划问题
f=[1000 800];
A=[-1 0;-0.8 -1;1 0;0 1];
b=[-1;-1.6;2;1.4];
lb=zeros(2,1);
[x,fval,exitflag]=linprog(f,A,b,[],[],lb)
运行结果:
x =
1.0000
0.8000
fval =1.6400e+003
exitflag =1
由上可知,第一个化工厂每天处理的污水量为1万立方米∕天,第二个化工厂每天处理的污水量为0.8万立方米∕天,才能使两厂总的处理污水费用最少。
展开阅读全文