LINGO语言应用讲座(一)Lingo解方程、求极值以及简单规划问题例1求解非线性方程组4222222yyxxyx其LINGO代码如下:model:x^2+y^2=2;2*x^2+x+y^2+y=4;@bnd(0.4,x,0.5);@bnd(1,y,2);end例2某工厂有两条生产线,分别用来生产M和P两种型号的产品,利润分别为200元/个和300元/个,生产线的最大生产能力分别为每日100和120,生产线每生产一个M产品需要1个劳动日(1个工人工作8小时称为1个劳动日)进行调试、检测等工作,而美国P产品需要2个劳动日,该厂工人每天共计能提供160劳动日,假如原材料等其他条件不受限制,问应如何安排生产计划,才能使获得的利润最大?解设两种产品的生产量分别为1x和2x,则该问题的数学模型为目标函数21300200maxxxz.约束条件.2,1,0,1602,120,1002121ixxxxxi其LINGO代码如下:Model:MAX=200*X1+300*X2;X1=100;X2=120;X1+2*X2=160;EndGlobaloptimalsolutionfound.Objectivevalue:29000.00Totalsolveriterations:0VariableValueReducedCostX1100.00000.000000X230.000000.000000RowSlackorSurplusDualPrice129000.001.00000020.00000050.00000390.000000.00000040.000000150.0000该报告说明:运行2步找到全局最优解,目标函数值为29000,变量值分别为X1=100,X2=30.“ReducedCost”的含义是缩减成本系数(最优解中变量的RedcedCost值自动取零),“Row”是输入模型中的行号,“SlackorSurplus”的意思为松弛或剩余,即约束条件左边与右边的差值,对于“=”不等式,左边减右边的差值称为Surplus(剩余),当约束条件的两边相等时,松弛或剩余的值为零,如果约束条件无法满足,即没有可行解,则松弛或剩余的值为负数.“Dualprice”的意思是影子价格,上面报告中Row2的松弛值为0,意思是第二行的约束条件,即第一条生产线的最大生产能力已经到达饱和状态(100个),影子价格为50,含义是:如果该生产线最大生产能力增加1,能使目标函数值,即利润增加50,;报告中Row3的松弛值为90,表示按照最优解安排生产(X20=30),则第三行的约束条件,即第条生产线的最大值不起作用,故影子价格为0;例3求解非线性规划问题4321maxxxxxz,.0,0,0,0,4.5321.121.1331.1,4841.121.1,4401.1,400..43214321321211xxxxxxxxxxxxxxts其LINGO代码如下:Model:Max=x1^(1/2)+x2^(1/2)+x3^(1/2)+x4^(1/2);x1=400;1.1*x1+x2=440;1.21*x1+1.1*x2+x3=484;1.33*x1+1.21*x2+1.1*x3+x4=532.4;end例4.求函数)lncos5.1()(3xxxxexfx在区间(0.2,4)内的极小点和极小值以及极大值点和极大值.Model:Max=(x^3+1.5*@cos(x)+x*@log(x))*@exp(-x);@bnd(0.2,x,4);endModel:Min=(x^3+1.5*@cos(x)+x*@log(x))*@exp(-x);@bnd(0.2,x,4);end例5基金的优化使用(2001年数学建模竞赛题).假设某校基金会得到了一笔数额为M万元的基金,打算将其存入银行,小基金会计划在n年内每年用部分本息奖励优秀师生,要求每年的奖金额相同,且在n年末仍保留原基金数额.银行存款税后年利率见表1.1.2.表1.1.2银行存款税后利率表存期1年2年3年5年税后年利率/%1.82.162.5922.88校基金会希望获得最佳的基金使用计划,以提高每年的奖金额,请在M=5000万元、n=5年的情况下设计具体存款方案.解分析:假设首次发放奖金的时间是在基金到位后一年,一行每隔一年发放一次,每年发放的时间大致相同,小基金会希望获得最佳的基金使用计划,一提高每年的奖金额,且在n年末仍保留原基金数额M,实际上n年中发放的奖金总额全部来自与利息.如果全部基金都存为一年定期,每年都用到期利息发放奖金,则每年的奖金数为5000*0.018=90万,这是没有优化的存款方案.显然,准备在两年后使用的款项应当存成两年定期,必存两次一年定期的收益高,以此类推.目标是合理分配基金的存款方案,使得n年的利息总额最多.定义收益比0432.1%16.212a.按照银行存款税后利率表计算得到个存款年限对应的最优收益比见表1.1.3.表1.1.3各存款年限对应的最优收益比存期年限1年2年3年4年(3+1方式)5年最优收益比1.0181.04321.077761.097159681.144经分析得到两点结论:(1)一次性存成最长期,优于两个(或两个以上)较短期的组合(中途转存).(2)当存款年限需要组合时,收益比与组合的先后次序无关.建立模型把总基金M分成5+1份,分别用621,,,xxx表示,其中521,,,xxx分别存成1-5年定期,到期后本息合计用于当年发放奖金,6x存5年定期,到期的本息合计等于原基金总数M.用S表示每年用于奖励优秀师生的奖金额,用ia表示第i年的最优收益比.目标函数是每年的奖金额最大,即maxS.约束条件有3个:①各年度的奖金数额相等;②奖金总数为M;③n年末保留原基金总额M.于是得到模型如下:maxS,.,,5,,2,1,..6561MxaMxiSxatsiiii(1.1.2)这是线性规划模型,用LINGO软件求解,令M=5000,编写程序如下:其LINGO代码如下:MAX=S;1.018*x1=S;1.0432*x2=S;1.07776*x3=S;1.07776*1.018*x4=S;1.144*x5=S;1.144*x6=M;M=5000;X1+x2+x3+x4+x5+x6=M;Globaloptimalsolutionfound.Objectivevalue:135.2227Totalsolveriterations:0VariableValueReducedCostS135.22270.000000X1132.83170.000000X2129.62300.000000X3125.46640.000000X4123.24790.000000X5118.20160.000000X64370.6290.000000M5000.0000.000000RowSlackorSurplusDualPrice1135.22271.00000020.000000-0.211054830.000000-0.205956540.000000-0.199352250.000000-0.195827360.000000-0.187809370.000000-0.187809380.0000000.402663190.0000000.2148538例6某公司6个供货栈,库存货物总数分别为60,55,51,43,41,52,现由8个客户各要一批货,数量分别为35,37,22,32,42,32,43,38,各供货栈到8个客户处的单位货物运输价见表2表2供货栈到客户的单位货物运价(元/每单位)客户货栈V1V2V3V4V5V6V7V8W162674259W249538582W352197433W476739271W523957265W655228143试确定各货栈到各客户的货物调运数量,使总的运费最小.解引入决策变量ijx,代表从第i个货栈到第j个客户的货物运量.用符号ijc表示从第i个货栈到第j个客户的单位货物运价,ia表示第i个货栈的最大供货量,id表示第j个客户的订货量.目标函数是总运输费用最小.约束条件有三条:①各货栈运出的货物总量不超过其库存数;②各客户收到的货物总量等于其订货数量;③决策变量ijx非负.则本问题的数学模型为:6181minijijijxcz,.8,,2,1,6,,2,1,0,8,,2,1,,6,,2,1,..6181jixjdxiaxtsijjiijijij(1.2.1)1.集合定义部分LINGO将集合(SET)的概念引入建模语言,集合是一组相关对象构成的组合,代表模型中的实际事物,并于数学变量及常量联系起来,是实际问题到数学的抽象.例1.2.1中的6个仓库可以看成是一个集合,8个客户可以看成另外一个集合.每个集合在使用之前需要预先给出定义,定义集合时要明确三方面内容:集合的名称、集合内的成员(组成集合的个体,也称元素)、集合的属性(可以看成是与该集合有关的变量或常量,相当于数组).本例先定义仓库集合:WH/W1..W6/AI;其中WH是集合的名称,W1..W6是集合内的成员,“..”是特定的省略号(如果不用省略号,也可以把成员一一列出来,成员之间用逗号或空格分开),表明该集合有个成员,分别对应6个货栈,AI是集合的属性,它可以看成是一个一维数组,有6个分量,分别表示各货栈现有货物的总数.集合、成员、属性的命名规则与变量相同,可按自己的意愿,用有一定意义的字母数字串来表示,式中“/”和“/:”是规定的语法规则.本例还定义客户集合:VD/V1..V8/DJ;该集合有8个成员,DJ是集合的属性(有8个分量)表示各客户的需求量.以上两个集合称为初始集合(或称基本集合,原始集合),初始集合的属性都相当一维数组.为了表示数学模型中从货栈到客户的运输关系以及与此相关的运输单价ijc和运量ijx,再定义一个表示运输关系(路线)的集合:LINKS(WH,VD):C,X;该集合以初始集合WH和VD为基础,称为衍生集合(或称派生集合).C和X是该衍生集合的两个属性.衍生集合的定义语句有如下要素组成:(1)集合的名称;(2)对应的初始集合;(3)集合的成员(可以省略不写明);(4)集合的属性(可以没有).定义衍生集合时可以用罗列的方式将衍生集合的成员一一列出来,如果省略不写,则默认衍生集合的成员取它所对应初始集合的所有可能的组合,上述衍生集合LINKS的定义中没有指明成员,而它对应的初始集合WH有6个成员,VD有8个成员,因此LINKS成员取WH和VD的所有可能组合,即集合LINKS有48个成员,48个成员可以排列成一个矩阵,其行数与集合WH的成员个数相等,列数与VD的成员个数相等.相应地,集合LINKS的属性C和X都相当于二维数组,各有48个分量,C表示货栈iw到客户jv的单位货物运价,X表示货栈iwiw到客户jv的运量.本模型完整的集合定义为:SETS:WH/W1..W6/:AI;VD/V1..V8/:DJ;LINKS(WH,VD):C:X;ENDSETS注集合定义部分以语句SETS:开始,一语句ENDSETS结束,这两个语句必须单独成一行.ENDSETS后面不加标点符号.2.数据初始化(数据段)以上集合中属性X(有48个分量)是决策变量,是待求未知数,属性AI、DJ和C(分别有6,8,48个分量)都是已知数,LINGO建模语言通过数据初始化部分来实现对已知属性赋以初始值,格式为:DATA:AI=60,55,43,41,52;DJ=35,37,22,32,41,32,43,38;C=6,2,6,7,4,2,5,94,9,5,3,8,5,8,25,2,1,9,7,4,3,37,6,7,3,9,2,7,12,3,9,5,7,2,6,55,5,2,2,8,1,4,3;