本节选择几个生产计划的优化实例,说明如何建立这类问题的线性规划模型,利用软件求解并对输出结果做一些分析.
一、奶制品加工的生产计划
一奶制品加工厂用牛奶生产A1,A2两种奶制品,1桶牛奶可以在甲类设备上用12 h加工成3 kg A1奶制品,或者在乙类设备上用8 h加工成4 kg A2奶制品.根据市场需求,生产的A1,A2两种奶制品全部能售出,且每千克A1获利24元,每千克A2获利16元.现在加工厂每天能得到50桶牛奶的供应,每天正式工人总的劳动时间为480 h,并且甲类设备每天至多能加工100 kg A1奶制品;乙类设备的加工能力没有限制.试为该厂制订一个生产计划,使每天获利最大,并进一步讨论以下三个附加问题:
(1)若用35元可以买到1桶牛奶,应否作这项投资?若投资,每天最多购买多少桶牛奶?
(2)若可以聘用临时工人以增加劳动时间,付给临时工人的工资最多是每小时几元?
(3)由于市场需求变化,每千克A1的获利增加到30元,应否改变生产计划[1]?
【问题分析】
这个优化问题的目标是使每天的获利最大,要做的决策是生产计划,即每天用多少桶牛奶生产A1,用多少桶牛奶生产A2(也可以是每天生产多少千克A1,生产多少千克A2),决策受到三个条件的限制:原料(牛奶)供应、劳动时间、甲类设备的加工能力.依题意,将决策变量、目标函数和约束条件用数学符号及式子表示出来,就可得到下面的模型.
【基本模型】
决策变量:设每天用x1桶牛奶生产A1,用x2桶牛奶生产A2.
目标函数:设每天获利为z元.x1桶牛奶可生产3x1 kg A1,获利24×3x1元,x2桶牛奶可生产4x2 kg A2,获利16×4x2元,故z=72x1+64x2.
约束条件:
原料供应:生产A1,A2的原料(牛奶)总量不得超过每天的供应,即x1+x2≤50;
劳动时间:生产A1,A2的总加工时间不得超过每天正式工人总的劳动时间,即12x1+8x2≤480;
设备能力:A1的产量不得超过甲类设备每天的加工能力,即3x1≤100;
非负约束:x1,x2均不能为负值,即x1≥0,x2≥0.
综上可得
这就是该问题的基本模型.由于目标函数和约束条件对于决策变量而言都是线性的,所以称为线性规划(Linear Programming,简记作LP).
【模型假设】
对于本例,能建立上面的线性规划模型,实际上是事先做了如下的假设:
(1)A1,A2两种奶制品每千克的获利是与它们各自产量无关的常数,每桶牛奶加工出A1,A2的数量和所需的时间是与它们各自的产量无关的常数;
(2)A1,A2每千克的获利是与它们相互间产量无关的常数,每桶牛奶加工出A1,A2的数量和所需的时间是与它们相互间产量无关的常数;
(3)加工A1,A2的牛奶的桶数可以是任意实数.
当然,在现实生活中这些假设只是近似成立的,比如,A1,A2的产量很大时,自然会使它们每千克的获利有所减少.
由于这些假设对于书中给出的、经过简化的实际问题是如此明显地成立,本章下面的例题就不再一一列出类似的假设了.
【模型求解】
图解法 这个线性规划模型的决策变量为2维,用图解法既简单,又便于直观地把握线性规划的基本性质.但图解法很难在决策变量超过3维或者约束条件过多时应用,具有很大的局限性.这里不再赘述.
【软件实现】
求解线性规划有不少现成的数学软件,比如用LINDO、LINGO软件就可以很方便地实现.其中LINDO可以很方便地求解小规模(指决策变量维数不高、约束条件不多)的线性规划,具有语法简单易学的优点;LINGO则可以解决更加复杂的线性规划和非线性规划问题以及解方程组和不等式组问题,详见软件篇第一章LINGO编程入门.
在LINGO下新建一个模型文件(即LINGO程序,一般以“LG4”为后缀名),像书写模型(5.1.1)~(5.1.5)一样,直接输入:
注:LINGO程序总是以“model:”开始,最后以“end”结束(也可以省略不写);字母不区分大小写;每个语句都必须以分号“;”结束(注意必须是英文的分号).LINGO中已规定所有决策变量均为非负,故(5.1.5)式不必输入;模型中符号≤、≥用“<=”、“>=”形式输入,它们与“<”、“>”等效.输入模型中第1行为目标函数,2~4行是约束条件(LINGO会自动用数字按顺序对约束条件命名).
将文件存储并命名后,选择菜单“LINGO|Solve”执行或点击工具栏图标,即可得到如下输出:
上面结果的前4行告诉我们,LINGO求出了模型的全局最优解(Global optimal solution),最优值为3360(即最大利润为3360元),矛盾约束的数目(Infeasibilities)为0,迭代次数为2次.接下来的3行告诉我们,这个线性规划的最优解为x1=20,x2=30(用20桶牛奶生产A1,用30桶牛奶生产A2).对其中“Reduced Cost”含义的解释,将在“二.奶制品的生产销售计划”中结合问题(3)的讨论进行说明.
【结果分析】
上面的输出中除了告诉我们问题的最优解和最优值以外,还有许多对分析结果有用的信息,下面结合题目中提出的三个附加问题给予说明.
(1)三个约束条件的右端不妨看作三种“资源”:原料、劳动时间、甲类设备的加工能力.输出的第9~12行Slack or Surplus给出了三种“资源”是否有剩余:原料、劳动时间的剩余均为0,甲类设备尚余40 kg加工能力.这表明原料、劳动时间已耗尽,而甲类设备的能力有余.一般称“资源”剩余为0的约束为紧约束(有效约束).
(2)目标函数可以看作“效益”,成为紧约束的“资源”一旦增加,“效益”必然跟着增长.输出第9~12行Dual Price给出这三种资源在最优解下“资源”增加1个单位时“效益”的增量:原料增加1个单位(1桶牛奶)时利润增长48元,劳动时间增加1个单位(1 h)时利润增长2元,而增加非紧约束甲类设备的能力显然不会使利润增长.这里,“效益”的增量可以看作“资源”的潜在价值,经济学上称为影子价格(对偶价格),即1桶牛奶的影子价格为48元,1 h劳动的影子价格为2元,甲类设备的影子价格为0.
读者可以用直接求解的办法验证上面的结论,即将输入文件中原料约束右端的50改为51,看看得到的最优值(利润)是否恰好增长48元.
用影子价格的概念很容易回答附加问题(1):用35元可以买到1桶牛奶,低于1桶牛奶的影子价格,当然应该做这项投资.类似地,可以回答附加问题(2):聘用临时工人以增加劳动时间,付给的工资低于劳动时间的影子价格才可以增加利润,所以工资最多是每小时2元.(www.xing528.com)
(3)目标函数的系数发生变化时(假定约束条件不变),最优解和最优值会改变吗?这种对目标函数系数变化的影响的讨论,通常称为对目标函数系数的敏感性分析.LINGO在缺省设置中不会给出这种敏感性分析结果,但可以通过修改LINGO选项得到.具体做法是:选择“LINGO|Options”菜单,在弹出的选项卡中选择“General Solver”,然后找到选项“Dual Computations”,在下拉框中选中“Prices & Ranges”,应用或保存设置.重新运行“LINGO|Solve”,然后选择“LINGO|Ranges”菜单,则得到如下输出:
上面输出的第2~6行“Current Coefficient”(当前系数)对应的“Allowable Increase”和“Allowable Decrease”给出了最优解不变条件下目标函数系数的允许变化范围:x1的系数为(72-8,72+24),即(64,96);x2的系数为(64-16,64+8),即(48,72).注意:x1系数的允许范围需要x2系数64不变,反之亦然.
用这个结果很容易回答附加问题(3):若每千克A1的获利增加到30元,则x1系数变为30×3=90,在允许范围内,所以不应改变生产计划.
(4)对“资源”的影子价格做进一步的分析.影子价格的作用(即在最优解下“资源”增加1个单位时“效益”的增量)是有限制的,资源增加到一定程度将无法引起“效益”的增加.这种对影子价格在什么条件下才有意义的讨论,通常称为对资源约束右端项的敏感性分析.上面输出的第7~12行“Current RHS”(当前右端项)对应的“Allowable Increase”和“Allowable Decrease”给出了影子价格有意义条件下约束右端项的限制范围:原料最多增加10桶牛奶,劳动时间最多增加53.3 h.
现在可以回答附加问题(1)的第2问:虽然应该批准用35元买1桶牛奶的投资,但每天最多购买10桶牛奶.类似地,可以用低于2元/h的工资聘用临时工人以增加劳动时间,但最多增加53.3 h.
需要注意的是:一般情况下LINGO给出的敏感性分析结果只是充分条件,如上述“最多增加10桶牛奶”应理解为“增加10桶牛奶”一定是有利可图的,但并不意味着“增加10桶以上的牛奶”一定不是有利可图的(对最大可增加的劳动时间也应该类似地理解),只是此时无法通过敏感性分析直接得出结论,而需要重新求解新的模型进行判断.以后我们对此不再进行特别说明(同样,对目标函数系数给出的敏感性分析结果也只是充分条件).
评注:本例在产品利润、加工时间等参数均可设为常数的情况下,建立了线性规划模型.线性规划模型可以方便地用LINGO软件求解,得到内容丰富的输出,而且利用其中的影子价格和敏感性分析,可对模型结果做进一步的研究,它们对实际问题常常是十分有益的.
二、奶制品的生产销售计划
上例给出的A1,A2两种奶制品的生产条件、利润及工厂的“资源”限制全都不变,为增加工厂的获利,开发了奶制品的深加工技术:用2 h和3元加工费,可将1 kg A1加工成0.8 kg高级奶制品B1,也可将1 kg A2加工成0.75 kg高级奶制品B2,每千克B1能获利44元,每千克B2能获利32元.试为该厂制订一个生产销售计划,使每天的净利润最大,并讨论以下问题:
(1)若投资30元可以增加供应1桶牛奶,投资3元可以增加1 h劳动时间,应否作这些投资?若每天投资150元,可赚回多少?
(2)每千克高级奶制品B1,B2的获利经常有10%的波动,对制订的生产销售计划有无影响?若每千克B1的获利下降10%,计划应该变化吗?
(3)若公司已经签订了每天销售10 kg A1的合同并且必须满足,该合同对公司的利润有什么影响?
【问题分析】
要求制订生产销售计划,决策变量可以像第五章第一节一中那样,取作每天用多少桶牛奶生产A1,A2,再添上用多少千克A1加工B1,用多少千克A2加工B2.
但是由于问题要分析B1,B2的获利对生产销售计划的影响,所以决策变量取作A1,A2,B1,B2每天的销售量更方便.目标函数是工厂每天的净利润——A1,A2,B1,B2的获利之和扣除深加工费用.约束条件基本不变,只是要添上A1,A2深加工时间的约束.在与“一.奶制品加工的生产计划”类似的假定下用线性规划模型解决这个问题.
【基本模型】
决策变量:设每天销售x1 kg A1,x2 kg A2,x3 kg B1,x4 kg B2,用x5 kg A1加工B1,x6 kg A2加工B2(增设x5,x6可使下面的模型简单,这里要提倡这种变量设置上的“浪费”行为).
目标函数:设每天净利润为z,容易写出z=24x1+16x2+44x3+32x4-3x5-3x6.
约束条件:
原料供应:每天生产A1(x1+x5)kg,用牛奶桶,每天生产A2(x2+x6)kg,用牛奶桶,两者之和不得超过每天的供应量50桶;
劳动时间:每天生产A1,A2的时间分别为4(x1+x5)和2(x2+x6),加工B1,B2的时间分别为2x5和2x6,两者之和不得超过总的劳动时间480 h;
设备能力:A1的产量x1+x5不得超过甲类设备每天的加工能力100 kg;
非负约束:x1,x2,…,x6均为非负.
附加约束:1 kg A1加工成0.8 kg B1,故x3=0.8x5;类似地,x4=0.75x6.
由此得基本模型:
这仍然是一个线性规划模型.
模型求解用LINGO软件求解,输入文件时为方便起见将(5.1.7)式改写为
(5.1.8)式改写为
输入并求解,可得如下输出:
最优解为x1=0,x2=168,x3=19.2,x4=0,x5=24,x6=0,最优值为z=3460.8,即每天生产销售168 kg A2和19.2 kg B1(不出售A1,B2),可获净利润3460.8元.为此,需用8桶牛奶加工成A1,42桶加工成A2,并将得到的24 kg A1全部加工成B1.
和问题一一样,原料(牛奶)、劳动时间为紧约束.
【结果分析】
利用输出中的影子价格和敏感性分析讨论以下问题:
(1)上述结果表明,原料约束、时间约束的影子价格分别为3.16和3.26,注意到原料约束的影子价格为(5.1.7′)右端增加1个单位时目标函数的增量,由(5.1.7)式可知,增加1桶牛奶可使净利润增长3.16×12=37.92元;时间约束的影子价格则说明:增加1 h劳动时间可使净利润增长3.26元.所以应该投资30元增加供应1桶牛奶,或投资3元增加1 h劳动时间.若每天投资150元,增加供应5桶牛奶,可赚回37.92×5=189.6元.但是通过投资增加牛奶的数量是有限制的,输出结果表明,原料约束右端的允许变化范围为(600-280,600+120),相当于(5.1.7)式右端的允许变化范围为(50-23.3,50+10),即最多增加供应10桶牛奶.
(2)上述结果表明,最优解不变条件下目标函数系数的允许变化范围:x3的系数为(44-3.17,44+19.75);x4的系数为(32-∞,32+2.03).所以当B1的获利向下波动10%,或者B2的获利向上波动10%时,上面得到的生产销售计划将不再一定是最优的,应该重新制订.如若每千克B1的获利下降10%,应将原模型(5.1.6)式中x3的系数改为39.6,重新计算,得到的最优解为x1=0,x2=160,x3=0,x4=30,x5=0,x6=40,最优值为z=3400,即50桶牛奶全部加工成200 kg A2,出售其中160 kg,将其余40kg加工成30 kg B2出售,获净利润3400元,可见计划变化很大,这就是说,(最优)生产计划对B1或B2获利的波动是很敏感的.
(3)上述结果表明,变量x1对应的“Reduced Cost”严格大于0(为1.68),首先表明目前最优解中x1的取值一定为0;其次,如果限定x1的取值大于等于某个正数,则x1从0开始增加一个单位时,(最优的)目标函数值将减少1.68.因此,若公司已经签订了每天销售10 kg A1的合同并且必须满足,该合同将会使公司利润减少1.68×10=16.8元,即最优利润为3460.8-16.8=3444元.也可以反过来理解:如果将目标函数中x1对应的费用系数增加不小于1.68,则在最优解中x1将可以取到严格大于0的值.
有两点需要注意:一是与敏感性分析结果类似,这只是一个充分条件,即如果一个变量对应的“Reduced Cost”大于0,则当前最优解中该变量的取值一定为0;反之不成立,如上面最优解中x4的取值为0,对应的“Reduced Cost”也等于0而不是大于0(此时的“Reduced Cost”就不能按上面的解释来理解).二是“Reduced Cost”有意义也是有条件的,但条件不能通过上述结果直接得到,例如,如果将x1限定为不小于100,则问题的最优值为3040,而不再是3460.8-1.68×100=3292.8.
评注:与问题一相比,问题二多了两种产品B1,B2,它们的销售量与A1,A2的加工量之间存在等式关系(5.1.10),(5.1.11),虽然可以据此消掉两个变量,但是会增加人工计算,并使模型变得复杂.我们建模的原则是尽可能利用原始的数据信息,而把尽量多的计算留给计算机去做.
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。