线性规划(Linear programming,简称LP),是运筹学中研究较早、发展较快、应用广泛、方法较成熟的一个重要分支,它是辅助人们进行科学管理的一种数学方法。研究线性约束条件下线性目标函数的极值问题的数学理论和方法。英文缩写LP。
LINGO基本用法
不会LINGO的建议先看完这个再往下看
我们数学建模一般就是MATLAB,LINGO可以用于求解非线性规划,也可以用于一些线性和非线性方程组的求解等,功能十分强大,是求解优化模型的最佳选择。所以我们在做规划问题时用LINGO。
基础知识
程序以“MAX”(或“MIN”)开始,表示目标最大化(或最小化)问题,后面直接写出目标函数表达式和约束表达式;
目标函数和约束之间用“ST”分开;(或用“s.t.”,“sunject to”)
程序以“END”结束( “END” 也可以省略)。
系数与变量之间的乘号必须省略。
系统对目标函数所在行自动生成行名“1)”,对约束默认的行名分别是“2)” “3)”…,用户也可以自己输入行名;行名放在对应的约束之前。
书写相当灵活,不必对齐,不区分字符的大小写。
默认所有的变量都是非负的, 所以不必输入非负约束。
约束条件中的“<=” 及“>=”可分别用“<” 及“>”代替。
一行中感叹号“!”后面的文字为是注释语句,可增强程序的可读性,不参与模型的建立。
LINGO默认x,y变量大于0,若有其他条件必须要写。
例如
求解
程序
max 2x+3y
st 4x+3y<=10
3x+5y<12
end
运行结果
具体结果的含义我们用下面的例题具体来说。
例1 加工奶制品的生产计划
问题引出:
对牛奶制品我们现有两种生产方式:
- 生产A产品:一桶牛奶,加工12小时,可生产3kgA,获利24元/kg。
- 生产B产品:一桶牛奶,加工8小时,可生产4kgA,获利16元/kg。
条件:共有50桶牛奶,480小时,由于生产水平不足最多只能加工100kgA。
要求: 制订生产计划,使每天获利最大
- 35元可买到1桶牛奶,买吗?若买,每天最多买多少?
- 可聘用临时工人,付出的工资最多是每小时几元?
- A的获利增加到 30元/kg,应否改变生产计划?
模型建立
设x桶牛奶用于生产A,y桶生产B。
则:
- 获利:
- A: 24 ∗ 3 ∗ x 24*3*x 24∗3∗x
- B: 16 ∗ 4 ∗ y 16*4*y 16∗4∗y
- 总: m a x z = 72 ∗ x + 64 ∗ y max \quad z=72*x+64*y maxz=72∗x+64∗y
- 约束条件:
- 原料: x + y ≤ 50 x+y\leq50 x+y≤50
- 时间: 12 ∗ x + 8 ∗ y ≤ 480 12*x+8*y\leq480 12∗x+8∗y≤480
- 加工能力: 3 ∗ x ≤ 100 3*x\leq100 3∗x≤100
- 非负: x , y ≥ 0 x, y\geq0 x,y≥0
模型分析
- 比例性:
- x,y对目标函数的“贡献”与x,y的取值成正比
- x,y对约束条件的“贡献”与x,y的取值成正比
- 可加性:
- x,y对目标函数的“贡献”与x,y的取值无关
- x,y对约束条件的“贡献”与x,y的取值无关
模型求解
这里x1为x,x2为y
求解可以用MATLAB,当然这里我们用LONGO,因为LINGO比MATLAB好用
例题解
model:
max = 72*x1+64*x2;
[milk] x1 + x2<50;
[time] 12*x1+8*x2<480;
[cpct] 3*x1<100;
end
最终结果就是20桶用于生产A,30桶用于生产B,最优解为3360元
敏感度分析
打开方式:
- 把这个Dual Computation设置成prices & rangees
- 从这里打开command窗口,或者ctrl +1 打开
- 窗口中输入range回车
就出现了这个。
名词解释:
Objective Coefficient Ranges:目标系数范围
Coefficient:系数
Increase:增加
Decrease:下降
这部分就是系数可以在加上可以增加的,减去可以减少,得到的两个值,在这两个值的范围内对结果无影响。
下面那部分类似。
问题解析
- 35元可买到1桶牛奶,要买吗?
- 要买,一桶利润增长48,35一桶还能多赚13
- 聘用临时工人付出的工资最多每小时几元?
- 最多2块
- A的获利增加到 30元/kg,应否改变生产计划?
- 分析可知X1的变化范围是(64,96),原来是24元每千克每桶获利72元,现在是30元/kg每桶获利90元。但是就是在(64,96)之间,所以不需要改变计划。
- 35元可买到1桶牛奶, 每天最多买多少?
例2 奶制品的生产销售计划 在例1基础上深加工
问题引出:
对牛奶制品我们现有两种生产方式:
- 生产A产品:一桶牛奶,加工12小时,可生产3kgA,获利24元/kg;如果对A奶制品再加工,每一千克需要花费2小时,三块钱可以加工成0.8kg产品C,并且获利44元/kg
- 生产B产品:一桶牛奶,加工8小时,可生产4kgA,获利16元/kg;如果对B奶制品再加工,每一千克需要花费2小时,三块钱可以加工成0.75kg产品C,并且获利32元/kg
条件:共有50桶牛奶,480小时,由于生产水平不足最多只能加工100kgA。
要求: 制订生产计划,使每天获利最大
- 30元可增加1桶牛奶,3元可增加1h时间,应否投资?现投资150元,可赚回多少?
- C,D的获利经常有10%的波动,对计划有无影响?
- 每天销售10kgA的合同必须满足,对利润有什么影响?
模型建立
设出售x1kgA, x2B, x3C , x4D,其中x5kgA加工成C,x6kgB加工成D
则:
- 获利:
- 约束条件:
- 原料:
- 时间:
- 加工能力:
- 附加约束:
- 非负约束 : x 1.... x 6 ≥ 0 x1....x6\geq0 x1....x6≥0
LINGO程序
model:
max = 24*x1+16*x2+44*x3+32*x4-3*x5-3*x6;
[milk] (x1+x5)/3+(x2+x6)/4<50;
[time] 4*(x1+x5)+2*(x2+x6)+2*x5+2*x6<480;
[cpct] x1+x5<100;
x3=0.8*x5;
x4=0.75*x6;
end
运行结果
结果分析
- 用于生产A的一共有x1+x5=24kg,所以生产A耗费了24/3=8桶牛奶。
- 用于生产B的共有x2+x6=168kg,所以消耗了168/4=42桶牛奶。
- x1的值为0,所以A产品一点没出售,生产后都接着用于生产C产品了,可以看到C产品是19.2kg(24*0.8=19.2)
- x2共168kg,x4是0,也就是B产品没有进行再加工生成D
- 利润3460.8(元)
问题解析
- 30元可增加1桶牛奶,3元可增加1h时间,应否投资?现投资150元,可赚回多少?
- 看Dual Price,每增加一桶牛奶可以多赚37.9元,所以可买5桶,多赚189.5元
- 每增加1小时,多赚3.26元,增加50小时可以多赚113元
- 所以可以买成牛奶,比增加时间赚的多
- C,D的获利有10%的波动,对计划有无影响
- C获利下降10%也就是x3*0.1=4.4,超出X3 系数允许范围3.16666
- D获利上升10%,也就是x4*0.1=3.2.超出X4 系数允许范围2.02667
- 所以有影响
- 每天销售10kgA的合同必须满足,对利润有什么影响?
看到结果分析,Reduced Cost为差额成本,也就是每增加1单位x1会减少1.68元,现在固定要销售10kgA,所以利润减少16.8元
小结:
- 由于产品利润、加工时间等均为常数,可建立线性规划模型.
- 线性规划模型的三要素:决策变量、目标函数、约束条件.
- 建模时尽可能利用原始的数据信息,把尽量多的计算留给计算机去做(分析例2的建模).
- 用LINGO求解,输出丰富,利用影子价格和灵敏性分析可对结果做进一步研究.