当前位置:文档之家› Matlab在线性规划中的使用

Matlab在线性规划中的使用

⒈ 优化问题及其数学模型
假设有一个问题,它有几个因素来决定,当这些因素处于某个状态时,可以使问题得到我们最想要的结果。

优化问题就是寻求这个状态的过程。

例如:
某工厂生产A ,B 两种产品,所用原料均为甲、乙、丙三种;生产一件产品所需原料和
问题:在该厂只有库存原料甲380单位,原料乙300单位,原料丙220单位的情况下如何安排A ,B 两种产品的生产数量可以获得最大的利润?
设生产A 中产品1x 件,生产B 中产品2x 件,z 为所获得的利润,于是有关系式: 我们称它为目标函数。

生产的条件我们可以表示为: 我们把上面的不等式称为约束条件。

产品A 的产量1x 和B 的产量2x 是优化问题的变量。

在满足约束条件的前提下使目标函数得到最优的值成为最优解。

根据以上定义,也可以说优化运算是通过某种计算寻求最优解的过程。

以上这个用等式或不等式来表达我们要解决的问题的过程就是优化问题的建模过程。

我们平时遇到的问题常常不是上面的这几个数学表达式就能表达得清清楚楚的,但是建立像上面类似的数学模型却是优化求解的第一步。

优化问题常常表现为在多约束条件下求某一函数的极值问题,例如上面的这个例子。

Matlab 有一个优化工具箱,可以帮助我们方便的解决好这类问题。

⒉ 优化工具箱
Matlab 的优化工具箱有一些对普通非线性函数求解最小化或最大化(求极值)的函数组成,另外还包括一些解决诸如线性规划等标准矩阵问题的函数。

所有的优化函数都是用Matlab 语言编写的m 文件,我们可以通过在命令窗口里输入type function_name 来查看这些函数。

优化工具箱的优化功能包括: ⑴ 求无约束非线性最小化; ⑵ 求有约束非线性最小化; ⑶ 二次和线性规划问题;
⑷ 非线性最小二乘法和曲线拟合问题; ⑸ 非线性等式的求解; ⑹ 约束线性最小二乘法; ⑺ 稀疏和结构化大尺度问题。

工具箱中求非线性函数极小值的命令函数如下表所示:
上面表中函数可以对标量、向量和矩阵进行运算;我们一般用大写字母表示矩阵,用小写字母表示向量和标量。

在Matlab 中用符号“*”表示矩阵的元素乘。

当然,上述运算是在定义好了一个最小化函数的前提下进行的,也就是说要先建立数学模型。

注:Matlab 自身提供了一个优化演示示例,其命令为optdemo 。

⒊ 线性规划问题
前面6-1中所举的例子就是一个典型的线性规划问题。

线性规划数学模型的特点是:在线性不等式或线性等式的约束条件下,求能满足目标函数取得最大值或最小值的一组变量的值,目标函数也要求是线性函数。

