lingo编程
- 格式:doc
- 大小:45.00 KB
- 文档页数:17
lingo编程
启航系列之数学建模 启航系列之数学建模
培训资料 培训资料
Lindo 和 Lingo 是美国 Lindo 系统公司开发的一套专门用于求解最优化问题的软件
包。Lindo 用于求解线性规划和二次规划问题,Lingo 除了具有 Lindo 的全部功能外,还可以用于求解非线性规划问题,也可以用于一些线性和非线性方程(组)的求解,等等。Lindo 和 Lingo 软件的最大特色在于可以允许优化模型中的决策变量是整数(即整数规划),而且执行速度很快。
Lingo 实际上还是最优化问题的一种建模语言,包括许多常用的函数可供使用者建立优化
模型时调用,并提供与其他数据文件(如文本文件、Excel电子表格文件、数据库文件等)的
接口,易于方便地输入、求解和分析大规模最优化问题。
由于这些特点,Lindo系统公司的线性、非线性和整数规划求解程序已经被全世界数千万的公
司用来做最大化利润和最小化成本的分析。应用的范围包含生产线规划、运输、财务金融、
投资分配、资本预算、混合排程、库存管理、资源配置等等...
Lindo/Lingo 软件作为著名的专业优化软件,其功能比较强、计算效果比较好,与那些包 含部分优化功能的非专业软件相比,通常具有明显的优势。此外,Lindo/Lingo 软件使用起来非常简便,很容易学会,在优化软件(尤其是运行于个人电脑上的优化软件)市场占有很
大份额,在国外运筹学类的教科书中也被广泛用做教学软件。
1. Lingo
优化模型
连续优化 整数规划
优化模型 二次规划 非线性规划
2. lingo 例1 用Lingo解决一个二次规划问题
22max982770.32xxxxxx,,,,121122
xx,,100,12 ,stxx..2,,12
,xx,0,为整数,12
解:在lingo命令行中输入如下代码, x1+x2<=100;
!一个简单例子;
max=98*x1+277*X2-x1*x1-0.3*X1*x2-2*X2*x2;
x1-2*x2<=0; @gin(x1);@gin(x2);
按求解键得到结果如下,
Global optimal solution found.
Objective value: 11077.50
Extended solver steps: 0
Total solver iterations: 44
Variable Value Reduced Cost
X1 35.00000 -8.500002 X2 65.00000 -6.500004
在这个例子里要注意如下一些细节: 对本例结果的解释:
找到全局最优解,使得目标函数值为
xx,对应变量,的值分别为和,11077.50356512
对应变量xx,的影子价格分别为,。 ,8.500002,6.50000412
所谓的,就是指对应的变量增加1单位,其他变量无变化时目标函数改变的
单位数。
3. Lingo
(1)、尽量使用实数优化模型,尽量减少整数变量和整数约束;
(2)、尽量使用光滑优化模型,尽量避免使用非光滑函数。比如应尽量避免使用绝对
值函数,符号函数,求最大最小值函数,取整函数等;
(3)、尽量使用线性优化模型,尽量减少非线性约束和非线性变量的个数;
(4)、合理设定变量的上下界,尽可能给出变量的初始值;
(5)、模型中使用的单位的数量级要适当。系数最大数和最小数的绝对值超过1000倍以上会弹出警告信息。
4. Lingo
4.1 集合的基本用法和lingo模型的基本要素
Lingo虽然使用方便,但是如果要解决几万个,几十万个变量的优化问题时,我们总
不能一个一个地列出x1,x2,„,x1000来解决,而这样的问题在实际企业的应用中也是经
常遇到的。好在Lingo中设计了集合语言来表示大规模变量的输入,只需一行文字就可以 建立起含有大规模变量的目标函数和成千上万条约束。而Lingo的早期版本软件Lindo却不包含这样的功能。
现通过下例来对Lingo的集合、属性概念进行介绍。
例2 SAILCO公司需要决定决定下四个季度的帆船生产量。下四个季度的帆船需求量
分别为40条,60条,75条,25条,这些需求必须按时满足。每个季度正常的生产能力是
40条帆船,每条帆船的生产费用为400美元。如果加班生产,每条船的生产费用为450美元。每个季度末,每条船的库存费用为20美元。假定生产提前期为0,初始库存为10条船。如何安排生产可使总费用最小?
分析与解:用DEM、RP、OP、INV分别表示需求量,正常生产的产量,加班生产的产
量,库存量。则DEM、RP、OP、INV对每个季度都应有一个对应的值,也就是说他们都应
该是一个由4个元素组成的数组,其中DEM已知,而RP,OP,INV未知。现在我们可以写
出该问题的模型:
min{400()450()20()}.RPIOPIINVI,,,I,1,2,3,4
RPII()40,1,2,3,4;,,
INVIINVIRPIOPIDEMII()(1)()()(),1,2,3,4;,,,,,,
INV(0)10;,
此外还有各变量非负的约束。
记4个季度组成的集合QUARTERS,{1,2,3,4},他们就是DEM、RP、OP、INV等变量的下标集合,对于,,IQUARTERSDEMIRPIOPIINVI(),(),(),(),都有值与之对 应。LINGO正是充分利用这种数组及其下标的关系,引入了“集合”与“属性”的概念。
本例中我们把QUARTERS,{1,2,3,4}称之为,DEM、RP、OP、INV称为集合
QUARTERS,{1,2,3,4}具有的(即定义在该集合上的属性)。下图表示了这种集合与属性的关系。
集合QUARTERS的属性
DEM RP OP INV
1 2 3 4
集合QUARTERS
DEM DEM(1) DEM(2) DEM(3) DEM(4) 定义在集合RP RP(1) RP(2) RP(3) RP(4)
QUARTERS上OP OP(1) OP(2) OP(3) OP(4) 的属性 INV INV(1) INV(2) INV(3)
INV(4)
下面我们看看Lingo中具体如何定义集合及其属性。下面是例2的Lingo代码:
Model:
Sets:
QUARTERS/1,2,3,4/:DEM,RP,OP,INV;
Endsets
Min=@sum(QUARTERS:400*RP+450*OP+20*INV);
@for(QUARTERS(I):RP(I)<=40;);
@for(QUARTERS(I)|I#GT#1:
INV(I)=INV(I-1)+RP(I)+OP(I)-DEM(I););
INV(1)=10+RP(1)+OP(1)-DEM(1);
DATA: DEM=40,60,75,25;
Enddata
End
我们总结一下上面代码的特点:
(1)、模型以“MODEL:”开始,以“END”结束。它们之间由语句组成,可以分成三步
分。
(2)、集合定义部分以“SETS:”开始,以“ENDSETS”结束。中间定义了集合和相应属
性。语句“QUARTERS/1,2,3,4/:DEM,RP,OP,INV;”定义了集合QUARTERS,以及该集合的属性DEM、RP、OP、INV,其结果正是上表里面的16个变量名。可以定义空集合,比如“Empty set/1,2,3,4/;”空集合的用法将在派生集中讲述。
(3)、数据输入部分以“DATA:”开始,以“ENDDATA”结束,语句“DEM=40,60,75,25;”给出了常量DEM的值,即DEM(1)=40,DEM(2)=60,DEM(3)=75,DEM(4)=25. 语句“DEM=40,60,75,25;”也可以写成语句“DEM=40 60
75 25;”即数据之间可以用逗号或空格
分开。
(4)、其他部分,给出了目标函数和约束。其中目标函数(“min=”后面所接的表达式)
是用求和函数
“@sum(集合(下标)|指标过滤条件:关于集合的属性的表达式)”
的方式定义的,这个函数的功能是对语句冒号“:”后面的表达式,按照“:”前面的集合指
定的下标元素进行求和。本例中目标函数也可以写成 “Min=@sum(QUARTERS(i):400*RP(i)+450*OP(i)+20*INV(i))”
,而“QUARTERS(i)”相当于“”,而由于iQUARTERS,,这里“@sum”相当于求和符号
本例中已默认对所有的QUARTERS的元素求和,所以实例中可以将下标i省略。
约束是用循环函数“@for(集合(下标):关于集合的属性的约束关系式)”的方式定义的,意思是对于“:”前面的集合的每个元素(下标),冒号“:”后面的约束关系式都要成
立。但对于INVIINVIRPIOPIDEMII()(1)()()(),1,2,3,4,,,,,,这个约束,实际上I=1时要用到变量INV(0),但我们定义属性变量的时候是从I=1开始的,即INV(0)是一个常数,为了区别I=1和I=2,3,4,我们要将I=1的约束单独列出来,而对I=2,3,4的约束我们对集合下标做了的约束,即用了“#GT#1”(这个限制条件与集合之间有一个I,1
竖线“|”分开,称为过滤条件),“I#GT#1”就表示,“#GT#”是lingo中的逻辑表达式。 I,1
小结一下lingo模型最基本的组成要素:
(1) :以“SETS:”开始,以“ENDSETS”结束。作用在于定义必要的集
合和属性。注意一个细节,我们可以定义QUARTERS/1,2,3,4/,若QUARTERS
有1000个元素,我们也不必将其一一列出,而可以简写为
QUARTERS/1..1000/.
(2) :这部分不像其他部分,没有段的开始和结束的标记。因此
是除去其他段以外的所有语句。
(3) :以“DATA:”开始,以“ENDDATA”结束,作用在于对集合的属性
输入必要的常数数据,格式为: 属性=常数列表;常数列表中的常数或以