1、8.2 线性规划线性规划是处理线性目标函数和线性约束的一种较为成熟的方法,目前已经广泛应用于军事、经济、工业、农业、教育、商业和社会科学等许多方面。8.2.1 基本数学原理线性规划问题的标准形式是: 0,min2122212 1nmmnxbaxaxcxcz 或 njxibaczjnjjijj,21,0,11 写成矩阵形式为: OXbACzmi线性规划的标准形式要求使目标函数最小化,约束条件取等式,变量 非负。不符合b这几个条件的线性模型可以转化成标准形式。MATLAB 采用投影法求解线性规划问题,该方法是单纯形法的变种。8.2.2 有关函数介绍在 MATLAB 工具箱中,可用 linprog
2、函数求解线性规划问题。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=
3、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 处包含拉
4、格朗日乘子的结构。它有以下一些字段:lower下界 lbupper上界 ubineqlin线性不等式eqlin线性等式exitflag 参数表示算法终止的原因,下面列出不同值对应的退出原因:1 函数在解 x 处有解0 迭代次数超过 options.MaxIter-2 没有找到可行点-3 问题无解-4 执行算法时遇到 NaN-5 原问题和对偶问题都不可行-7 搜索方向太小,不能继续前进。8.2.3 应用实例例 82 某河流边有两个化工厂,流经第一个化工厂的河水流量是每天 500 万立方米,在两个工厂之间有一条流量为 200 万立方米的支流(如图 81 所示) 。第一个化工厂每天排放工业污水 2
5、万立方米,第二个化工厂每天排放工业污水 1.4 万立方米,从第一个化工厂排出的污水流到第二个化工厂之前,有 20%可自然净化。根据环保要求,河流中工业污水的含量应不大于 0.2%,因此两个化工厂都必须各自处理净化一部分污水,第一个化工厂处理污水的成本是 0.1 元立方米,第二个化工厂处理污水的成本是 0.08 元立方米。问在满足环保要求的条件下,各化工厂每天应处理多少污水,才能使两厂总的处理污水费用最少?第一化工厂 第二化工厂图 81解:设 , 分别表示第一个化工厂和第二个化工厂每天处理的污水量(万立方米1x2天) 。则目标函数: (元天)210xf约束条件 1: ,即 ;%.51约束条件 2
6、: ,即 ;.70)4()(8.216.18.021x约束条件 3: 。.2x因此,该问题的线性规划模型归结为: 2180minxf0,4.126.8.21xxts求解程序:%线性规划问题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.00000.8000fval =1.6400e+003exitflag =1由上可知,第一个化工厂每天处理的污水量为 1 万立方米天,第二个化工厂每天处理的污水量为 0.8 万立方米天,才能使两厂总的处理污水费用最少。