LINGO是一种专门用于求解数学规划问题的软件包。由于LINGO执行速度快,易于方便地输入、求解和分析数学规划问题,因此在教学、科研和工业界得到广泛应用。LINGO主要用于求解线性规划、非线性规划、二次规划和整数规划等问题,也可以用于求解一些线性和非线性方程组及代数方程求根等。
目录
一、LINGO使用介绍
1.1 LINGO编写格式
LINGO模型以 MODEL 开始,以 END 结束。中间为语句,分为四大部分。
(1)集合部分 (SETS)
- 这部分以"SETS:"开始,以"ENDSETS"结束。
- 这部分的作用在于定义必要的变量,便于后面进行编程进行大规模计算,在 LINGO 中称为集合(SET)及其元素和属性。
- LINGO中的集合有两类:一类是原始集合,其定义的格式为:
SETNAME/member list(or 1..n )/: attribute, attribute, etc.
- 另一类是导出集合,即引用其它集合定义的集合,其定义的格式为:
SETNAME(set1, set2, etc.): attribute, attribute, etc.
- 如果要在程序中使用数组,就必须在该部分定义,否则可不需要, 如
Person/1..10/:A; Task/1..12/:B; Link(Person, Task):X;
(2)目标与约束
- 这部分定义了目标函数、约束条件等。一般要用到LINGO的内部函数。求解优化问题时,该部分是必须的。
(3)数据部分 (DATA)
- 这部分以"DATA: "开始,以"END DATA"结束。
- 其作用在于对集合的属性(数组)输入必要的数值, 方便数据的输入。
- 格式为:
attribute = value_list
(4)初始化部分 (INT)
- 这部分以"INIT: "开始,以"END INIT"结束。
- 作用在于对集合的属性(数组)定义初值。
- 格式为:
attribute = value_list
编写LINGO程序要注意的几点
- 所有的语句除SETS、ENDSETS、DATA、ENDDATA、INIT、ENDINIT和MODEL、END之外必须以一个分号" ;"结尾。
- LINGO求解非线性规划时已约定各变量非负
1.2 LINGO内部函数使用详解
LINGO建立优化模型时可以引用大量内部函数,这些函数以" @ "符号打头。
(1)常用数学函数
@ABS(X)
返回变量X的绝对数值@SIN(X)
返回X的正弦值,X的单位为弧度@COS(X)
返回X的余弦值,X的单位为弧度@TAN(X)
返回X的正切值,X的单位为弧度@EXP(X)
返回指数函数值,其中e=2.72828…@FLOOR(X)
向0靠近返回X的整数部分@LGM(X)
返回γ函数的自然对数值@LOG(X)
返回变量X的自然对数值@SIGN(X)
返回变量x的符号值,当X<0时为-1;当X>0时为1@SMAX(X)
返回一列值X1, X2,…, XN的最大值@SMAX(X)
返回一列值X1, X2,…, XN的最小值
(2)集合函数
-
用法如下:
set_operator(set_name|condition: expression)
-
其中 set_operator 是集合函数名,set_name 是数据集合名,expression 部分是表达式,|condition部分是条件,用逻辑表达式描述(无条件时可省略)。
-
逻辑表达式中可以用
三种逻辑算符:
#AND#
(与),#OR#
(或),#NOT#
(非)
和六种关系算符:
#EQ#
(等于),#NE#
(不等于),#GT#
(大于),#GE#
(大于等于),#LT#
(小于),#LE#
(小于等于)
-
-
常见的集合函数
@FOR(set_name: constraint_expressions)
对集合(set_name)的每个元素独立地生成约束,约束由约束表达式(constraint_expressions)描述@MAX(set_name: expression)
返回集合上表达式(expression)的最大值@MIN(set_name: expression)
返回集合上表达式(expression)的最小值@SUM(set_name: expression)
返回集合上表达式(expression)的和@SIZE(set_name)
返回数据集(set_name)中包含元素的个数@IN(set_name, set_element)
如果数据集(set_name)中包含元素set_element,则返回1,否则返回0
(3)变量界定函数
变量函数对变量的取值范围附加限制,共有四种:
@BND(L, X, U)
限制L ≤ X ≤ U@BIN(X)
限制X为0或1@FREE(X)
取消对X的符号限制(可取任意实数值)@GIN(X)
限制X为整数值
二、LINGO求解优化模型实例
1、公交车排班
某昼夜服务的公交路线每天各时间区段内所需司机和乘务人员见表1
班次 | 时间 | 最少需要人数 |
---|---|---|
1 | 6:00 - 10:00 | 60 |
2 | 10:00 - 14:00 | 70 |
3 | 14:00 - 18:00 | 60 |
4 | 18:00 - 22:00 | 50 |
5 | 22:00 - 2:00 | 20 |
6 | 2:00 - 6:00 | 30 |
表一 班次表
设司机和乘务人员分别在各时间区段一开始上班,并连续工作八小时,问该公交线路至少配备多少名司机和乘务人员?从第一班开始排,试建立线性模型
- 解
设 x i 为 第 i 班 报 到 人 员 ( i = 1 , 2 , ⋯ , 6 ) , 可 得 到 目 标 函 数 和 约 束 条 件 设\ x_i\ 为第\ i\ 班报到人员(i=1,2,\cdots,6),可得到目标函数和约束条件 设 xi 为第 i 班报到人员(i=1,2,⋯,6),可得到目标函数和约束条件
m i n Z = ∑ i = 1 6 x i min\ Z=\sum_{i=1}^{6}x_i min Z=i=1∑6xi
s . t . { x 6 + x 1 ≥ 60 x 1 + x 2 ≥ 70 x 2 + x 3 ≥ 60 x 3 + x 4 ≥ 50 x 4 + x 5 ≥ 20 x 5 + x 6 ≥ 30 x 1 , x 2 , ⋯ , x 6 ≥ 0 s.t.\begin{cases} x_6 + x_1 \geq\ 60\\ x_1 + x_2 \geq\ 70\\ x_2 + x_3 \geq\ 60\\ x_3 + x_4 \geq\ 50\\ x_4 + x_5 \geq\ 20\\ x_5 + x_6 \geq\ 30\\ x_1,x_2,\cdots,x_6 \geq\ 0 \end{cases} s.t.⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧x6+x1≥ 60x1+x2≥ 70x2+x3≥ 60x