附1:用LINGO求解线性规划的例子

 

一奶制品加工厂用牛奶生产A1、A2两种奶制品,1桶牛奶可以在设备甲上用12小时加工成3公斤A1,或者在设备乙上用8小时加工成4公斤A2。根据市场需求,生产的A1、A2能全部售出,且每公斤A1获利24元,每公斤A2获利16元。现在加工厂每天能得到50桶牛奶的供应,每天正式工人总的劳动时间为480小时,并且设备甲每天至多能加工100公斤A1,设备乙的加工能力没有限制。试为该厂制定一个生产计划,使每天获利最大,并进一步讨论以下3个附加问题:

1)若用35元可以购买到1桶牛奶,应否作这项投资?若投资,每天最多购买多少桶牛奶?

2)若可以聘用临时工人以增加劳动时间,付给临时工人的工资最多是每小时几元?

3)由于市场需求变化,每公斤A1的获利增加到30元,应否改变生产计划?

数学模型:设每天用x1桶牛奶生产A1 ,用x2桶牛奶生产A2

目标函数:设每天获利为z元。 x1桶牛奶可生产3x1公斤A1,获利24*3x1,x2桶牛奶可生产4*x2公斤A2,获利16*4x2,故z=72x1+64x2

约束条件: 

原料供应:生产A1、A2的原料(牛奶)总量不超过每天的供应50桶,即

                x1+x2≤50

劳动时间:生产A1、A2的总加工时间不超过每天正式工人总的劳动时间480小时,即         

12x1+8x2≤480

设备能力:A1的产量不得超过设备甲每天的加工能力100小时,即

                3x1≤100

非负约束:x1、x2均不能为负值,即x1≥0,x2≥0

综上所述可得

max z=72x1+64x2

s.t.

 x1+x2≤50

12x1+8x2≤480

3x1≤100

x1≥0,x2≥0

显然,目标函数和约束条件都是线性的,这是一个线性规划(LP),求出的最优解将给出使净利润最大的生产计划,要讨论的问题需要考虑参数的变化对最优解和影响,一般称为敏感性(或灵敏度)分析。

LINGO求解线性规划

用LINGO求解线性规划时,首先在LINGO软件的模型窗口输入一个LP模型,模型以MAX或MIN开始,按线性规划问题的自然形式输入(见下面例子所示)。

以下解加工奶制品的生产计划问题:

由于LINGO中已假设所有的变量都是非负的,所以非负约束条件不必输入;LINGO也不区分变量中的大小写字符(实际上任何小写字符将被转换为大写字符);约束条件中的“〈=”及“〉=”可用“〈”及“〉”代替。在LINGO模型窗口输入如下:

max=72*x1+64*x2;

x1+x2<=50;

12*x1+8*x2<=480;

3*x1<=100;

用鼠标单击菜单中的求解命令(Solve)就可以得到解答,结果窗口显示如下:

LP OPTIMUM FOUND AT STEP 2

OBJECTIVE FUNCTION VALUE

        1)             3360.000

        VARIABLE       VALUE          REDUCED COST

        X1            20.000000                0.000000

        X2            30.000000                0.000000

        ROW    SLACK OR SURPLUS    DUAL PRICES

        2)            0.000000              48.000000

        3)            0.000000              2.000000

        4)           40.000000              0.000000

 NO. ITERATIONS=       2

 

计算结果表明:

“LP OPTIMUM FOUND AT STEP2”表示单纯形法在两次迭代(旋转)后得到最优解。

OBJECTIVE FUNCTION VALUE 1) 3360.000”表示最优目标值为3360.000(LINGO中将目标函数自动看作第1行,从第二行开始才是真正的约束条件)。

“VALUE”给出最优解中各变量(VARIABLE)的值:x1=20.000000,x2=30.000000。

“REDUCED COST”的含义是(对MAX型问题):基变量的REDUCED COST值为0,对于非基变量,相应的REDUCED COST值表示当非基变量增加一个单位时(其它非基变量保持不变)目标函数减少的量。本例中两个变量都是基变量。

“SLACK OR SURPLUS”给出松弛(或剩余)变量的值,表示约束是否取等式约束;第2、第3行松弛变量均为0,说明对于最优解而言,两个约束均取等式约束;第4行松弛变量为40.000000,说明对于最优解而言,这个约束取不等式约束。

“DUAL PRICES”给出约束的影子价格(也称为对偶价格)的值:第2、第3、第4行(约束)对应的影子价格分别48.000000,2.000000,0.000000。

“NO. ITERATIONS=       2”表示用单纯形法进行了两次迭代(旋转)。

灵敏度分析,则LINGO还会输出以下结果:

RANGES IN WHICH THE BASIS IS UNCHANGED:

                           OBJCOEFFICIENTRANGES

 VARIABLE                        CURRENT                ALLOWABLE          ALLOWABLE

                     COEF           INCREASE         DECREASE

       X1           72.000000         24.000000            8.000000

       X2           64.000000          8.000000           16.000000

                           RIGHTHANDSIDERANGES

      ROW        CURRENT        ALLOWABLE       ALLOWABLE

                     RHS            INCREASE         DECREASE

        2            50.000000         10.000000          6.666667

        3          480.000000         53.333332          80.000000

        4          100.000000         INFINITY          40.000000

以上显示的是当前最优基(矩阵)保持不变的充分条件(RANGES IN WHICH THE BASIS IS UNCHANGED),包括目标函数中决策变量应的系数的变化范围(OBJ COEFFICIENT RANGES)和约束的右端项的变化范围(RIGHTHAND SIDE RANGES)两部分。

前一部分的输出行

X1           72.000000         24.000000            8.000000

表示决策变量X1当前在目标函数中对应的系数为72,允许增加24和减少8。也就是说,当该系数在区间[64,96]上变化时(假设其它条件均不变),当前最优基矩阵保持不变。对X2对应的输出行也可以类似地解释。由于此时约束没有任何改变,所以最优基矩阵保持不变意味着最优解不变(当然,由于目标函数中的系数发生变化,最优值还是会变的)。

后一部分的输出行

2            50.000000         10.000000          6.666667

表示约束2当前右端项为50,允许增加10和减少6.666667。也就是说,当该系数在区间[43.333333,60]上变化时(假设其它条件均不变),当前最优基矩阵保持不变。对约束3、约束4对应的输出行也可以类似地解释。由于此时约束已经改变,虽然最优基矩阵保持不变,最优解和最优值还是会变的。但是,由于最优基矩阵保持不变,所以前面的“DUAL PRICES”给出的约束的影子价格此时仍然是有效的。

用LINGO求解加工奶制品的生产计划,结果如下:

20桶牛奶生产A1, 30桶生产A2,利润3360元。

1)35元可买到1桶牛奶,要买吗?

由于原料的影子价格为48,35 <48, 应该买!

2)聘用临时工人付出的工资最多每小时几元?

由于工时的影子价格为2,聘用临时工人付出的工资最多每小时2元

3)A1获利增加到 30元/千克,应否改变生产计划

由于要使最优解保持不变,X1系数的允许变化范围为[64,96]。x1系数由24*3=72增加为30*3=90,在允许范围内。所以不改变生产计划。