当前位置:文档之家› Lingo与线性规划

Lingo与线性规划

Lingo 与线性规划线性规划的标准形式是Minz c 1 x 1 c n x na 11x1a 1n xnb 1 s..ta m1 x1a mnxn(1)b mx i 0, i 1,2,, n其中 z c 1 x 1 c n x n 称为目标函数, 自变量 x i 称为决策变量 ,不等式组 (1)称为约束条件 .满足不等式组 (1)的所有 ( x 1, , x n ) 的集合称为可行域,在可行域里面使得z取最小值的 ( x 1* , , x n * ) 称为最优解,最优解对应的函数值称为最优值。

求解优化模型的主要软件有 Lingo 、Matlab 、Excel 等。

其中 Lingo 是一款专业求解优化模型的软件, 有其他软件不可替代的方便功能。

本文将简要介绍其在线性规划领域的应用。

一、基本规定1、目标函数输入格式max=函数解析式; 或者 min=函数解析式;2、约束条件输入格式利用: >、<、>=、<=等符号。

但是 >与 >=没有区别。

Lingo 软件默认所以自变量都大于等于 0.3、运算 加 (+), 减(-), 乘(*), 除(/), 乘方 (x^a) ,要注意乘号 (*) 不能省略。

4、变量名不区分大小写字母,不超过 32 个字符,必须以字母开头。

5、标点符号每个语句以分号“;”结束,感叹号“!”开始的是说明语句(说明语句也需要以分号“ ; ”结束)。

但是,model ,sets ,data 以“:”结尾。

endsets ,enddata , end 尾部不加任何符号。

6、命令不考虑先后次序7、MODEL 语句一般程序必须先输入 MODEL :表示开始输入模型,以“ END ”结束。

对简单的模型,这两个语句也可以省略。

8、改变变量的取值范围 @bin(变量名 ) ;@bnd(a, 变量名 ,b ) ;@free( 变量名 ) ; @gin(变量名 ) ;例 1 求目标函数 z 2x 1限制该变量为 0 或 1.限制该变量介于 a,b 之间 .允许该变量为负数 .限制该变量为整数 .3x 2 的最小值,约束条件为s..t x1x2350x11002x12x2600x1 , x20输入 Lingo 程序:min = 2*x1 + 3*x2;x1 + x2 >= 350;x1 >= 100;2*x1 + x2 <= 600;有两种运行方式:1、点击工具条上的按钮即可。

2、点击菜单: LINGO→Solve运行结果如下:下面对其各个部分进行说明:Global optimal solution found :表示已找到全局最优解。

Objective value:表示最优值的大小。

可见本题函数最小值z min800。

Infeasibilities:矛盾约束的数目。

Total solver iterations:迭代次数。

Variable:变量。

本题有两个变量。

Value:变量对应的最优解,即x1250,x2100 。

Reduced Cost:变量 x i在最优解的基础上增加一个单位,目标函数值的改变量。

例如,一个变量的 Reduced Cost值为 8,那么当该变量增加一个单位,在最大化(最小化)问题中目标函数值将减少(增大) 8 个单位。

Slack or Surplus:表示接近等于的程度,即约束离相等还差多少。

在约束条件是 <=中,表示松弛程度,在约束条件是 >=中,不是过剩程度。

如果约束条件是=,则 Slack or Surplus为 0,该约束是个紧约束 (或有效约束 )。

如果一个约束是矛盾的,即模型无可行解则 Slack or surplus的值是负数。

知道 Slack or Surplus 的值,可以帮助我们发现优化模型中错误的约束条件。

在上例中第 2 和第 4 行松弛变量均为 0,说明对于最优解来讲 ,两个约束 (第 2 和 4 行 )均取等号 ,即都是紧约束,第 3 行为 150,即最优解使得第 3 行过剩 150.Dual Price :对偶价格的值,它表示约束条件中的常数,每增加一个单位,目标函数值改变的数量(在最大化问题中目标函数值是增加,在最小化问题中目标函数值是减少)。

比如,在上一个 Min 模型中第四行的 1,表示 2*x1 + x2 <= 600 增加一个单位到 2*x1 + x2 <= 601,可以使目标值增加 -1(因为第一行是目标函数的Dual Price 是-1),即 Objective value = 799; 如果增加 -1 个单位到 599 会使目标值增加到 801。

