sfjzgk 发表于 2005-8-4 09:40

用LINDO、LINGO 解运筹学问题(数学规划方面)

用LINDO、LINGO 解运筹学问题(数学规划方面)<BR><a href="http://www.lindo.com/" target="_blank" >http://www.lindo.com/</A><BR>一、软件简介<BR>LINDO 是一种专门用于求解数学规划问题的软件包。由于LINDO 执行速度很<BR>快、易于方便输入、求解和分析数学规划问题。因此在数学、科研和工业界得到<BR>广泛应用。LINDO 主要用于解线性规划、非线性规划、二次规划和整数规划等问<BR>题。也可以用于一些非线性和线性方程组的求解以及代数方程求根等。LINDO 中<BR>包含了一种建模语言和许多常用的数学函数(包括大量概论函数),可供使用者<BR>建立规划问题时调用。<BR>一般用LINDO(Linear Interactive and Discrete Optimizer)解决线性规划<BR>(LP—Linear Programming)。整数规划(IP—Integer Programming)问题。<BR>其中LINDO 6 .1 学生版至多可求解多达300 个变量和150 个约束的规划问题。<BR>其正式版(标准版)则可求解的变量和约束在1 量级以上。<BR>LINDO 则用于求解非线性规划(NLP—NON—LINEAR PROGRAMMING)和二次规则(QP<BR>—QUARATIC PROGRAMING)其中LINGO 6.0 学生版最多可版最多达300 个变量和<BR>150 个约束的规则问题,其标准版的求解能力亦再10^4 量级以上。虽然LINDO<BR>和LINGO 不能直接求解目标规划问题,但用序贯式算法可分解成一个个LINDO 和<BR>LINGO 能解决的规划问题。<BR>要学好用这两个软件最好的办法就是学习他们自带的HELP 文件。<BR>下面拟举数例以说明这两个软件的最基本用法。(例子均选自张莹《运筹学基础》)<BR>例1.(选自《运筹学基础》P54.汽油混合问题,线性规划问题)<BR>一种汽油的特性可用两个指标描述:其点火性用“辛烷数”描述,其挥发性用“蒸<BR>汽压力”描述。某炼油厂有四种标准汽油,设其标号分别为1,2,3,4,其<BR>特性及库存量列于下表1中,将上述标准汽油适量混合,可得两种飞机汽油,某<BR>标号为1,2,这两种飞机汽油的性能指标及产量需求列于表2中。<BR>问应如何根据库存情况适量混合各种标准汽油,使既满足飞机汽油的性能指标,<BR>而产量又为最高。<BR>表1<BR>标准汽油辛烷数蒸汽压力(g/cm^2) 库存量<BR>1 107.5 7.11*10^(-2) 380000<BR>2 93.0 11.38*10^(-2) 262200<BR>3 87.0 5.69*10^(-2) 408100<BR>4 108.0 28.45*10^(-2) 130100<BR>(1 g/cm^2=98Pa)<BR>表2<BR>飞机汽油辛烷数蒸汽压力(g/cm^2) 产量需求(L)<BR>1 &gt;=91 &lt;=9.96*10^(-2) 越多越好<BR>2 &gt;=100 &lt;=9.96*10^(-2) &gt;=250000<BR>建模过程略(详见《运筹学基础》P54—55)<BR>目标函数:max z=x1+x2+x3+x4<BR>约束条件:x5+x6+x7+x8&gt;=250000<BR>x1+x5&lt;=380000<BR>x2+x6&lt;=265200<BR>x3+x7&lt;=408100<BR>x4+x8&lt;=130100<BR>2.85x1-1.42x2+4.27x3-18.49x4&gt;=0<BR>2.85x5-1.42x6+4.27x7-18.49x8&gt;=0<BR>16.5x1+2.0x2-4.0x3+17x4&gt;=0<BR>7.5x5-7.0x6-13.0x7+8.0x8&gt;=0<BR>xj&gt;=0(j=1,2...,8)<BR>下面我们就用LINDO 来解这一优化问题。<BR>输入语句:<BR>max(不区分大小写) x1+x2+x3+x4<BR>ST(大写或写subject to)<BR>x5+x6+x7+x8&gt;=250000<BR>x1+x5&lt;=380000<BR>x2+x6&lt;=265200<BR>x3+x7&lt;=408100<BR>x4+x8&lt;=130100<BR>2.85x1-1.42x2+4.27x3-18.49x4&gt;=0<BR>2.85x5-1.42x6+4.27x7-18.49x8&gt;=0<BR>16.5x1+2.0x2-4.0x3+17x4&gt;=0<BR>7.5x5-7.0x6-13.0x7+8.0x8&gt;=0<BR>end<BR>然后再按运算符键即可得结果。<BR>LINDO 是规定Xj 非负的,我们可发现输入方式与我们的数学书写的形式基本一<BR>致,运算后,计算机会问您是否需要灵敏度分析,我们选择是,结果如下:<BR>LP OPTIMUM FOUND AT STEP 6<BR>OBJECTIVE FUNCTION VALUE<BR>1) 933400.0<BR>VARIABLE VALUE REDUCED COST<BR>X1 161351.734375 0.000000<BR>X2 265200.000000 0.000000<BR>X3 408100.000000 0.000000<BR>X4 98748.265625 0.000000<BR>X5 218648.265625 0.000000<BR>X6 0.000000 0.000000<BR>X7 0.000000 0.000000<BR>X8 31351.734375 0.000000<BR>ROW SLACK OR SURPLUS DUAL PRICES<BR>2) 0.000000 -1.000000<BR>3) 0.000000 1.000000<BR>4) 0.000000 1.000000<BR>5) 0.000000 1.000000<BR>6) 0.000000 1.000000<BR>7) 0.000000 0.000000<BR>8) 43454.000000 0.000000<BR>9) 3239024.250000 0.000000<BR>10) 1890675.875000 0.000000<BR>NO. ITERATIONS= 6<BR>RANGES IN WHICH THE BASIS IS UNCHANGED:<BR>OBJ COEFFICIENT RANGES<BR>VARIABLE CURRENT ALLOWABLE ALLOWABLE<BR>COEF INCREASE DECREASE<BR>X1 1.000000 0.000000 1.154137<BR>X2 1.000000 INFINITY 0.000000<BR>X3 1.000000 INFINITY 0.000000<BR>X4 1.000000 0.000000 0.000000<BR>X5 0.000000 1.154137 0.000000<BR>X6 0.000000 0.000000 INFINITY<BR>X7 0.000000 0.000000 INFINITY<BR>X8 0.000000 0.000000 0.000000<BR>RIGHTHAND SIDE RANGES<BR>ROW CURRENT ALLOWABLE ALLOWABLE<BR>RHS INCREASE DECREASE<BR>2 250000.000000 186222.062500 234752.984375<BR>3 380000.000000 234752.984375 15247.017578<BR>4 265200.000000 30601.410156 265200.000000<BR>5 408100.000000 156685.250000 10176.581055<BR>6 130100.000000 2350.135254 36184.207031<BR>7 0.000000 43454.000000 669046.000000<BR>8 0.000000 43454.000000 INFINITY<BR>9 0.000000 3239024.250000 INFINITY<BR>10 0.000000 1890675.875000 INFINITY<BR>下面给出其结果的一般解释:<BR>“LP OPTIMUM FOUND AT STEP 6”表示LINDO 在(用单纯形法)6次迭代或旋转<BR>后得到最优解。<BR>“OBJECTIVE FUNCTION VALUE 1)933400.0”表示最优目标值为933400。<BR>“VALUE”给出最优解中各变量的值。<BR>“SLACK OR SURPLUS”给出松弛变量的值。上例中SLK 2= 第二行松弛变量=0<BR>(模型第一行表示目标函数,所以第二行对应第一个约束)<BR>“REDUCE COST”列出最优单纯形表中判别数所在行的变量的系数,表示当变量<BR>有微小变动时,目标函数的变化率,其中基变量的reduce cost 值应为0,对<BR>于非基变量Xj 相应的reduce cost 值表示Xj 增加一个单位(此时假定其他非<BR>基变量保持不变)时目标函数减小的量(max 型问题)。上例中:X1 对应的reduce<BR>cost 值为0,表示当X1=1 时,目标函数值不变。<BR>“DUAL PRICE”(对偶价格)列出最优单纯形表中判别数所在行的松弛变量的系<BR>数,表示当对应约束有微小变动时,目标函数的变化率,输出结果中对应每一个<BR>约束有一个对偶价格。若其数值为X,表示对应约束中不等式右端项若增加一个<BR>单位,目标函数将增加X个单位(max 型问题)。上例中:第二行对应的对偶价<BR>格值应为-1表示当约束2)X5 + X6 + X7 + X8&gt;250000 变为2)X5 + X6 +<BR>X7 + X8&gt;250001 时,<BR>目标函数值=933400-1=933399<BR>当REDUCE COST 或DUAL PRICE 的值为0。表示当微小扰动不影响目标函数。<BR>有时,通过分析DUAL PRICE,也可对产生不可行问题的原因有所了解。<BR>灵敏度分析:如果做敏感性分析,则系统报告当目标函数的费用系数和约束右端<BR>项在什么范围变化(此时假定其他系数保持不变)时,最优基保持不变。报告中<BR>INFINITY 表示正无穷,如上例:目标函数中X1的变量系数为1,当它在<BR>[1-1.154137,1-0]=<BR>[-0.154137,1] 变化时,最优基保持不变。<BR>第一个约束右端项为250000,当它在<BR>[250000-234752.984375,250000+186222.0625]=<BR>范围变化时,最优基保持不变。<BR>当您要判断表达式输入是否有错误时,也可以使用菜单“Reports“的”Picture<BR>“选项。<BR>若想获得灵敏度分析,可用“Reports“的”Rang“选项。<BR>若需显示单纯形表,可执行“Reports“的”Tab lean“选项。<BR>注意事项:<BR>1) 目标函数及各约束条件之间一定要有“Subject to (ST) ”分开。<BR>2) 变量名不能超过8个字符。<BR>3) 变量与其系数间可以有空格,单不能有任何运算符号(如乘号“*”等)。<BR>4) 要输入&lt;=或&gt;=约束,相应以&lt;或&gt;代替即可。<BR>5) 一般LINDO 中不能接受括号“()“和逗号“,“,例:400(X1+X2) 需写<BR>成400X1+400X2;10,000 需写成10000。<BR>6) 表达式应当已经过简化。不能出现2 X1+3 X2-4 X1,而应写成-2X1+3 X2。<BR>例2.(选自《运》P94 习题2.4;整数规则)<BR>有四个工人,要分别指派他们完成四项不同的工作,每个人做各项工作所消耗的<BR>时间如表。问应该如何指派,才能使总的消耗时间为最小?<BR>工<BR>作<BR>所耗<BR>时间<BR>工人<BR>A B C D<BR>甲15 18 21 24<BR>乙19 23 22 18<BR>丙26 17 16 19<BR>丁19 21 23 17<BR>这是一道典型的整数规则问题。<BR>我们记派第I 去做工作记为Xij<BR>注意到每人只能做一项工作。每项工作一人做。我们得到目标函数为约束条件:<BR>min<BR>15x11+19x21+26x31+19x41+18x12+23x22+17x32+21x42+24x13+22x23+16x33+23x<BR>43+24x14+18x24+19x34+17x44<BR>ST<BR>x11+x12+x13+x14=1<BR>x21+x22+x23+x24=1<BR>x31+x32+x33+x34=1<BR>x41+x42+x43+x44=1<BR>x11+x21+x31+x41=1<BR>x12+x22+x32+x42=1<BR>x13+x23+x33+x43=1<BR>x14+x24+x34+x44=1<BR>end<BR>int 16<BR>运行后我们可得到最优目标值为70<BR>当,其余为0 时。(具体的Reports 我们略去)<BR>在用LINDO 解整数规划(IP)问题时,只要在END 后加上标识即可,其中解0/1<BR>规划的用命令。<BR>INT name 或INT n (n 指前n 个变量标识为0/1 型)解混合型整数规划则用GIN<BR>来标识。<BR>LINDO 解整数规划对变量的限制为50 个。(指LINDO 6.1 学生版)。所以说,<BR>尽管LINDO 对整数规划问题是很有威力。要有效地使用还是需要一定技术的。这<BR>是因为,人们很容易将一个本质上很简单的问题列成一个输入模型。从而有可能<BR>会导致一个冗长的分支定界计算。<BR>例3 用LINDO 解目标规划<BR>由于LINDO 不能直接求解目标规划问题,这是否就意味着LINDO 失去了效力呢?<BR>不是的。<BR>由求解目标规划问题的有效算法——序贯式算法可知其实目标规划我们常采取<BR>分解成前面二种办法而已。<BR>例如算:min a=((d1_+d1),(2d2+d3))<BR>G1:x1-10x2+d1_-d1=50<BR>G2:3x1+5x2+d2_-d2=20<BR>G3:8x1+6x2+d3_-d3=100<BR>xi(i=1,2),dj_,dj(j=1,2,3)&gt;=0<BR>先求目标函数的最优值<BR>min d1_+d1<BR>ST<BR>x1-10x2+d1_-d1=50<BR>3x1+5x2+d2_-d2=20<BR>end<BR>求得D1_+D1 的最优值为0<BR>然后再求<BR>min 2d2+d3<BR>ST<BR>x1-10x2+d1_-d1=50<BR>3x1+5x2+d2_-d2=20<BR>8x1+6x2+d3_-d3=100<BR>d1_+d1=0<BR>end<BR>即可算得第二级最优值2d2+d3<BR>例4 LINDO 虽亦可求解二次规划问题。(但我认为它在输入对不如用LINGO<BR>方便,用LINDO 输入时要先作偏导数计算不如LINGO 哪样可直接输入。(选自《运<BR>筹学基础》P190.习题4.10<BR>min f(x)=(x1-1)^2+(x2-2)^2<BR>x2-x1=1<BR>x1+x2&lt;=2<BR>x1&gt;=0,x2&gt;=0<BR>先来说一说如何使用LINGO<BR>一般来说LINGO 多用于解决大规模数学规划。<BR>用时要注意以下几点:<BR>(1) 每条语句后必须使用分号“;”结束。问题模型必须由MODEL 命令开始,<BR>END 结束。<BR>(2) 用MODEL 命令来作为输入问题模型的开始,格式为MODEL:statement (语<BR>句)。<BR>(3) 目标函数必须由“min =”或“max =”开头。<BR>则上面的例子的输入就为<BR>modul:<BR>min=(x1-1)^2+(x2-2)^2;<BR>x2-1=1;<BR>x1+x2&lt;=2;<BR>end<BR>我们即可得到最优值0.5。当X1=0.5,X2=1.5,及灵敏度分析。我们还可得作图<BR>分析。<BR>对于大规模规划求解请参见LINGO 的HELP 文件。<BR>一.计算机代数系统<a href="http://www.fosu.edu.cn/li/math/SXRJ/QITA/DSXT.htm" target="_blank" >http://www.fosu.edu.cn/li/math/SXRJ/QITA/DSXT.htm</A><BR>二.Matlab <a href="http://www.fosu.edu.cn/li/math/SXRJ/QITA/LINDOLINGO.htm" target="_blank" >http://www.fosu.edu.cn/li/math/SXRJ/QITA/LINDOLINGO.htm</A><BR>三.Mathematica <a href="http://www.fosu.edu.cn/li/math/SXRJ/QITA/LINDOLINGO.htm" target="_blank" >http://www.fosu.edu.cn/li/math/SXRJ/QITA/LINDOLINGO.htm</A><BR>四.统计软件SAS<BR>五.运筹学软件及教程(LINDO,LINGO)

franky222 发表于 2006-12-14 10:27

hao

<p>zuo de bu cuo</p><p></p>

zhuthai 发表于 2006-12-14 18:57

不错,顶一下

nick-zhi 发表于 2006-12-31 11:49

没有软件阿!

nclee 发表于 2007-1-6 23:18

很好的,谢谢

zhangny190 发表于 2007-2-26 11:54

bucuo

cicixiaonana 发表于 2007-4-4 18:18

<p>怎样具体用LINDO做多投入多产出的相对效率值啊?</p>

zbvcmcm 发表于 2007-7-5 01:36

wangjini 发表于 2007-10-8 12:36

现在明白了,lindo.lingo是什么东东了,

jjcx20031007 发表于 2007-10-20 08:11

真的很好,
页: [1] 2
查看完整版本: 用LINDO、LINGO 解运筹学问题(数学规划方面)