用LINGO软件求解“非线性规划”问题
- 格式:pdf
- 大小:135.00 KB
- 文档页数:3
LINGO 语言应用讲座(一)Lingo 解方程、求极值以及简单规划问题例1求解非线性方程组⎪⎩⎪⎨⎧=+++=+4222222y y x x y x其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 ,则该问题的数学模型为 目标函数 21300200m ax x x z +=.约束条件 ⎪⎪⎩⎪⎪⎨⎧=≥≤+≤≤.2,1,0,1602,120,1002121i x x x x x i其LINGO 代码如下:Model:MAX=200*X1+300*X2; X1<=100; X2<=120;X1+2*X2<=160; EndGlobal optimal solution found.Objective value: 29000.00 Total solver iterations: 0Variable Value Reduced Cost X1 100.0000 0.000000 X2 30.00000 0.000000Row Slack or Surplus Dual Price 1 29000.00 1.0000002 0.000000 50.000003 90.00000 0.0000004 0.000000 150.0000该报告说明:运行2步找到全局最优解,目标函数值为29000,变量值分别为X1=100,X2=30.“Reduced Cost ”的含义是缩减成本系数(最优解中变量的Redced Cost 值自动取零),“Row ”是输入模型中的行号,“Slack or Surplus ”的意思为松弛或剩余,即约束条件左边与右边的差值,对于“<=”不等式,左边减右边的差值称为Surplus (剩余),当约束条件的两边相等时,松弛或剩余的值为零,如果约束条件无法满足,即没有可行解,则松弛或剩余的值为负数.“Dual price ”的意思是影子价格,上面报告中Row 2的松弛值为0,意思是第二行的约束条件,即第一条生产线的最大生产能力已经到达饱和状态(100个),影子价格为50,含义是:如果该生产线最大生产能力增加1,能使目标函数值,即利润增加50,;报告中Row3的松弛值为90,表示按照最优解安排生产(X20=30),则第三行的约束条件,即第条生产线的最大值不起作用,故影子价格为0; 例3 求解非线性规划问题4321max x x x x z +++=, ⎪⎪⎪⎩⎪⎪⎪⎨⎧≥≥≥≥≤+++≤++≤+≤.0,0,0,0,4.5321.121.1331.1,4841.121.1,4401.1,400..43214321321211x x x x x x x x x x x x x x t s其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.求函数)ln cos 5.1()(3x x x x e x f x++=-在区间(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年校基金会希望获得最佳的基金使用计划,以提高每年的奖金额,请在M=5000万元、n=5年的情况下设计具体存款方案.解 分析:假设首次发放奖金的时间是在基金到位后一年,一行每隔一年发放一次,每年发放的时间大致相同,小基金会希望获得最佳的基金使用计划,一提高每年的奖金额,且在n 年末仍保留原基金数额M ,实际上n 年中发放的奖金总额全部来自与利息.如果全部基金都存为一年定期,每年都用到期利息发放奖金,则每年的奖金数为5000*0.018=90万,这是没有优化的存款方案.显然,准备在两年后使用的款项应当存成两年定期,必存两次一年定期的收益高,以此类推.目标是合理分配基金的存款方案,使得n 年的利息总额最多.定义 收益比0432.1%16.212=+=a .按照银行存款税后利率表计算得到个存款年限对应的最优收益比见表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,,,x x x 表示,其中521,,,x x x 分别存成1-5年定期,到期后本息合计用于当年发放奖金,6x 存5年定期,到期的本息合计等于原基金总数M.用S 表示每年用于奖励优秀师生的奖金额,用i a 表示第i 年的最优收益比. 目标函数是每年的奖金额最大,即max S.约束条件有3个:①各年度的奖金数额相等;②奖金总数为M ;③n 年末保留原基金总额M.于是得到模型如下: max S ,⎪⎪⎩⎪⎪⎨⎧=∑====.,,5,,2,1,..6561M x a M x i S x a t s i i i i (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;Global optimal solution found.Objective value: 135.2227Total solver iterations: 0Variable Value Reduced CostS 135.2227 0.000000X1 132.8317 0.000000X2 129.6230 0.000000X3 125.4664 0.000000X4 123.2479 0.000000X5 118.2016 0.000000X6 4370.629 0.000000M 5000.000 0.000000Row Slack or Surplus Dual Price1 135.2227 1.0000002 0.000000 -0.21105483 0.000000 -0.20595654 0.000000 -0.19935225 0.000000 -0.19582736 0.000000 -0.18780937 0.000000 -0.18780938 0.000000 0.40266319 0.000000 0.2148538例6某公司6个供货栈,库存货物总数分别为60,55,51,43,41,52,现由8个客户各要一批货,数量分别为35,37,22,32,42,32,43,38,各供货栈到8个客户处的单位货物运输价见表2表2供货栈到客户的单位货物运价(元/每单位)试确定各货栈到各客户的货物调运数量,使总的运费最小.解 引入决策变量ij x ,代表从第i 个货栈到第j 个客户的货物运量.用符号ij c 表示从第i 个货栈到第j 个客户的单位货物运价,i a 表示第i 个货栈的最大供货量,i d 表示第j 个客户的订货量.目标函数是总运输费用最小.约束条件有三条:①各货栈运出的货物总量不超过其库存数;②各客户收到的货物总量等于其订货数量;③决策变量ij x 非负.则本问题的数学模型为:∑∑===6181min i j ijij x c z ,⎪⎪⎪⎩⎪⎪⎪⎨⎧==≥==∑=≤∑==.8,,2,1,6,,2,1,0,8,,2,1,,6,,2,1,..6181 j i x j d x i a x t s ij j i ij i j ij(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个分量)表示各客户的需求量.以上两个集合称为初始集合(或称基本集合,原始集合),初始集合的属性都相当一维数组.为了表示数学模型中从货栈到客户的运输关系以及与此相关的运输单价ij c 和运量ij x ,再定义一个表示运输关系(路线)的集合: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 表示货栈i w 到客户j v 的单位货物运价,X 表示货栈i w i w 到客户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,9 4,9,5,3,8,5,8,2 5,2,1,9,7,4,3,3 7,6,7,3,9,2,7,1 2,3,9,5,7,2,6,5 5,5,2,2,8,1,4,3; ENDDATA注 数据初始化部分以语句DATA :开始,以语句ENDDATA 结束,这两个语句必须单独成一行.数据之间的逗号和空格可以互相替换.3.目标函数和约束条件 目标函数表达式∑∑===6181mini j ij ij x c z 用LINGO 语句表示为:MIN=@SUM(LINKS(I,J):C(I,J)*X(I,J));式中@SUM 是LINGO 提供的内部函数,其作用是对某个集合的所有成员,求指定表达式的和,该函数需要两个参数,第一个参数是集合名称,指定对该集合的所有成员求和,如果此集合是一个初始集合,它有m 个成员,则求和运算对这m 个成员进行,相当于求∑=mi 1,第二个参数是一个表达式,表示求和运算对该表达式进行.此处@SUM 的第一个参数是LINKS(I,J),表达式求和运算对衍生集合LINKS 进行,该集合的维数是2,共有48个成员,运算规则是:先对48个成员分别求表达式C(I,J)*X(I,J)的值,然后求和,相当于求∑∑==6181i j ij ij x c ,表达式中的C 和X 是集合LINKS 的两个属性,它们各有48个分量.注 如果表达式中参与运算的属性属于同一个集合,则 @SUM 语句中索引(相当于矩阵或数组的下标)可以省略(隐藏),假如表达式中参与运算的属性属于不同的集合,则不能省略属性的索引.本例的目标函数可以表示成:MIN= (LINKS:C*X);约束条件)6,,2,1(81 =≤∑=i a x ij ij 实际上表示了6个表达式,用LINGO 语言表示该约束条件,语句为:@FOR(WH(I):@SUM(VD(J):X(I,J))<=AI(I));语句中的@FOR 是LINGO 提供的内部函数,它的作用是对某个集合的所有成员分别生成一个约束表达式,它有两个参数,第一个参数为WH ,它表示货栈,共有6个成员,故应生成6个约束表达式, @FOR 的第二个参数为是约束表达式的具体内容,此处再调用@SUM 函数,表示约束表达式的左边求和,是对集合VD 的8个成员,并且对表达式X(I,J)中第二维J 求和,即∑=81j ij x ,约束表达式的右边是集合WH 的属性AI ,它有个约束表达式一一对应.本语句中的属性分别属于不同的集合,所以不能省略索引I,J.注 @SUM 和@FOR 函数可以嵌套使用.同样地,约束条件8,,2,1,61 ==∑=j d x j j ij 用LINGO 语句表示为:@FOR(VD(J):@SUM(WH(I):X(I,J))=DJ(J)); 4. 完整的模型综上所述,本问题完整的LINGO 模型如下: MODEL: SETS:WH/W1..W6/:AI; VD/V1..V8/:DJ; LINKS(WH,VD):C,X; ENDSETS 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;ENDDATAMIN=@SUM(LINKS(I,J):C(I,J)*X(I,J)); !目标函数;@FOR(WH(I):@SUM(VD(J):X(I,J))<=AI(I)); !约束条件;@FOR(VD(J):@SUM(WH(I):X(I,J))=DJ(J));END注 LINGO模型以语句MODEL:开始,以语句END结束,这两个语句单独成一行.完整的模型由集合定义、数据段、目标函数和约束条件等部分所组成,这几个部分的先后次序无关紧要,!开头的语句是注释语句(可有可无).选菜单Lingo|Solve(或按Ctrl+S),或鼠标点击“求解”按钮,在“Solution Report”信息窗口中,看到具体求解结果为:Global optimal solution found at step: 17(计算步骤数)Objective value: 664.0000(目标函数值)Variable Value Reduced Cost(以下是调运方案) X(W1,V1) 0.0000000 5.000000X(W1,V2) 19.00000 0.000000……(以上省略了X(W1,V3)至X(W6,V6)的具体数值)X(W6,V7) 3.000000 0.000000X(W6,V8) 0.0000000 3.000000计算结果表明:目标函数值为664.0000,最优运输方案见表1.2.2.表1.2.2 最优运输方案问题:1.用LINGO 求解下列方程组的所有实数解:(1)⎩⎨⎧=+-=+.09.075.0,1322y x y x (2)⎩⎨⎧=+++=+.42,22222y y x x y x 2. 已知方程组⎪⎩⎪⎨⎧-=++=,9002600,)1300(13750022y y x u u y 且22236≤+y x ,其中x,y 是变量,u 是常数,问u 在什么范围内时该方程组有解?若u=1.2,求该方程组的解.3. 用LINGO 求解下列线性规划:(1)432181026m ax x x x x z +++=,⎪⎪⎩⎪⎪⎨⎧=≥≤++-≤++-≤--+.4,,1,0,10324,258233,204465..432143214321 i x x x x x x x x x x x x x t s i (2)65432181121110913m ax x x x x x x z +++++=,⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧=≥≤++≤++=+=+=+.6,,1,0,9003.12.15.0,8001.14.0,500,600,400..654321635241 i x x x x x x x x x x x x x t s i4.求解下列非线性规划:(1)21m in x x z --=,⎪⎩⎪⎨⎧≤≤≤≤+-+-≤++-≤.40,30,369688324,2882..21121314122131412x x x x x x x x x x x t s 5.用LINGO 求函数x x x x x x x f sin 502.05.1202.09)(5432++-+-=在区间(2,8)内的极小值点和极小值6.求函数)ln cos 5.1()(3x x x x e x f x ++=-在区间(0.2,4)内的极小点和极小值以及极大值点和极大值..(提示:sinx 表示为@sin(x), cosx 示为 @cos(x), lnx 表示为 @log(x), e x 表示为@exp(x))(本资料素材和资料部分来自网络,仅供参考。
运筹学lingo实验报告(一)运筹学lingo实验报告介绍•运筹学是一门研究在给定资源约束下优化决策的学科,广泛应用于管理、工程、金融等领域。
•LINGO是一种常用的运筹学建模和求解软件,具有丰富的功能和高效的求解算法。
实验目的•了解运筹学的基本原理和应用。
•掌握LINGO软件的使用方法。
•运用LINGO进行优化建模和求解实际问题。
实验内容1.使用LINGO进行线性规划的建模和求解。
2.使用LINGO进行整数规划的建模和求解。
3.使用LINGO进行非线性规划的建模和求解。
4.使用LINGO进行多目标规划的建模和求解。
实验步骤1. 线性规划•确定决策变量、目标函数和约束条件。
•使用LINGO进行建模,设定目标函数和约束条件。
•运行LINGO求解线性规划问题。
2. 整数规划•在线性规划的基础上,将决策变量的取值限制为整数。
•使用LINGO进行整数规划的建模和求解。
3. 非线性规划•确定决策变量、目标函数和约束条件。
•使用LINGO进行非线性规划的建模和求解。
4. 多目标规划•确定多个目标函数和相应的权重。
•使用LINGO进行多目标规划的建模和求解。
实验结果•列举各个实验的结果,包括最优解、最优目标函数值等。
结论•运筹学lingo实验是一种有效的学习运筹学和应用LINGO的方法。
•通过本实验能够提高对运筹学概念和方法的理解,并掌握运用LINGO进行优化建模和求解的技能。
讨论与建议•实验过程中是否遇到困难或问题,可以进行讨论和解决。
•提出对于实验内容或方法的建议和改进方案。
参考资料•提供参考书目、文献、教材、网站等资料,以便学生深入学习和研究。
致谢•对与实验指导、帮助或支持的人员表示感谢,如老师、助教或同学等。
以上为运筹学lingo实验报告的基本框架,根据实际情况进行适当调整和补充。
实验报告应简洁明了,清晰表达实验目的、内容、步骤、结果和结论,同时可以加入必要的讨论和建议,以及参考资料和致谢等信息。
LINGO 软件简介LINGO 软件是一个处理优化问题的专门软件,它尤其擅长求解线性规划、非线性规划、整数规划等问题.一个简单示例有如下一个混合非线性规划问题:⎪⎩⎪⎨⎧≥≤≤+++---+为整数2132121321322212121,;0,,210022..15023.027798max x x x x x x x x x x t s x x x x x x x .LINGO 程序模型:max =98x1+277x2-x1^2-0.3x1x2-2x2^2+150x3; x1+2x2+2x3<=100; x1<=2x2;gin x1;gin x2; Lingo 默认变量非负注意:binx 表示x 是0-1变量;ginx 表示x 是整数变量;bndL,x,U表示限制LxU ;freex 表示取消对x 的符号限制,即可正、可负.结果:Global optimal solution found.Objective value: 9561.200 Extended solver steps: 0 Total solver iterations: 45 Variable Value Reduced CostX1 6.000000 -76.70000X2 31.00000 -151.2000X3 16.00000 -150.0000Row Slack or Surplus Dual Price1 9561.200 1.0000002 0.000000 0.0000003 56.00000 0.000000———————— 非常简单在LINGO 中使用集合为了方便地表示大规模的规划问题,减少模型、数据表示的复杂程度,LINGO 引进了“集合”的用法,实现了变量、系数的数组化下标表示.例如:对⎪⎪⎩⎪⎪⎨⎧==-++-==≤++∑=.,,;10)0(;4,3,2,1),()())()1()(;4,3,2,1,20)(..)}(20)(450)(400{min4,3,2,1均非负INV OP RP INV I I DEM I OP I RP I INV I INV I I RP t s I INV I OP I RP I求解程序:model :sets :mark/1,2,3,4/:dem,rp,op,inv;也可以vmark/1..4/:dem,rp,op,inv;endsetsmin=sum mark:400rp+450op+20inv;也可以markI:400rpI+450opI+20invI;for markI: rpI<40;for markI|Igt1: invI=invI-1+rpI+opI-demI;inv1=10+rp1+op1-dem1;data:dem=40,60,75,35;enddataend上面程序在model…end之间有1集合定义、2数据输入和3其他三部分内容.集合定义部分从sets:到endsets:定义了一个指标集合mark可以理解为数组下标及其范围和其4个属性dem、rp、op、inv用此向量的数组变量.数据输入部分从data:到enddata依次给出常量dem的值.其他部分:给出优化目标及约束.一般而言,LINGO中建立优化模型的程序可以由五部分组成,或称为五段section:1集合段SETS:这部分以“SETS:”开始,以“ENDSETS”结束,作用在于定义必要的集合变量SET及其元素member,含义类似于数组的下标和属性attribute,含义类似于数组.2目标与约束段:这部分实际上定义了目标函数、约束条件等,但这部分没有段的开始和结束标记;该段一般常用到LINGO内部函数,尤其是和集合相关的求和函数SUM和循环函数FOR等.3数据段DATA:这部分以“DATA:”开始,以“ENDDATA”结束,作用在于对集合的属性数组输入必要的常数数据.格式为:attribute属性=value_list常数列表;常数列表中的数据之间可以用逗号、空格或回车符分隔.如果想要在运行时才对参数赋值,可以在数据段使用输入语句,其格式为“变量名=;”,但仅限对单个变量赋值,而不能用于属性变量数组的单个元素.4初始段INIT:这部分以“INIT:”开始,以“ENDINIT”结束,作用在于对集合的属性数组定义初值因为求解算法一般是迭代算法,提供一个较好的初值,能提高计算效果.定义初值的语句格式为:attribute属性=value_list常数列表;这与数据段中的用法类似.5计算段CALC:这部分以“CALC:”开始,以“ENDCALC”结束,作用在于对一些原始数据进行预处理加工,使其成为模型直接需要的数据.该段中通常是计算赋值语句.基本集合与派生集合为了处理二维数组变量等有多个下标的问题,LINGO引入了“派生集”的概念.我们把直接列出元素的指标集合叫“基本集合”,而基于其他集合派生出来的二维或多维指标集合称为“派生集”.派生集的定义格式为:派生集名原始集合1,原始集合2,…,原始集合n:属性变量列表;实际上就是笛卡儿积的意思,即:派生集={i1,i2, (i)n| i1集合1, i2集合2,…, in集合n}.1一个应用例子布局问题:某些建筑工地的位置用平面坐标a,b表示及水泥日用量d已知.现有A、B两临时料场位于P5,1、Q2,7,日储量20.问A、B两料场分别向各工地运输多少吨水泥,使总吨公里数最小若重新安排两料场的位置,应怎样安排才能使总吨公里数最小这样安排可节省多少吨公里设工地位置ai ,bi,水泥日用量为dii=1,2,…,6;料场位置xi,yi,日储量ej,j=1,2;从料场j向工地i运送量为cij.该问题的数学模型为:LINGO求解程序为:MODEL:sets:Imark/1..6/:a,b,d;Jmark/1,2/:x,y,e;IJmarkImark,Jmark:c;endsetsdata:Location for demand需求点位置;a=1.25,8.75,0.5,5.75,3,7.25;b=1.25,0.75,4.75,5,6.5,7.75;Quantities of the demand and supply供需量;d=3,5,4,7,6,11;e=20,20;enddatainit:Initial location for the supply初始点;x,y=5,1,2,7;endinitObjective function目标;OBJ min=sum IJmarki,j: ci,jxj-ai^2+yj-bi^2^1/2; demand contraints需求约束;for Imarki:DEMAND_CON SUM Jmarkj:ci,j=di;; supply constrains供给约束;for Jmarkj:SUPPLY_CON SUM Imarki:ci,j<=ej;;for Jmark: free x;free y;;2一个动态规划的例子:最短路问题从S城市到T城市之间找一条最短路径,道路情况如下:数学模型为:LINGO求解程序:model:sets:cities/s,a1,a2,a3,b1,b2,c1,c2,t/:L; 属性Li表示城市S到城市i的最优行驶路线的里程;roadscities,cities/ 派生集合roads表示的是网络中的道路;s,a1 s,a2 s,a3 由于并非所有城市间都有道路直接连接,所以将路具体列出;a1,b1 a1,b2 a2,b1 a2,b2 a3,b1 a3,b2b1,c1 b1,c2 b2,c1 b2,c2 属性Di,j是城市i到城市j的直接距离已知;c1,t c2,t/:D;endsetsD= 6 3 36 5 8 67 46 7 8 95 6;L=0,,,,,,,,; 因为Ls=0;enddatafor citiesi|igt index s: 这行中"indexs"可以直接写成"1";Li=min roadsj,i:Lj+Dj,i;; 这就是最短路关系式;endVariable ValueL S0.000000L A16.000000L A23.000000L A33.000000L B110.00000L B27.000000L C115.00000L C216.00000L T20.00000最短路径为: S-〉A3-〉B2-〉C1-〉T3指派问题设有6个人做6件事.其中cij表示第i人做第j事的收益;设第i人做第j事时xij =1,否则xij=0.该问题的规划模型:说明:其中“-”表示某人无法做该事.可令其为-表示绝对不行或0领薪不用干活LINGO求解程序:MODEL:sets:Imark/1..6/:i;Jmark/1..6/:j;IJmarkImark,Jmark:c,x;endsetsdata:第i人做第j事的收益;c=20,15,16,5,4,717,15,33,12,8,69,12,18,16,30,1312,8,11,27,19,14-99,7,10,21,10,32-99,-99,-99,6,11,13;enddataOBJ max=sum IJmarki,j: cx;每人做一项工作;for Imarki: SUM Jmarkj:xi,j=1;;每事一人做;for Jmarkj: SUM Imarki:xi,j=1;;for IJmark: bin x;本约束可以不要,因为有解时必为0或1; END4生产与销售计划问题某公司用两种原油A 和B 混合加工成两种汽油甲和乙.甲、乙两种汽油含原油A 的最低比例分别为50%和60%,每吨售价分别是4800元和5600元.该公司现有原油A 和B 的库存量分别为500吨和1000吨,还可以从市场上买到不超过1500吨的原油A.原油A 的市场价为:购买量不超500吨时单价为10000元/吨;购买量超过500吨但不超1000吨时,超过500吨部分单价为8000元/吨;购买量超过1000吨部分的单价是6000元/吨.该公司应如何安排原油的采购和加工以获得最大利润数学模型: 设原油A 用于生产甲、乙两种汽油的数量分别是x11和x12,原油B 用于生产甲、乙两种汽油的数量分别是x21和x22;购买原油A 的数量是x 吨,采购支出为cx 千元/吨.为了处理分段函数cx,将原油采购量x 分解为对应价格10千元/吨的采购量x1、对应对应价格8千元/吨的采购量x2和对应价格6千元/吨的采购量x3,它们应满足:0)500(21=-x x 表示要么x1=500要么x2=0,即x1的量不达到500时x2=00)500(32=-x x 表示要么x2=500要么x3=0,即x2的量不达到500时x3=0此时采购支出3216810)(x x x x c ++=模型改变为:LINGO 求解程序:model :init:x1=500;x2=500;x3=0;x12=1500;x22=1000;x11=0;x21=0;endinitmax=4.8x11+4.8x21+5.6x12+5.6x22-10x1-8x2-6x3; x11+x12<=x+500;x21+x22<=1000;0.5x11-0.5x21>=0;0.4x12-0.6x22>=0;x=x1+x2+x3;x1-500x2=0;x2-500x3=0;bnd0,x1,500;bnd0,x2,500;bnd0,x3,500;。
Lingo介绍Lingo是美国LINDO系统公司(Lindo Symtem Inc)开发的求解数学规划系列软件中的一个(其他软件为LINGDO,GINO,What’s Best等),它的主要功能是求解大型线性、非线性和整数规划问题,目前的版本是lingo11.0。
lingo分为Demo、solve suite、hyper、industrial、extended等六类不同版本,只有Demo版本是免费的,其他版本需要向LINDO系统公司(在中国的代理商)购买,Lingo的不同版本对模型的变量总数、非线性变量个数、整型变量个数和约束条件的数量做出不同的限制(其中extended版本无限制)。
Lingo的主要功能特色为:(1)既能求解线性规划,也有较强的求解非线性规划的能力;(2)输入模型简练直观;(3)运行速度快、计算能力强;(4)内置建模语言,提供几十种内部函数,从而能以较少语句,较直观的方式描述较大规模的优化模型;(5)将集合的概念引入编程语言,很容易将实际问题转换为Lingo语言;(6)能方便地与excel、数据库等其他软件交换数据。
学校图书馆40本《lingo和excel在数学建模中的应用》,袁新生、邵大宏、郁时炼主编,科学出版社Lingo 程序设计简要说明在数学建模中会遇到如规划类的题型,在这种模型中总存在着一个目标,并希望这个目标的取值尽可能的大或小,同时与这个目标有关的一系列变量之间存在一些约束。
在构造出目标函数和约束条件的表达式后,我们需要对求出这个最值和各变量的取值。
一般我们用LINGO 来对模型进行求解,本文将通过举一个简单的例子,围绕这个例子逐步学习LINGO 的使用。
LINGO 只是一个求解工具,我们主要的任务还是模型的建立! 当你在windows 下开始运行LINGO 系统时,会得到类似下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。
LINGO的使用简介LINGO软件是美国的LINGO系统公司开发的一套专门用于求解最优化问题的软件包.LINGO除了能够用于求解线性规划和二次规划外,还可以用于非线性规划求解、以及一些线性和非线性方程(组)的求解等.LINGO软件的最大特色在于它允许优化模型中的决策变量为整数,即可以求解整数规划,而且执行速度快.LINGO是用来求解线性和非线性优化问题的简易工具.LINGO内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO高效的求解器可快速求解并分析结果.在这里仅简单介绍LINGO的使用方法.LINGO(Linear INteractive and General Optimizer )的基本含义是交互式的线性和通过优化求解器.它是美国芝加哥大学的 Linus Schrage 教授于1980年开发了一套用于求解最优化问题的工具包,后来经过完善成何扩充,并成立了LINDO系统公司.这套软件主要产品有:LINDO,LINGO,LINDO API和What’sBest.它们在求解最优化问题上,与同类软件相比有着绝对的优势.软件有演示版和正式版.正式版包括:求解包(solver suite)、高级版(super)、超级版(hyper)、工业版(industrial)、扩展版(extended).不同版本的LINGO对求解问题的规模有限制,如附表3-1所示.附表3-1 不同版本LINGO对求解规模的限制版本类型总变量数整数变量数非线性变量数约束数演示版 300 30 30 150求解包 500 50 50 250高级版 2000 200 200 1000超级版 8000 800 800 4000工业版 32000 3200 32000 16000扩展版无限无限无限无限3.1 LINGO程序框架LINGO可以求解线性规划、二次规划、非线性规划、整数规划、图论及网络最优化问题和最大最小求解问题,以及排队论模型中最优化等问题.一个LINGO程序一般会包括以下几个部分:(1) 集合段:集部分是LINGO模型的一个可选部分.在LINGO模型中使用集之前,必须在集部分事先定义.集部分以关键字“sets:”开始,以“endsets”结束.一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分.一个集部分可以放置于模型的任何地方,但是一个集及其属性在模型约束中被引用之前必须先定义.(2)数据段:在处理模型的数据时,需要为集部分定义的某些元素在LINGO求解模型之前为其指定值.数据部分以关键字“data:”开始,以关键字“enddata"结束.(3) 目标和约束段:这部分用来定义目标函数和约束条件等.该部分没有开始和结束的标记.主要是要用到LINGO的内部函数,尤其是与集合有关的求和与循环函数等.(4)初始段:这个部分要以关键字“INIT:”开始,以关键字“ENDINIT"结束,它的作用是对集合的属性定义一个初值.在一般的迭代算法中,如果可以给一个接近最优解的初始值,会大大减少程序运行的时间.(5)数据预处理段:这一部分是以关键字“CALC:”开始,以关键字“ENDCALC”结束.它的作用是把原始数据处理成程序模型需要的数据,它的处理是在数据段输入完以后、开始正式求解模型之前进行的,程序语句是按顺序执行的.3.2 LINGO中集合的概念在对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群体、交通工具和雇工等等.LINGO允许把这些相联系的对象聚合成集(sets).一旦把对象聚合成集,就可以利用集来最大限度地发挥LINGO建模语言的优势.现在将深入介绍如何创建集,并用数据初始化集的属性.3.2。
LINGO 操作入门LINGO 是用来求解线性和非线性优化问题的简易工具。
LINGO 内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO 高效的求解器可快速求解并分析结果。
当你在windows 下开始运行LINGO 系统时,会得到类似下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。
在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO 的默认模型窗口,建立的模型都都要在该窗口内编码实现。
下面举两个例子。
例1.1 如何在LINGO 中求解如下的LP 问题:,6002100350..32min 212112121≥≤+≥≥++x x x x x x x t s x x在模型窗口中输入如下代码: min =2*x1+3*x2; x1+x2>=350; x1>=100;2*x1+x2<=600;然后点击工具条上的按钮 即可。
>=和<=可写成>和<一个表达式可写成多行,如 min=2*x1 +3*x2;LINGO WINDOWS 命令文件菜单(File Menu ) 1. 新建(New )从文件菜单中选用“新建”命令、单击“新建”按钮或直接按F2键可以创建一个新的“Model”窗口。
在这个新的“Model”窗口中能够输入所要求解的模型。
2. 打开(Open )从文件菜单中选用“打开”命令、单击“打开”按钮或直接按F3键可以打开一个已经存在的文本文件。
这个文件可能是一个Model 文件。
3. 保存(Save)从文件菜单中选用“保存”命令、单击“保存”按钮或直接按F4键用来保存当前活动窗口(最前台的窗口)中的模型结果、命令序列等保存为文件。
4. 另存为...(Save As ...) 从文件菜单中选用“另存为...”命令或按F5键可以将当前活动窗口中的内容保存为文本文件,其文件名为你在“另存为...”对话框中输入的文件名。
Lingo超经典案例大全LINGO是Linear Interactive and General Optimizer的缩写,即“交互式的线性和通用优化求解器”。
Lingo超强的优化计算能力在很多方面(线性规划、非线性规划、线性整数规划、非线性整数规划、非线性混合规划、二次规划等)比matlab、maple等强得多,Lingo编程简洁明了,数学模型不用做大的改动(或者不用改动)便可以直接采用Lingo语言编程,十分直观。
Lingo模型由4个段构成:(1)集合段(sets endsets);(2)数据段(data enddata);(3)初始段(init endinit);(4)目标与约束段。
Lingo的五大优点:1. 对大规模数学规划,LINGO语言所建模型较简洁,语句不多;2. 模型易于扩展,因为@FOR、@SUM等语句并没有指定循环或求和的上下限,如果在集合定义部分增加集合成员的个数,则循环或求和自然扩展,不需要改动目标函数和约束条件;3. 数据初始化部分与其它部分语句分开,对同一模型用不同数据来计算时,只需改动数据部分即可,其它语句不变;4. “集合”是LINGO有特色的概念,它把实际问题中的事物与数学变量及常量联系起来,是实际问题到数学量的抽象,它比C语言中的数组用途更为广泛。
5. 使用了集合以及@FOR、@SUM等集合操作函数以后可以用简洁的语句表达出常见的规划模型中的目标函数和约束条件,即使模型有大量决策变量和大量数据,组成模型的语句并不随之增加.一、求解线性整数规划、非线性整数规划问题:1.线性整数规划:model:max=x1+x2;x1+9/14*x2<=51/14;-2*x1+x2<=1/3;@gin(x1);@gin(x2);end求得x1=3,x2=1,最大值为4.运用matlab求时可以发现有两组解:x1=3,x2=1和x1=2,x2=2。
通过验证也可知这两组解均满足。
Lingo超经典案例大全LINGO是Linear Interactive and General Optimizer的缩写,即“交互式的线性和通用优化求解器”。
Lingo超强的优化计算能力在很多方面(线性规划、非线性规划、线性整数规划、非线性整数规划、非线性混合规划、二次规划等)比matlab、maple等强得多,Lingo 编程简洁明了,数学模型不用做大的改动(或者不用改动)便可以直接采用Lingo语言编程,十分直观。
Lingo模型由4个段构成:(1)集合段(sets endsets);(2)数据段(data enddata);(3)初始段(init endinit);(4)目标与约束段。
Lingo的五大优点:1. 对大规模数学规划,LINGO语言所建模型较简洁,语句不多;2. 模型易于扩展,因为@FOR、@SUM等语句并没有指定循环或求和的上下限,如果在集合定义部分增加集合成员的个数,则循环或求和自然扩展,不需要改动目标函数和约束条件;3. 数据初始化部分与其它部分语句分开,对同一模型用不同数据来计算时,只需改动数据部分即可,其它语句不变;4. “集合”是LINGO有特色的概念,它把实际问题中的事物与数学变量及常量联系起来,是实际问题到数学量的抽象,它比C语言中的数组用途更为广泛。
5. 使用了集合以及@FOR、@SUM等集合操作函数以后可以用简洁的语句表达出常见的规划模型中的目标函数和约束条件,即使模型有大量决策变量和大量数据,组成模型的语句并不随之增加.一、求解线性整数规划、非线性整数规划问题:1.线性整数规划:model:max=x1+x2;x1+9/14*x2<=51/14;-2*x1+x2<=1/3;@gin(x1);@gin(x2);end求得x1=3,x2=1,最大值为4.运用matlab求时可以发现有两组解:x1=3,x2=1和x1=2,x2=2。
通过验证也可知这两组解均满足。