用LINGO软件求解“非线性规划”问题
实验二、利用Lingo求解整数规划及非线性规划问题

三、Lingo 循环编程举例
例5
sets: ren/A,B,C,D,E/:rent; job/1..5/:jobt; link(ren,job):time; endsets
!定义集合;
data: time=1,0.5,2,1.75,4
2,1,3,1.5,3.5 1.75,1.5,2.5,1,3 2.5,2,1.5,0.5,4 1,1.5,2,2,3; enddata
例 3 用Lingo软件求解非线性规划问题
min z x1 12 x2 22
x2 x1 1,
x1
x2
2,
x1
0,
x2
0.
Lingo 程序: min=(x1-1)^2+(x2-2)^2;
x2-x1=1;
x1+x2<=2;
注意: Lingo 默认变量的取值从0到正无穷大, 变量定界函数可以改变默认状态. @free(x): 取消对变量x的限制(即x可取任意实数值)
maxE=@max(students(i):English); !英语的最高分; averageM=@sum(students(i):Math)/4; !数学的平均分; @for(students(i):total(i)=Math(i)+English(i));
!每个学生数学与英语分数之和.
(4) 衍生集合的定义. 包括如下参数:
@for(yshu(j):@sum(bliang(i):x(i)*c(j,i))<=b(j));
!约束条件;
例6、指派问题
公司在各地有4项业务,选定了4位业务员去处理。由于 业务能力、经验和其它情况不同,4业务员去处理4项业 务的费用(单位:元)各不相同,见下表:
LINGO语言应用讲座

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求解整数规划及非线性规划问题

建立数学模型
根据问题要求,建立相应的数 学模型,包括变量、约束条件 和目标函数等。
设置求解参数
根据问题类型和规模,设置合 适的求解参数,如求解方法、 迭代次数等。
分析结果
对求解结果进行分析,验证模 型的正确性和可行性。
05 整数规划问题求解实例
问题描述
问题背景
本实验将通过一个具体的整数规划问题,展示如 何利用LINGO软件进行求解。该问题涉及到生产 计划优化,目标是最大化利润,同时满足一系列 约束条件。
非线性规划问题在数学、经济、工程等领域有广泛应用,是 优化理论的重要分支。
非线性规划问题的分类
01
按照目标函数的性质,非线性规划问题可以分为凸规
划和凹规划。
02
按照约束条件的性质,非线性规划问题可以分为无约
束、有界约束和等式约束三种类型。
03
按照决策变量的个数,非线性规划问题可以分为单变
量和多变量规划。
定义约束条件
使用LINGO的FROM命令定义约束条件,例 如FROM ... >= ... (P1,P2,...,Pn)。
LINGO求解过程及果分析
求解过程
在LINGO中输入模型,选择求解器类型(整数求解器或线性求解器),设置参数,运行求解过程。
结果分析
查看求解结果,包括最优解、最优值、松弛解等信息。对结果进行解释和评估,分析其对实际问题的 指导意义。
07 实验总结与展望
实验收获与体会
掌握整数规划和非线性规划的基本概念和求解方法
通过实验,我深入了解了整数规划和非线性规划的基本概念和求解方法,包括数学模型 建立、约束条件处理、目标函数处理等。
熟练使用LINGO软件
通过实验,我掌握了LINGO软件的基本操作和参数设置,能够利用LINGO软件求解整 数规划和非线性规划问题。
运筹学lingo实验报告(一)

运筹学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 软件简介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软件求解优化问题