例2 求目标函数 z 4x12 x22 2x32 12的最小值,约束条件为st.. 3x1 2 x2x39x1x2x31x1, x2 , x3R输入 Lingo 程序:min = 4*x1^2-x2^2+2*x3^2+12;3*x1+2*x2+x3=9;x1+x2+x3=-1;@free(x1); @free(x2); @free(x3);运行结果:即当 x11,x28, x310时, z min152 。

二、灵敏度分析灵敏度分析是指:找出模型变量系数的一个变化范围,使得最优基( 即最优解) 保持不变。

一般只对线性规划模型做灵敏度分析。

1、灵敏度分析操作步骤第一步:菜单 lingo-->options-->general solver-->dualcomputations:prices & ranges-->ok.第二步:菜单 lingo-->range2、灵敏度报告中常见的词汇Current coefficient Allowable increase Allowable decrease:当前目标函数系数:允许增加量:允许减少量Current RHS :当前右边常数项INFINITY :表示正无穷。

例 1 求解下列模型:max = 72*x1+64*x2;x1+x2 <= 50;12*x1+8*x2 <= 480;3*x1 <= 100;并做灵敏度分析。

求解报告:灵敏度分析报告:灵敏度分析报告的解读:x1 的系数变化范围是( 72-8 ,72+24 )=(64 ,96 ); x2 的系数变化范围是(64-16 ,64+8 )=(48,72)。

注意:x1 系数的允许范围需要 x2 系数 64 不变,反之亦然。

由于目标函数的费用系数变化并不影响约束条件,因此此时最优基不变可以保证最优解也不变,但最优值变化。

右边常数项中,第 2 行原来为 50 ,当它在 [50-6.67 ,50+10] = [43.33 , 60]范围变化时,最优基保持不变。

第 3 行可以类似解释。

对第 4 行,原来为 100 ,当它在 [100-40 ,100+∞] = [60, +∞]范围变化时,最优基保持不变。

不过由于此时约束发生变化,最优基即使不变,最优解、最优值也会发生变化。

三、数据输入对于大型的优化问题,即自变量比较多的时候,还像上两节那样输入目标函数和约束条件就比较麻烦了。

一般输入数据的方法有两种:一、建立向量、矩阵输入;二、调用外部数据。

这里仅介绍第一种方法。

1、建立向量命令格式:集合名称 / 集合维数 / :向量名称例如:sets :set1/1..9/:x;set2/1..5/:a,b;endsets表示建立了两类集合。

第一类集合set1 ,维数为 9, x 和 y 是向量名。

向量x=(x(1), , , x(9) ), 其中 x(i) 是 x 的元素。

第二类集合 set2 ,维数为 5,a 和 b 都是向量名。

向量 a=( a(1), , , a (5) ),其中 a(i) 是 a 的元素。

向量 b=(b(1), , , b(5) ) , 其中 b (i) 是 b 的元素。

2、建立矩阵命令格式:集合名称(集合 1,集合 2) / :矩阵名称例如:sets :set1/1..3/:x;set2/1..4/:a;link(set1, set2):A;endsets表示建立了一个矩阵类link ,其矩阵的阶数为34,A是具体的矩阵名。