命令:linprog
格式:X= linprog(f,A,b)
[X,fval,exitflag,output,lambda]=linprog(f,A,b,Aeq,Beq,LB,UB,X0,options) 功能:计算使目标函数)(x f 取得最小值的一组变量的值。

说明:这里f 为由目标函数的系数组成的向量。

A 是一个矩阵,b 是一个向量,A 和b 构成了线性规划的不等式约束条件b x A i ≤⋅。

X 是一个向量,为返回的满足目标函数取得极小值的一组变量的值。

Aeq 是一个矩阵,Beq 是一个向量,Aeq 和Beq 构成了线性规划的等式约束条件Beq x Aeq i =⋅。

LB 和UB 分别是变量的下界和上界约束。

X0是给出的变量的初始值。

Exitflag 、output 、lambda 的意义我们放在后面的示例中给出解释。

注:如果要计算的是使目标函数)(x f 取得最大值的情况,则通过转化为计算)(x f -的最小值的办法来实现。

例6-1 对前面6-1中所举的例子进行线性规划问题的计算。

分析:① 优化的目标为使函数21100007000)(x x x f +=取得最大值,也就是使函数21100007000)(x x x f --=-取得最小值,故线性规划目标函数的系数组成的向量为
[7000,10000]f =-;
② 约束条件为三个不等式:22064,30084,38068212121≤+≤+≤+x x x x x x ,所以由不等式约束条件的系数构成的矩阵为:A=[8,6;4,8;4,6],而b=[380,300,220]。

程序:
clear
f=-[7000,10000]; A=[8,6;4,8;4,6]; b=[380,300,220]; [X,fval]=linprog(f,A,b)
运行结果:
Optimization terminated. X =
40.0000 10.0000 fval =
-3.8000e+005
注:① 优化的结果,目标函数值fval = -3.8000e+005,由于我们的目标函数是-f(x),所以最后应该是maxf(x)=3.8000e+005。

② 在优化问题中,涉及到优化结果只能取整数值的情况时,如果我们对优化结果随意的进行取整,可能导致最后结果不是最优,这一点需要注意。

例2 中国石油天然气集团公司天然气的运送案例分析
中国石油天然气集团公司在东海有一个油气田(节点s v ),该公司要将开采的天然气通过管道运送到上海的一个配送中心(节点t v ),天然气在运送途中要经过两次管道换接点(节点B 和C ),换接前后管道长短不一,而且不同的管道对应不同的单位流量运费。

如图,天然气运送的管道网络图,弧线表示管道,弧旁的数字为(ij b ,ij c ),其中ij b 表示管道上的单位流量费用,ij c 表示管道上的容量。

公司希望选择一个经济实惠的管道路线运送天然气,既运送最多的天然气又使总的运输费用最少。

这是一个最小费用最大流问题。

为了建立该问题的数学模型,首先设每段管道上的流量作为问题的决策变量,分别记为987654321,,,,,,,,x x x x x x x x x ,称分段流量。

从始点s v 处,可得流量函数21x x f +=, 且有约束条件:(1)9,2,11,0 =≥i x ;
(2)2,5,3,2,1,3,1,5,4987654321≤≤≤≤≤≤≤≤≤x x x x x x x x x ;
(3)
000
97568746325431=---=-+=-+=+--x x x x x x x x x x x x x x ;
一方面要使流量最大,另一方面要是费用最小。

所以分两部分计算,先求出最大流,再求最小费用最大流。

对应matlab 程序如下:
clear
f=-[1,1,0,0,0,0,0,0,0]; aeq=[1,0,-1,-1,1,0,0,0,0; 0,1,1,0,0,-1,0,0,0; 0,0,0,1,0,0,1,-1,0; 0,0,0,0,-1,1,-1,0,-1]; beq=zeros(4,1); lb=zeros(9,1);
ub=[4;5;1;3;1;2;3;5;2];
[x,fval]=linprog(f,[],[],aeq,beq,lb,ub) %求出最大流
f1=[1,3,1,3,2,4,1,2,4]; aeq1=[ 1,1,0,0,0,0,0,0,0; 1,0,-1,-1,1,0,0,0,0; 0,1,1,0,0,-1,0,0,0; 0,0,0,1,0,0,1,-1,0; 0,0,0,0,-1,1,-1,0,-1]; beq1=[-fval;beq];
[z,fvall]=linprog(f1,[],[],aeq1,beq1,lb,ub)
程序执行后,结果为:
z =
4.0000 1.0000 1.0000 3.0000 0.0000 2.0000 2.0000
5.0000 0.0000 fvall =
37.0000 练习:
某快餐店一周中每天需要不同数目的雇员,设周一至少1a 人,周二至少2a 人,周三至
少3a 人,周四至少4a 人,周五至少5a 人,周六至少6a 人,周日至少7a 人,又规定雇员需连续工作5天,每人每天的工资为C 元。

问快餐店怎样聘用雇员才能满足需求,又能使总聘用费用最少。

提示:由于每个雇员需连续工作5天,故快餐店聘用的总人数不一定是每天聘用人数之和。

我们定义周一开始工作的雇员数为1x ,周日开始工作的雇员数为7x ,则一周的聘用总费用为:)(7654321x x x x x x x C z ++++++=,由于除了周二和周三开始工作的雇员之外,其余的雇员都会在周一工作,所以周一至少应有1a 人的约束应表示为: 类似地可以得出其他的约束条件。

现给定100=C 元,161=a 人,2a =15人,3a =16人,4a =19人,5a =14人,6a =12人,7a =18人,请给出问题的数学模型,并用matlab 求解。

相关主题