x 2 y 2 z 30
3 x y 2 z 20
40
2x
y
10
z
50
x , y , z 0
• 2、求解非线性规划
m inf(x24y)2(12x)2
三、Lingo运算符和函数
1、运算符及其优先级
算术运算符 +-*/^
关系运算符 <(=) = >(=)
三、Lingo基本语法
1、定义了目标函数为MIN=.. MAX=.. 2、以一个分号“;”结尾
——除SETS, ENDSETS, DATA , ENDDATA, END之外 3、可以放在约束条件的右端,同时数字也可 放在约束条件的左端。 4、假定各变量非负。 5、注释:“!”
6、<、>为≤、≥
例1:加工奶制品的生产计 划
使用绝对值、符号函数、多个变量求最大/最小值、四舍 五入、取整函数等 • 尽量使用线性模型,减少非线性约束和非线性变量的个数 如x/y <5 改为x<5y • 合理设定变量上下界,尽可能给出变量初始值 • 模型中使用的参数数量级要适当
– 如小于103
练习
• 1、求解线性规划
min( 2 x 3 y 5 z )
SAS软件优化功能 其他
连续优化
离散:整数规划 IP: ILP PIP 0-1
线性规划 LP
二次规划 QP
非线性规划 NLP
LINDO
LINGO
优势:模型表述简单 求解引擎强大
数学规划模型
• 决策变量 x =(x1, x2, …, xn ) • 目标函数 Min Z = f (x)
• 约束条件 s.t x A ( Rn )
5、Options 7个选 项卡
LINGO使用说明(比较简单)

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中使用LINDO模型
优化建模
④ 运行程序的LINGO报告窗口(如下图)
注:LINGO不询问是否进行敏感性分析,敏感性分析 需要将来通过修改系统选项启动敏感性分析后,再调 用“REPORT|RANGE”菜单命令来实现。现在同样可 以把模型和结果报告保存在文件中。
优化建模
一个简单的LINGO程序
例 直接用LINGO来解如下二次规划问题:
Max98x127x72x120.3x1x22x22 1
s.t. x1x2100
2
x12x2
3
x1,x20 为整数
4
输入窗口如下:
程序语句输入的备注:
max=98*x1+277*x2-x1^2-0.3*x1*x2-2*x2^2;
优化建模
•LINGO总是根据“MAX=”或“MIN=”寻找目标函数。
IN(V0)10
加上变量的非负约束
优化建模
注:LINDO中没有数组,只能对每个季度分别定义变量, 如正常产量就要有RP1,RP2,RP3,RP4 4个变量等。 写起来就比较麻烦,尤其是更多(如1000个季度)的时候。
记四个季度组成的集合QUARTERS={1,2,3,4}, 它们就是上面数组的下标集合,而数组DEM,RP,OP, INV 对集合QUARTERS中的每个元素1,2,3,4分别对应于 一个值。LINGO正是充分利用了这种数组及其下标的关 系,引入了“集合”及其“属性”的概念,把 QUARTERS={1,2,3,4}称为集合,把DEM,RP,OP, INV称为该集合的属性(即定义在该集合上的属性)。
集合及其属性
• QUARTERS集合的属性
• DEM
• RP
优化建模
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
+ +
c12 c22
+ +
c13 c23
+ c14 + c24
+ c15 + c16 ≤ 20 ⎫ + c25 + c26 ≤ 20⎭⎬
⇒
6
cij ≤ ei
j =1
( j = 1, ..., 6) (i = 1, 2)
用LINGO9.0求解,首先分析此问题中的向量和矩阵,有: (1) 3 个 6 维向量:a, b, d; (2) 3 个 2 维向量:p, q, e,其中 p 和 q 表示题目中给出的最初暂定的两个料场的坐标; (3) 1 个 2×6 调度矩阵:c.
⎧
⎪⎪cij ≥ 0
⎪⎪c11 ⎪c12 s.t.⎪⎪⎪⎨cc1143
+ + + +
c21 c22 c23 c24
=3 =5 =4 =7
⎫ ⎪ ⎪ ⎪⎪ ⎬ ⎪
⇒
c1 j + c2 j
= dj
2
∑ ⇒ cij = d j
i=1
⎪⎪c15
+
c25
=
6
⎪ ⎪
⎪c16 + c26 = 11⎪⎭
∑ ⎪⎪c11
用 LINGO 软件求解“非线性规划”问题
丁老师(超盾博客) 一. 选址问题(选取位置,使总运量最小)
例 某工程,6个工地同时开工,每个工地的位置 M i (ai , bi ) ,距离值(单位:km)、水泥日
需求量 d (t) (单位:吨)由下表给出:
Mi
M1
M2
M3
M4
M5
M6
ai
1.25 8.75 0.5 5.75
i(程序j)
M1
M2
M3
M4
M5
M6
工地坐标
ai (程序a(j)) bi (程序b(j))
1.25 8.75 0.5 5.75 3 7.25
1.25 0.75 4.75 5
6.5 7.75
需求
d (t) (程序d(j))
3
5
4
7
6
11
demand
假设:(1) P( p1 , p2 ) 、 Q(q1, q2 ) 为料场;
(2) 从P调 c1 j 吨水泥到 M j ,从Q调 c2 j 吨水泥到 M j (1表示P,2表示Q),j = 1, … ,6.
∑ “总吨·公里”的表示方法:“总: ; 吨:c; 公里:两点间距”,目标函数是“非
线性”的,根据上述“总吨·公里”的表示方法得到“非线性”规划模型:
min f = c11 ( p1 − 1.25)2 + ( p2 −1.25)2 + c12 ( p1 − 8.75)2 + ( p2 − 0.75)2 + c13 ( p1 − 0.5)2 + ( p2 − 4.75)2 + c14 ( p1 −1.25.75)2 + ( p2 − 5)2 + c15 ( p1 − 3)2 + ( p2 − 6.5)2 + c16 ( p1 − 7.25)2 + ( p2 − 7.75)2 + c21 (q1 −1.25)2 + (q2 − 1.25)2 + c22 (q1 − 8.75)2 + (q2 − 0.75)2 + c23 (q1 − 0.5)2 + (q2 − 4.75)2 + c24 (q1 − 5.75)2 + (q2 − 5)2 + c25 (q1 − 3)2 + (q2 − 6.5)2 + c26 (q1 − 7.25)2 + (q2 − 7.75)2
b = 1.25, 0.75, 4.75, 5, 6.5, 7.75;
d = 3, 5, 4, 7, 6, 11;
e = 20, 20;
enddata
init:
! 迭代初始点;
p = 5, 2;
q = 1, 7;
endinit
! link(i, j) : c(i, j) 表示 2×6 调度矩阵; ! [obj] 表示在结果中标注目标函数所在行代码;
3
7.25
bi
Hale Waihona Puke 1.25 0.75 4.75 5
6.5 7.75
d (t) 3
5
4
7
6
11
目前暂定2个临时料场位于P(5,1)、Q(2,7)用于存储水泥,日储量20吨。假设从料场到工地之 间均可开通直线道路相连。试寻找更好的料场位置,使得总运输量(吨·公里)更小。 解 将题目和表格进行整理得到:
6个工地
Variable
Value
Reduced Cost
P( 1)
3.254883
0.000000
P( 2)
7.250000
0.8084079E-07
Q( 1)
5.652332
0.000000
Q( 2)
7.750000
0.2675276E-06
P(1)、P(2)、Q(1)、Q(2)的值即为对初始点(题给最初临时料场)优化迭代后得到的料
场的选取,即料场选取在 P( p1 , p2 ) = P(3.254883, 5.652332)与 Q(q1, q2 ) = Q(7.250000, 7.750000)比较好。注意:程序中的P(1)对应数学式中的 p1 ,但程序中 的P(2)对应的是数学式中的 q1 而不是 p2 。
[obj]min = @sum( link(i, j) : c(i, j) * ( ( p(i) - a(j) )^2 + ( q(i)
- b(j) )^2 )^(1/2) );
! 先变i后变j;
@for( demand(j) : [demand_con]@sum( supply(i) : c(i, j) ) = d(j); );
! 先变j后变i;
@for( supply(i) : [supply_con]@sum( demand(j) : c(i, j) ) <= e(i); );
@for( supply(i) : @free(x); @free(y); ); ! 所有变量可取负值;
end
点击保存后,按“Ctrl + S”运行得到结果: Objective value: 85.26604 (即:总运输量为85.26604吨·公里)
LINGO总程序:
sets:
demand/1..6/ : a, b, d; supply/1..2/ : p, q, e; link(supply, demand) : c;
! 3个6维向量; ! 3个2维向量; ! 1个2×6调度矩阵;
endsets
data:
a = 1.25, 8.75, 0.5, 5.75, 3, 7.25;