有两个命令是比较常见的:求和语句 :@sum(集合名 (i):含集合名(i)的语句);循环语句 :@for( 集合名 (i):循环的语句);例 3:求目标函数 z 11x115x2的最小值,约束条件为s..t 20 x130x236030x125x2200030 x135x2300x1 , x20输入 Lingo 程序:model:sets :set1/1..2/:c,x;set2/1..3/:b;link(set2,set1):A;endsetsmax=@sum(set1(i):c(i)*x(i));@for(set2(i): @sum(link(i,j):A(i,j)*x(j))<=b(i));data :c=11 15;A=20 3030 2530 25;b=360 2000 300;enddataend运行结果报告:例 4、某地区有三个蔬菜生产基地,估计每年可供应本地区的蔬菜量表为:生产基地A B C蔬菜生产量 (吨)783有四个地市需要该类蔬菜,需求表为:地区甲乙丙蔬菜生产量 (吨)663如果从各蔬菜生产基地到各地市的每吨蔬菜的运价表地市甲乙丙丁3( 单位:万元丁/吨)为:生产基地A5879B49107C8429为了降低运输费,需要合理调拨资源.(1)根据以上资料表制订一个使总的运费为最少的蔬菜调拨方案.(2)如果有机会增加生产基地的产量 1 吨,问应当优先增加那个基地的产量?(3)如果将 A 到乙市的运价减少为 5 万元 / 吨,问这会影响最优的调拨方案吗?设 A:第i个蔬菜生产基地,i 1,2,3 ,分别对应生产基地,,;i A B CB i:第 i个蔬菜需求地, i1,2,3,4 ,分别对应蔬菜需求地市甲、乙、丙、丁;Q:总运输费用;x ij:表示的是从第i 个生产基地向第j 个地市运输的蔬菜数量;c ij:表示的是从第i 个生产基地向第j 个地市运输蔬菜的运价;b i:第 i 个蔬菜生产基地的蔬菜产量;q i:第 j 个地市的蔬菜需求量;那么有优化模型:34 min Q c ij xiji 1j 1x11x12x13x14b1x21x22x23x24b2x31x32x33x34b3x 11x21x31q1st..x22x32q2x12 x13x23x33q3x14x24x34q4x ij0,i 1,2,3; j 1,2,3,4输入 Lingo 程序求解模型:model:sets :set1/1..3/:b;set2/1..4/:q;link(set1,set2):c,x;endsetsmin=@sum(link(i,j):c(i,j)*x(i,j));@for(set1(i): @sum(link(i,j): x(i,j))<=b(i));@for(set2(j): @sum(link(i,j): x(i,j))=q(j));data :c=5,8,7,94,9,10,78,4,2,9;b=7,8,3;q=6,6,3,3;enddataend运行结果如下:Global optimal solution found.Objective value:100.0000Infeasibilities:0.000000Total solver iterations:6Variable Value Reduced CostB( 1)7.0000000.000000B( 2)8.0000000.000000B( 3) 3.0000000.000000Q( 1) 6.0000000.000000Q( 2) 6.0000000.000000Q( 3) 3.0000000.000000Q( 4) 3.0000000.000000C( 1, 1) 5.0000000.000000C( 1, 2)8.0000000.000000C( 1, 3)7.0000000.000000C( 1, 4)9.0000000.000000C( 2, 1) 4.0000000.000000C( 2, 2)9.0000000.000000C( 2, 3)10.000000.000000C( 2, 4)7.0000000.000000C( 3, 1)8.0000000.000000C( 3, 2) 4.0000000.000000C( 3, 3) 2.0000000.000000C( 3, 4)9.0000000.000000X( 1, 1) 1.0000000.000000X( 1, 2) 6.0000000.000000X( 1, 3)0.000000 1.000000X( 1, 4)0.000000 1.000000X( 2, 1) 5.0000000.000000X( 2, 2)0.000000 2.000000X( 2, 3)0.000000 5.000000X( 2, 4) 3.0000000.000000X( 3, 1)0.0000007.000000X( 3, 2)0.0000000.000000X( 3, 3) 3.0000000.000000X( 3, 4)0.000000 5.000000Row Slack or Surplus Dual Price1100.0000-1.00000020.0000000.00000030.000000 1.00000040.000000 4.00000050.000000-5.00000060.000000-8.00000070.000000-6.00000080.000000-8.000000从该报告可以得到:1、最优的调拨方案为:地市甲乙丙丁生产基地A1600B5003C00302 、从Dual Price来看生产基地 A 的供应量增加 1 个单位,费用不变;生产基地 B 的供应量增加 1 个单位,费用减少1;生产基地 C的供应量增加 1 个单位,费用减少4;城市甲的需求量增加 1 个单位,费用减少 -5 ,即增加 5;城市乙的需求量增加 1 个单位,费用减少 -8 ,即增加 8;城市丙的需求量增加 1 个单位,费用减少 -6 ,即增加 6;城市丁的需求量增加 1 个单位,费用减少 -8 ,即增加 8;3、从Slack or Surplus来看,所有的约束都是紧约束。

相关主题