lingo使用教程解析
• LINDO 中包含了建模语言和许多常用的数学函数(包 括大量概论函数),可供使用者建立规划问题时调用。
• 一般用LINDO(Linear Interactive and Discrete Optimizer)解决线性规划
• 最大规模的模型的非零系数可以达到1,000,000个,
• 最大变量个数可以达到100,000个,最大目标函数和约束 条件个数可以达到32000个,
给模型加注标题和行号
TITLE "This is a maximum profit problem"
MAX
4 X1 + X2 - X3 + 2 X4
ST
RESOURCE) X1 - X2 + X3 - X4 < 30
SALE) 3 X1 + X2 - X3 + 2 X4 < 36
STORAGE) X1 + 2 X2 + X3 - 2 X4 < 20
练习:混合泳接力队员选择问题
cij
i=1
i=2
i=3
i=4
i=5
j=1
66.8
57.2
78
70
67.4
j=2
75.6
66
67.8
74.2
71
j=3
87
66.4
84.6
69.6
83.8
j=4
58.6
53
59.4
57.2
62.4
若选择队员i参加泳姿j 的比赛,记xij=1, 否则记xij=0
目标 函数
• 不等号用"<"表示"≤",用">"表示"≥"。要注意的是 当模型(用 LOOK 命令)输出(到屏幕或打印机)时,不 等号分别写成"<="和">="。
• 目标函数中不能出现常数项,也不能出现等式,例如: MAX 2X1+3X2+5 和 MAX Z=2X1+3X2都是非法
的。
• 目标函数(第一行)或约束条件中,都不能出现括号、乘号。例 如:MAX 2(X1+X2) 和 MIN 2*X1+3*X2都是非法的。
Lindo,Lingo软件使用简介
北京信息科技大学理学院数学系 黄静静
Lindo简介
• LINDO 是专门用于求解数学规划的软件包。LINDO 执行速度很快、易于方便输入,因此在数学、科研和 工业界得到广泛应用。
• LINDO 主要用于解线性规划、二次规划。也可以用于 线性方程组的求解以及代数方程求根等。
• GO
模型运行
• QUIT 退出LINDO,返回操作系统
MAX 5.24X1+7.3X2+8.34X3+4.18X4 SUBJECT TO 1.5X1+X2+2.4X3+X42000 X1+5X2+X3+3.5X48000 1.5X1+3X2+3.5X3+X45000 X1,X2,X3,X40
MAX 5.24X1+7.3X2+8.34X3+4.18X4
i 1
xij 0或1
求解程序见 zhipai.lg4
sets: flight/1..6/; assign(flight,flight): c,x; endsets data: c = 20 15 16 5 4 7
17 15 33 12 8 6 9 12 18 16 30 13 12 8 11 27 19 14 -99 7 10 21 10 32 -99 -99 -99 6 11 13; enddata max = @sum(assign: c*x); @for(flight(i): @sum(flight(j):x(i,j))=1); @for(flight(j): @sum(flight(i):x(i,j))=1);
45
材料
3
4
5
30
产品利润(元/件)
3
1
4
问题:1)确定获利最大的产品生产计划; 2)产品 A 的利润在什么范围内变动时,上述最优计划不变?(5 分) 3) 如果劳动力数量不增,材料不足时可从市场购买,每单位 0.4 元, 问该厂要不要购进原材料扩大生产,以购多少为宜?(10 分)
例1.1 如何在LINGO中求解如下的LP问题: Lingo程序如下: model: max = 2*x1+3*x2; x1+x2>=350; x1>=100; 2*x1+x2<=600; end
endsets
LINGO生成了三个父集的所有组合共八组作为allowed集的成员。列表如下:
编号
成员
1
1
(A,M,1)
2
2
(A,M,2)
3
3
(A,N,1)
4
4
(A,N,2)
5
5
(B,M,1)
6
6
(B,M,2)
7
7
(B,N,1)
8
8
(B,N,2)
成员列表被忽略时,派生集成员由父集成员所有的组合构成,称为稠密集。
MonthM..MonthN
MonthYearM..MonthYe arN
Oct..Jan Oct2001..Jan2002
Oct,Nov,Dec,Jan
Oct2001,Nov2001,Dec2001 ,Jan2002
定义派生集
sets: product/A B/; machine/M N/; week/1..2/; allowed(product,machine,week):x;
ST
!"ST"也可以写"SUBJECT TO"
1.5X1+1.0X2+2.4X3+1.0X4<2000
1.0X1+5.0X2+1.0X3+3.5X4<8000
1.5X1+3.0X2+3.5X3+1.0X4<5000
END
!END结束MAX命令状态。
!变量非负约束X1,X2,X3,X4>=0是隐含的,不必也不能输入
• LINGO有两种类型的集:原始集(primitive set)和派 生集(derived set)。
基本集合,派生集合
• 一个原始集是由一些最基本的对象组成的。
• 一个派生集是用一个或多个其它集来定义的, 也就是说,它的成员来自于其它已存在的集。
• 集部分是LINGO模型的一个可选部分。在LINGO 模型中使用集之前,必须在集部分事先定义。 集部分以关键字“sets:”开始,以“endsets” 结束。一个模型可以没有集部分,或有一个简 单的集部分,或有多个集部分。一个集部分可 以放置于模型的任何地方,但是一个集及其属 性在模型约束中被引用之前必须定义了它们。
• 最大整数变量个数可以达到100,000个。
• LINDO 6 .1 学生版至多可求解多达300 个变量和150 个 约束的规划问题。
LINDO 初步操作
• MAX 开始输入一个极大化模型
• MIN
开始输入一个极小化模型
• TITL 输入模型标题
• EDIT 全屏幕输入或全屏幕编辑一个模型
• LOOK 在屏幕上显示已输入的模型
• 模 型 中 关 键 词 只 能 是 MAX ( 或 MIN ) , ST ( 或 SUBJECT TO )和 END。关键词中不能含有空格。 MAX ( 或 MIN ), ST (或 SUBJECT TO )的右面至少 要有一个空格,关键词中字符大写和小写都合法的。
• 变量名不超过8个字符,其中第一个字符必须定字母, 其余的可以是字母或数字。
Lingo 中的集合
• 集是一群相联系的对象,这些对象也称为集的成员。 一个集可能是一系列产品、卡车或雇员。每个集成员 可能有一个或多个与之有关联的特征,我们把这些特 征称为属性。属性值可以预先给定,也可以是未知的, 有待于LINGO求解。例如,产品集中的每个产品可以有 一个价格属性;卡车集中的每辆卡车可以有一个牵引 力属性;雇员集中的每位雇员可以有一个薪水属性, 也可以有一个生日属性等等。
45
Min Z
单模型可省略 • Lingo不区分大小写,变量名不超过32个字符,
以字母开头
Lingo中的常用函数()
• @bin(x)
限制x为0或1
• @bnd(L,x,U) 限制L≤x≤U
• @free(x)
取消对变量x的默认下
界为0的限制,即x可以取任意实数
• @gin(x)
限制x为整数
• @if(x#eq#0,100,0) 如果x=0,就返回100, 否则 ,返回0
• LINGO也接受一些特定的首成员名和末成员名,用于创 建一些特殊的集。列表如下:
隐式成员列表 1..n
1..5
示例
所产生集成员 1,2,3,4,5
StringM..StringN
Car2..car14
Car2,Car3,Car4,…,Car14
DayM..DayNFra bibliotekMon..Fri
Mon,Tue,Wed,Thu,Fri
Lindo,Lingo主要区别
• 目标函数表示方式从max变成了max= • ST在Lingo中不再需要 • 在每个系数与变量之间增加了运算(不能省略) • 每行(目标,约束和说明语句)后增加了‘;’ • 约束的名字放在一对[ ]中,不是在 )中 • Lingo中模型与model: 开始,以end 结束 ,对简
• 除关键字中间,系数中间,变量名中间不能嵌入空格外,模型 的其他地方都允许出现空格和回车<CR>。在模型输入时,空 格和回车是等效的。