资源描述
Matlab与最优化应用
在生活和工作中,人们对于同一个问题往往会提出多个解决方案,并通过各方面的论证从中提取最佳方案。最优化方法就是专门研究如何从多个方案中科学合理地提取出最佳方案的科学。由于优化问题无所不在,目前最优化方法的应用和研究已经深入到了生产和科研的各个领域,如土木工程、机械工程、化学工程、运输调度、生产控制、经济规划、经济管理等,并取得了显著的经济效益和社会效益。
用最优化方法解决最优化问题的技术称为最优化技术,它包含两个方面的内容:
1) 建立数学模型 即用数学语言来描述最优化问题。模型中的数学关系式反映了最优化问题所要达到的目标和各种约束条件。
2) 数学求解 数学模型建好以后,选择合理的最优化方法进行求解。
最优化方法的发展很快,现在已经包含有多个分支,如线性规划、整数规划、非线性规划、动态规划、多目标规划等。
9.1 概 述
利用Matlab的优化工具箱,可以求解线性规划、非线性规划和多目标规划问题。具体而言,包括线性、非线性最小化,最大最小化,二次规划,半无限问题,线性、非线性方程(组)的求解,线性、非线性的最小二乘问题。另外,该工具箱还提供了线性、非线性最小化,方程求解,曲线拟合,二次规划等问题中大型课题的求解方法,为优化方法在工程中的实际应用提供了更方便快捷的途径。
9.1.1 优化工具箱中的函数
优化工具箱中的函数包括下面几类:
1.最小化函数
表9-1 最小化函数表
函 数
描 述
fgoalattain
多目标达到问题
fminbnd
有边界的标量非线性最小化
fmincon
有约束的非线性最小化
fminimax
最大最小化
fminsearch, fminunc
无约束非线性最小化
fseminf
半无限问题
linprog
线性课题
quadprog
二次课题
2.方程求解函数
表9-2 方程求解函数表
函 数
描 述
\
线性方程求解
fsolve
非线性方程求解
fzero
标量非线性方程求解
3.最小二乘(曲线拟合)函数
表9-3 最小二乘函数表
函 数
描 述
\
线性最小二乘
lsqlin
有约束线性最小二乘
lsqcurvefit
非线性曲线拟合
lsqnonlin
非线性最小二乘
lsqnonneg
非负线性最小二乘
4.实用函数
表9-4 实用函数表
函 数
描 述
optimset
设置参数
optimget
5.大型方法的演示函数
表9-5 大型方法的演示函数表
函 数
描 述
circustent
马戏团帐篷问题—二次课题
molecule
用无约束非线性最小化进行分子组成求解
optdeblur
用有边界线性最小二乘法进行图形处理
6.中型方法的演示函数
表9-6 中型方法的演示函数表
函 数
描 述
bandemo
香蕉函数的最小化
dfildemo
过滤器设计的有限精度
goaldemo
目标达到举例
optdemo
演示过程菜单
tutdemo
教程演示
9.1.3 参数设置
利用optimset函数,可以创建和编辑参数结构;利用optimget函数,可以获得options优化参数。
● optimget函数
功能:获得options优化参数。
语法:
val = optimget(options,'param')
val = optimget(options,'param',default)
描述:
val = optimget(options,'param') 返回优化参数options中指定的参数的值。只需要用参数开头的字母来定义参数就行了。
val = optimget(options,'param',default) 若options结构参数中没有定义指定参数,则返回缺省值。注意,这种形式的函数主要用于其它优化函数。
举例:
1. 下面的命令行将显示优化参数options返回到my_options结构中:
val = optimget(my_options,'Display')
2. 下面的命令行返回显示优化参数options到my_options结构中(就象前面的例子一样),但如果显示参数没有定义,则返回值'final':
optnew = optimget(my_options,'Display','final');
参见:
optimset
● optimset函数
功能:创建或编辑优化选项参数结构。
语法:
options = optimset('param1',value1,'param2',value2,...)
optimset
options = optimset
options = optimset(optimfun)
options = optimset(oldopts,'param1',value1,...)
options = optimset(oldopts,newopts)
描述:
options = optimset('param1',value1,'param2',value2,...) 创建一个称为options的优化选项参数,其中指定的参数具有指定值。所有未指定的参数都设置为空矩阵[](将参数设置为[]表示当options传递给优化函数时给参数赋缺省值)。赋值时只要输入参数前面的字母就行了。
optimset函数没有输入输出变量时,将显示一张完整的带有有效值的参数列表。
options = optimset (with no input arguments) 创建一个选项结构options,其中所有的元素被设置为[]。
options = optimset(optimfun) 创建一个含有所有参数名和与优化函数optimfun相关的缺省值的选项结构options。
options = optimset(oldopts,'param1',value1,...) 创建一个oldopts的拷贝,用指定的数值修改参数。
options = optimset(oldopts,newopts) 将已经存在的选项结构oldopts与新的选项结构newopts进行合并。newopts参数中的所有元素将覆盖oldopts参数中的所有对应元素。
举例:
1.下面的语句创建一个称为options的优化选项结构,其中显示参数设为'iter',TolFun参数设置为1e-8:
options = optimset('Display','iter','TolFun',1e-8)
2.下面的语句创建一个称为options的优化结构的拷贝,改变TolX参数的值,将新值保存到optnew参数中:
optnew = optimset(options,'TolX',1e-4);
3.下面的语句返回options优化结构,其中包含所有的参数名和与fminbnd函数相关的缺省值:
options = optimset('fminbnd')
4.若只希望看到fminbnd函数的缺省值,只需要简单地键入下面的语句就行了:
optimset fminbnd
或者输入下面的命令,其效果与上面的相同:
optimset('fminbnd')
参见:
optimget
9.1.4 模型输入时需要注意的问题
使用优化工具箱时,由于优化函数要求目标函数和约束条件满足一定的格式,所以需要用户在进行模型输入时注意以下几个问题:
1.目标函数最小化
优化函数fminbnd、fminsearch、fminunc、fmincon、fgoalattain、fminmax和lsqnonlin都要求目标函数最小化,如果优化问题要求目标函数最大化,可以通过使该目标函数的负值最小化即-f(x)最小化来实现。近似地,对于quadprog函数提供-H和-f,对于linprog函数提供-f。
2.约束非正
优化工具箱要求非线性不等式约束的形式为Ci(x)≤0,通过对不等式取负可以达到使大于零的约束形式变为小于零的不等式约束形式的目的,如Ci(x)≥0形式的约束等价于- Ci(x)≤0;Ci(x)≥b形式的约束等价于- Ci(x)+b≤0。
3.避免使用全局变量
9.1.5 @(函数句柄)函数
MATLAB6.0中可以用@函数进行函数调用。@函数返回指定MATLAB函数的句柄,其调用格式为:
handle = @function
利用@函数进行函数调用有下面几点好处:
● 用句柄将一个函数传递给另一个函数;
● 减少定义函数的文件个数;
● 改进重复操作;
● 保证函数计算的可靠性。
下面的例子为humps函数创建一个函数句柄,并将它指定为fhandle变量。
fhandle = @humps;
同样传递句柄给另一个函数,也将传递所有变量。本例将刚刚创建的函数句柄传递给fminbnd函数,然后在区间[0.3,1]上进行最小化。
x = fminbnd (@humps, 0.3, 1)
x =
0.6370
9.2 最小化问题
9.2.1 单变量最小化
9.2.1.1 基本数学原理
本节讨论只有一个变量时的最小化问题,即一维搜索问题。该问题在某些情况下可以直接用于求解实际问题,但大多数情况下它是作为多变量最优化方法的基础在应用,因为进行多变量最优化要用到一维搜索法。该问题的数学模型为:
其中,x,x1,和x2为标量,f(x)为函数,返回标量。
该问题的搜索过程可用下式表达:
其中xk为本次迭代的值,d为搜索方向,α为搜索方向上的步长参数。所以一维搜索就是要利用本次迭代的信息来构造下次迭代的条件。
求解单变量最优化问题的方法有很多种,根据目标函数是否需要求导,可以分为两类,即直接法和间接法。直接法不需要对目标函数进行求导,而间接法则需要用到目标函数的导数。
1.直接法
常用的一维直接法主要有消去法和近似法两种。
(1)消去法 该法利用单峰函数具有的消去性质进行反复迭代,逐渐消去不包含极小点的区间,缩小搜索区间,直到搜索区间缩小到给定的允许精度为止。一种典型的消去法为黄金分割法(Golden Section Search)。黄金分割法的基本思想是在单峰区间内适当插入两点,将区间分为三段,然后通过比较这两点函数值的大小来确定是删去最左段还是最右段,或同时删去左右两段保留中间段。重复该过程使区间无限缩小。插入点的位置放在区间的黄金分割点及其对称点上,所以该法称为黄金分割法。该法的优点是算法简单,效率较高,稳定性好。
(2)多项式近似法 该法用于目标函数比较复杂的情况。此时寻找一个与它近似的函数代替目标函数,并用近似函数的极小点作为原函数极小点的近似。常用的近似函数为二次和三次多项式。
二次内插涉及到形如下式的二次函数数据拟合问题:
其中步长极值为:
然后只要利用三个梯度或函数方程组就可以确定系数a和b,从而可以确定α*。得到该值以后,进行搜索区间的收缩。在缩短的新区间中,重新安排三点求出下一次的近似极小点α*,如此迭代下去,直到满足终止准则为止。其迭代公式为:
其中
二次插值法的计算速度比黄金分割法的快,但是对于一些强烈扭曲或可能多峰的函数,该法的收敛速度会变得很慢,甚至失败。
2.间接法
间接法需要计算目标函数的导数,优点是计算速度很快。常见的间接法包括牛顿切线法、对分法、割线法和三次插值多项式近似法等。优化工具箱中用得较多的是三次插值法。
三次插值的基本思想与二次插值的一致,它是用四个已知点构造一个三次多项式P3(x),用它逼近函数f(x),以P3(x)的极小点作为f(x)的近似极小点。一般讲,三次插值法比二次插值法的收敛速度要快些,但每次迭代需要计算两个导数值。
三次插值法的迭代公式为
其中
如果函数的导数容易求得,一般来说首先考虑使用三次插值法,因为它具有较高的效率。对于只需要计算函数值的方法中,二次插值法是一个很好的方法,它的收敛速度较快,尤其在极小点所在区间较小时尤其如此。黄金分割法则是一种十分稳定的方法,并且计算简单。由于以上原因,Matlab优化工具箱中使用得较多的方法是二次插值法、三次插值法、二次、三次混合插值法和黄金分割法。
9.2.1.2 相关函数介绍
fminbnd
功能:找到固定区间内单变量函数的最小值。
语法:
x = fminbnd(fun,x1,x2)
x = fminbnd(fun,x1,x2,options)
x = fminbnd(fun,x1,x2,options,P1,P2,...)
[x,fval] = fminbnd(...)
[x,fval,exitflag] = fminbnd(...)
[x,fval,exitflag,output] = fminbnd(...)
描述:
fminbnd求取固定区间内单变量函数的最小值。
x = fminbnd(fun,x1,x2)返回区间{x1,x2}上fun参数描述的标量函数的最小值x。
x = fminbnd(fun,x1,x2,options)用options参数指定的优化参数进行最小化。
x = fminbnd(fun,x1,x2,options,P1,P2,...)提供另外的参数P1,P2等,传输给目标函数fun。如果没有设置options选项,则令options=[]。
[x,fval] = fminbnd(...)返回解x处目标函数的值。
[x,fval,exitflag] = fminbnd(...)返回exitflag值描述fminbnd函数的退出条件。
[x,fval,exitflag,output] = fminbnd(...)返回包含优化信息的结构输出。
变量:
函数的输入变量在表9-7中进行描述,输出变量在表9-8中描述。与fminbnd函数相关的细节内容包含在fun,options,exitflag和output等参数中,如表9-10所示。
表9-10 参数描述表
参 数
描 述
fun
需要最小化的目标函数。fun函数需要输入标量参数x,返回x处的目标函数标量值f。可以将fun函数指定为命令行,如
x = fminbnd(inline('sin(x*x)'),x0)
同样,fun参数可以是一个包含函数名的字符串。对应的函数可以是M文件、内部函数或MEX文件。若fun='myfun',则M文件函数myfun.m必须右下面的形式。
function f = myfun(x)
f = ... %计算x处的函数值。
options
优化参数选项。你可以用optimset函数设置或改变这些参数的值。options参数有以下几个选项:
l ● Display – 显示的水平。选择'off',不显示输出;选择'iter',显示每一步迭代过程
l 的输出;选择'final',显示最终结果。
● MaxFunEvals – 函数评价的最大允许次数。
l MaxIter – 最大允许迭代次数。
l TolX –x处的终止容限。
exitflag
描述退出条件:
l >0 表示目标函数收敛于解x处。
l 0 表示已经达到函数评价或迭代的最大次数。
l <0 表示目标函数不收敛。
output
该参数包含下列优化信息:
l output.iterations – 迭代次数。
l output.algorithm – 所采用的算法。
l output.funcCount – 函数评价次数。
算法:
fminbnd是一个M文件。其算法基于黄金分割法和二次插值法。文献[1]中给出了实现同样算法的Fortran程序。
局限性:
1.目标函数必须是连续的。
2.fminbnd函数可能只给出局部最优解。
3.当问题的解位于区间边界上时,fminbnd函数的收敛速度常常很慢。此时,fmincon函数的计算速度更快,计算精度更高。
4.fminbnd函数只用于实数变量。
参见:
fminsearch, fmincon, fminunc, optimset, inline
文献:
[1] Forsythe, G.E., M.A. Malcolm, and C.B. Moler, Computer Methods for Mathematical Computations, Prentice Hall, 1976.
9.2.1.3 应用实例
[例一] 在区间(0,2π)上求函数sin(x)的最小值:
x = fminbnd(@sin,0,2*pi)
x =
4.7124
所以区间(0,2π)上函数sin(x)的最小值点位于x=4.7124处。
最小值处的函数值为:
y = sin(x)
y =
-1.0000
磁盘中该问题的M文件名为opt21_1.m。
[例三] 对边长为3m的正方形铁板,在四个角处剪去相等的正方形以制成方形无盖水槽,问如何剪法使水槽的容积最大?
假设剪去的正方形的边长为x,则水槽的容积为
现在要求在区间(0,1.5)上确定一个x,使 最大化。因为优化工具箱中要求目标函数最小化,所以需要对目标函数进行转换,即要求 最小化。
首先编写M文件opt21_3o.m:
function f = myfun(x)
f = -(3-2*x).^2 * x;
然后调用fminbnd函数(磁盘中M文件名为opt21_3.m):
x = fminbnd(@opt21_3o,0,1.5)
得到问题的解:
x =
0.5000
即剪掉的正方形的边长为0.5m时水槽的容积最大。
水槽的最大容积计算:
y = optim2(x)
y =
-2.0000
所以水槽的最大容积为2.0000m3。
9.2.2 线性规划
9.2.2.1 基本数学原理
线性规划是处理线性目标函数和线性约束的一种较为成熟的方法,目前已经广泛应用于军事、经济、工业、农业、教育、商业和社会科学等许多方面。线性规划问题的标准形式是:
或
写成矩阵形式为:
其中,0为n维列向量。
线性规划的标准形式要求目标函数最小化,约束条件取等式,变量非负。不符合这几个条件的线性模型要首先转化成标准形。
线性规划的求解方法主要是单纯形法(Simple Method),该法由Dantzig于1947年提出,以后经过多次改进。单纯形法是一种迭代算法,它从所有基本可行解的一个较小部分中通过迭代过程选出最优解。其迭代过程的一般描述为:
1. 将线性规划化为典范形式,从而可以得到一个初始基本可行解x(0)(初始顶点),将它作为迭代过程的出发点,其目标值为z(x(0))。
2. 寻找一个基本可行解x(1),使z(x(1))≤z(x(0))。方法是通过消去法将产生x(0)的典范形式化为产生x(1)的典范形式。
3. 继续寻找较好的基本可行解x(2),x(3),…,使目标函数值不断改进,即z(x(1))≥z(x(2)) ≥z(x(3)) ≥…。当某个基本可行解再也不能被其它基本可行解改进时,它就是所求的最优解。
Matlab优化工具箱中采用的是投影法,它是单纯形法的一种变种。
9.2.2.2 相关函数介绍
linprog函数
功能:求解线性规划问题。
数学模型:
其中f, x, b, beq, lb和ub为向量,A 和Aeq为矩阵。
语法:
x = linprog(f,A,b,Aeq,beq)
x = linprog(f,A,b,Aeq,beq,lb,ub)
x = linprog(f,A,b,Aeq,beq,lb,ub,x0)
x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options)
[x,fval] = linprog(...)
[x,fval,exitflag] = linprog(...)
[x,fval,exitflag,output] = linprog(...)
[x,fval,exitflag,output,lambda] = linprog(...)
描述:
x = linprog(f,A,b)求解问题 min f'*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参数
lambda参数是解x处的拉格朗日乘子。它有以下一些属性:
l lambda.lower –lambda的下界。
l lambda.upper –lambda的上界。
l lambda.ineqlin –lambda的线性不等式。
l lambda.eqlin –lambda的线性等式。
其它参数意义同前。
算法:
大型优化算法 大型优化算法采用的是LIPSOL法,该法在进行迭代计算之前首先要进行一系列的预处理。
中型优化算法 linprog函数使用的是投影法,就象quadprog函数的算法一样。linprog函数使用的是一种活动集方法,是线性规划中单纯形法的变种。它通过求解另一个线性规划问题来找到初始可行解。
诊断:
大型优化问题 算法的第一步涉及到一些约束条件的预处理问题。有些问题可能导致linprog函数退出,并显示不可行的信息。在本例中,exitflag参数将被设为负值以表示优化失败。
若Aeq参数中某行的所有元素都为零,但Beq参数中对应的元素不为零,则显示以下退出信息:
Exiting due to infeasibility: an all zero row in the constraint matrix does not have a zero in corresponding right hand size entry.
若x的某一个元素没在界内,则给出以下退出信息:
Exiting due to infeasibility: objective f'*x is unbounded below.
若Aeq参数的某一行中只有一个非零值,则x中的相关值称为奇异变量。这里,x中该成分的值可以用Aeq和Beq算得。若算得的值与另一个约束条件相矛盾,则给出以下退出信息:
Exiting due to infeasibility: Singleton variables in equality constraints are not feasible.
若奇异变量可以求解但其解超出上界或下界,则给出以下退出信息:
Exiting due to infeasibility: singleton variables in the equality constraints are not within bounds.
9.2.2.3 应用实例
[ [例二] 生产决策问题
某厂生产甲乙两种产品,已知制成一吨产品甲需用资源A 3吨,资源B 4m3;制成一吨产品乙需用资源A 2吨,资源B 6m3,资源C 7个单位。若一吨产品甲和乙的经济价值分别为7万元和5万元,三种资源的限制量分别为90吨、200m3和210个单位,试决定应生产这两种产品各多少吨才能使创造的总经济价值最高?
令生产产品甲的数量为x1,生产产品乙的数量为x2。由题意可以建立下面的模型:
该模型中要求目标函数最大化,需要按照Matlab的要求进行转换,即目标函数为
首先输入下列系数:
f = [-7;-5];
A = [3 2
4 6
0 7];
b = [90; 200; 210];
lb = zeros(2,1);
然后调用linprog函数:
[x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb)
x =
14.0000
24.0000
fval =
-218.0000
exitflag =
1
output =
iterations: 5
cgiterations: 0
algorithm: 'lipsol'
lambda =
ineqlin: [3x1 double]
eqlin: [0x1 double]
upper: [2x1 double]
lower: [2x1 double]
由上可知,生产甲种产品14吨、乙种产品24吨可使创建的总经济价值最高。最高经济价值为218万元。exitflag=1表示过程正常收敛于解x处。
磁盘中本问题的M文件为opt22_2.m。
[例三] 投资问题
某单位有一批资金用于四个工程项目的投资,用于各工程项目时所得到得净收益(投入资金的百分比)如下表所示:
表9-11 工程项目收益表
工 程 项 目
A
B
C
D
收益(%)
15
10
8
12
由于某种原因,决定用于项目A的投资不大于其它各项投资之和;而用于项目B和C的投资要大于项目D的投资。试确定使该单位收益最大的投资分配方案。
用x1、x2、x3和x4分别代表用于项目A、B、C和D的投资百分数,由于各项目的投资百分数之和必须等于100%,所以
x1+x2+x3+x4=1
据题意,可以建立下面的数学模型:
将它转换为标准形式:
然后进行求解:
首先输入下列系数:
f = [-0.15;-0.1;-0.08;-0.12];
A = [1 -1 -1 -1
0 -1 -1 1];
b = [0; 0];
Aeq=[1 1 1 1];
beq=[1];
lb = zeros(4,1);
然后调用linprog函数:
[x,fval,exitflag,output,lambda] = linprog(f,A,b,Aeq,beq,lb);
x =
0.5000
0.2500
0.0000
0.2500
fval =
-0.1300
exitflag =
1
可见,四个项目的投资百分数分别为0.50、0.25、0.00和0.25时可使该单位获得最大的收益。最大收益为13%。过程正常收敛。
磁盘中本问题的M文件为opt22_3.m。
[例四] 工件加工任务分配问题
某车间有两台机床甲和乙,可用于加工三种工件。假定这两台机床的可用台时数分别为700和800,三种工件的数量分别为300、500和400,且已知用三种不同机床加工单位数量的不同工件所需的台时数和加工费用(如表 所示),问怎样分配机床的加工任务,才能既满足加工工件的要求,又使总加工费用最低?
表9-12 机床加工情况表
机床类型
单位工作所需加工台时数
单位工件的加工费用
可用
台时数
工件1
工件2
工件3
工件1
工件2
工件3
甲
0.4
1.1
1.0
13
9
10
700
乙
0.5
1.2
1.3
11
12
8
800
设在甲机床上加工工件1、2和3的数量分别为x1、x2和x3,在乙机床上加工工件1、2和3的数量分别为x4、x5和x6。根据三种工种的数量限制,有
x1+x4=300 (对工件1)
x2+x5=500 (对工件2)
x3+x6=400 (对工件3)
再根据机床甲和乙的可用总台时限制,可以得到其它约束条件。以总加工费用最少为目标函数,组合约束条件,可以得到下面的数学模型:
首先输入下列系数:
f = [13;9;10;11;12;8];
A = [0.4 1.1 1 0 0 0
0 0 0 0.5 1.2 1.3];
b = [700; 800];
Aeq=[1 0 0 1 0 0
0 1 0 0 1 0
0 0 1 0 0 1];
beq=[300 500 400];
lb = zeros(6,1);
然后调用linprog函数:
[x,fval,exitflag,output,lambda] = linprog(f,A,b,Aeq,beq,lb);
x =
0.0000
500.0000
0.0000
300.0000
0.0000
400.0000
fval =
1.1000e+004
exitflag =
1
可见,在甲机床上加工500个工件2,在乙机床上加工300个工件1、加工400个工件3可在满足条件的情况下使总加工费最小。最小费用为11000元。收敛正常。
磁盘中本问题的M文件为opt22_4.m。
[例五] 裁料问题
在某建筑工程施工中需要制作10000套钢筋,每套钢筋由2.9m、2.1m和1.5m三种不同长度的钢筋各一根组成,它们的直径和材质不同。目前在市场上采购到的同类钢筋的长度每根均为7.4m,问应购进多少根7.4m长的钢筋才能满足工程的需要?
首先分析共有多少种不同的套裁方法,该问题的可能材料方案如表9-13所示。
表9-13 材料方案表
下料长度
(m)
裁 料 方 案 编 号 i
1
2
3
4
5
6
7
8
2.9
2
1
1
1
0
0
0
0
2.1
0
2
1
0
3
2
1
0
1.5
1
0
1
3
0
2
3
4
料头长度
(m)
0.1
0.3
0.9
0
1.1
0.2
0.8
1.4
设以xi(i=1,2,…,8)表示按第i种裁料方案下料的原材料数量,则可得该问题的数学模型为:
首先输入下列系数:
f = [1;1;1;1;1;1;1;1];
Aeq=[2 0 0 0 0 0 0 0
0 2 1 0 3 2 1 0
1 0 1 3 0 2 3 4];
beq=[10000 10000 10000];
lb = zeros(8,1);
然后调用linprog函数:
[x,fval,exitflag,output,lambda] = linprog(f,[],[],Aeq,beq,lb);
x =
1.0e+003 *
5.0000
0.0000
0.0000
0.0000
1.6667
2.5000
0.0000
0.0000
fval =
9.1667e+003
所以最节省的情况需要9167根7.4m长的钢筋,其中第一种方案使用5000根,第五种方案使用1667根,第六种方案使用2500根。
磁盘中本问题的M文件为opt22_5.m。
[例六] 工作人员计划安排问题
某昼夜服务的公共交通系统每天各时间段(每4小时为一个时间段)所需的值班人数如表 所示,这些值班人员在某一时段开始上班后要连续工作8个小时(包括轮流用膳时间),问该公交系统至少需要多少名工作人员才能满足值班的需要?
表9-14 各时段所需值班人数表
班 次
时 间 段
所 需 人 数
1
6:00—10:00
60
2
10:00—14:00
70
3
14:00—18:00
60
4
18:00—22:00
50
5
22:00—2:00
20
6
2:00—6:00
30
设xi为第i个时段开始上班的人员数,据题意建立下面的数学模型:
需要对前面六个约束条件进行形式变换,是不等式为非正不等式。只需要在不等式两侧取负即可。
首先输入下列系数:
f = [1;1;1;1;1;1];
A=[-1 0 0 0 0 -1
-1 -1 0 0 0 0
0 -1 -1 0 0 0
0 0 -1 -1 0 0
0 0 0 -1 -1 0
0 0 0 0 -1 -1];
b=[-60;-70;-60;-50;-20;-30];
lb = zeros(6,1);
然后调用linprog函数:
[x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb);
x =
41.9176
28.0824
35.0494
14.9506
9.8606
20.1394
fval =
150.0000
exitflag =
1
可见,只要六个时段分别安排42人、28人、35人、15人、10人和20人就可以满足
展开阅读全文