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≥ 60x3+x4≥ 50x4+x5≥ 20x5+x6≥ 30x1,x2,⋯,x6≥ 0
LINGO程序如下:
MODEL:
min = x1+x2+x3+x4+x5+x6;
x1 + x6 >= 60;
x1 + x2 >= 70;
x2 + x3 >= 60;
x3 + x4 >= 50;
x4 + x5 >= 20;
x5 + x6 >= 30;
END
2、办业务
公司在各地有4项业务,选定了4位业务员去处理。由于业务能力、经验和其他情况不同,4位业务员处理4项业务的费用(单位:元)各不相同,见表二。
业务员 | 业务 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
1 | 1100 | 800 | 1000 | 700 | |
2 | 600 | 500 | 300 | 800 | |
3 | 400 | 800 | 1000 | 900 | |
4 | 1100 | 1000 | 500 | 700 |
表二 业务的费用表
应当怎样分派任务,才能使总得费用最小?
- 解
0 | 0 | 0 | 1 |
---|---|---|---|
0 | 1 | 0 | 0 |
1 | 0 | 0 | 0 |
0 | 0 | 1 | 0 |
解答示意图
这是一个最优指派问题,引入如下变量:
x
i
j
=
{
1
分
派
第
i
个
人
做
第
j
项
任
务
0
不
分
派
第
i
个
人
做
第
j
项
任
务
x_{ij}=\begin{cases} 1\ \ \ \ \ 分派第i个人做第j项任务\\ \\ 0\ \ \ \ \ 不分派第i个人做第j项任务\\ \end{cases}
xij=⎩⎪⎨⎪⎧1 分派第i个人做第j项任务0 不分派第i个人做第j项任务
设
矩
阵
A
4
∗
4
为
指
派
矩
阵
,
其
中
a
(
i
,
j
)
为
第
i
个
业
务
员
做
第
j
项
业
务
的
业
务
费
。
设矩阵A_{4*4}为指派矩阵,其中a(i,j)为第i个业务员做第j项业务的业务费。
设矩阵A4∗4为指派矩阵,其中a(i,j)为第i个业务员做第j项业务的业务费。
则可建立优化模型及LINGO程序
m
i
n
Z
=
∑
i
=
1
4
∑
j
=
1
4
a
i
j
x
i
j
min\ Z=\sum_{i=1}^{4}\sum_{j=1}^{4}a_{ij}x_{ij}
min Z=i=1∑4j=1∑4aijxij
s
.
t
.
{
∑
i
=
1
4
x
i
j
=
1
j
=
1
,
2
,
3
,
4
∑
j
=
1
4
x
i
j
=
1
i
=
1
,
2
,
3
,
4
x
i
j
=
0
或
1
i
,
j
=
1
,
2
,
3
,
4
s.t.\begin{cases} \sum_{i=1}^{4}x_{ij}=1\ \ j=1,2,3,4\\ \\ \sum_{j=1}^{4}x_{ij}=1\ \ i=1,2,3,4\\ \\ x_{ij}=0或1\ \ \ \ \ \ i,j=1,2,3,4\\ \end{cases}
s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧∑i=14xij=1 j=1,2,3,4∑j=14xij=1 i=1,2,3,4xij=0或1 i,j=1,2,3,4
LINGO程序如下:
MODEL:
SETS:
person/1..4/;
task/1..4/;
assign(person, task):a, x;
ENDSETS
DATA:
a = 1100, 800, 1000, 700, 600, 500, 300, 800, 400, 800, 1000, 900, 1100, 1000, 500, 700;
ENDDATA
min=@sum(assign:a * x);
@for(task(j):@sum(person(i):x(i,j)) = 1);
@for(person(i):@sum(task(j):x(i,j)) = 1);
@for(assign(i,j):@bin(x(i,j)));
END
采用数据文件方式编程:
MODEL:
SETS:
person/1..4/;
task/1..4/;
assign(person, task):a, x;
ENDSETS
DATA:
a = @file(data.txt);
ENDDATA
min=@sum(assign:a * x);
@for(task(j):@sum(person(i):x(i,j)) = 1);
@for(person(i):@sum(task(j):x(i,j)) = 1);
@for(assign(i,j):@bin(x(i,j)));
END
同时在LINGO目录下建立文本文件data.txt,数据如下:
1100, 800, 1000, 700
600, 500, 300, 800
400, 800, 1000, 900
1100, 1000, 500, 700
3、生产规划
有四种资源被用于生产三种产品,资源量、产品单件可变费用、单件售价、资源单耗量及组织三种商品生产的固定费用见下表。现要求制定一个生产计划,使总收益最大。
产品 | ||||
资源 | Ⅰ | Ⅱ | Ⅲ | 资源量 |
A | 2 | 4 | 8 | 500 |
B | 2 | 3 | 4 | 300 |
C | 1 | 2 | 3 | 100 |
D | 3 | 5 | 7 | 700 |
单件可变费用 | 4 | 6 | 12 | |
固定费用 | 100 | 150 | 200 | |
单件售价 | 7 | 10 | 20 |
表3 数据详细表
- 解
设 x j 是 第 j 种 产 品 的 产 量 , j = 1 , 2 , 3. 设\,x_j是第\,j种产品的产量,j=1,2,3. 设xj是第j种产品的产量,j=1,2,3.
设 y j = { 1 生 产 第 j 种 产 品 ( x j > 0 ) 0 不 生 产 第 j 种 产 品 ( x j = 0 ) 设\,y_j=\begin{cases} 1\ \ 生产第\,j\,种产品(\,x_j > 0\,)\\ \\ 0\ \ 不生产第\,j\,种产品(\,x_j = 0\,)\\ \end{cases} 设yj=⎩⎪⎨⎪⎧1 生产第j种产品(xj>0)0 不生产第j种产品(xj=0)
第 Ⅰ 种 产 品 销 售 一 件 可 收 入 7 − 4 = 3 元 第\ Ⅰ\ 种产品销售一件可收入\ 7-4=3\ 元 第 Ⅰ 种产品销售一件可收入 7−4=3 元
第 Ⅱ 种 产 品 销 售 一 件 可 收 入 10 − 6 = 4 元 第\ Ⅱ\ 种产品销售一件可收入\ 10-6=4\ 元 第 Ⅱ 种产品销售一件可收入 10−6=4 元
第 Ⅲ 种 产 品 销 售 一 件 可 收 入 20 − 12 = 8 元 第\ Ⅲ\ 种产品销售一件可收入\ 20-12=8\ 元 第 Ⅲ 种产品销售一件可收入 20−12=8 元
则 问 题 的 整 数 规 划 模 型 如 下 则问题的整数规划模型如下 则问题的整数规划模型如下
m a x Z = 3 x 1 + 4 x 2 + 8 x 3 − 100 y 1 − 150 y 2 − 200 y 3 max\ Z=3 x_1 + 4 x_2 + 8 x_3 -100 y_1 - 150 y_2 - 200 y_3 max Z=3x1+4x2+8x3−100y1−150y2−200y3
s . t . { 2 x 1 + 4 x 2 + 8 x 3 ≤ 500 2 x 1 + 3 x 2 + 4 x 3 ≤ 300 x 1 + 2 x 2 + 3 x 3 ≤ 100 3 x 1 + 5 x 2 + 7 x 3 ≤ 700 x 1 ≤ M 1 y 1 x 2 ≤ M 2 y 2 x 3 ≤ M 3 y 3 x j ≥ 0 且 为 整 数 , j = 1 , 2 , 3 y j = 0 或 1 , j = 1 , 2 , 3 M j 为 x j 的 某 个 上 界 , 可 取 M = 150 s.t.\begin{cases} 2 x_1 + 4 x_2 + 8 x_3 \leq 500 \\ 2 x_1 + 3 x_2 + 4 x_3 \leq 300\\ \ \ x_1 + 2 x_2 + 3 x_3 \leq 100\\ 3 x_1 + 5 x_2 + 7 x_3 \leq 700\\ x_1 \leq M_1y_1\\ x_2 \leq M_2y_2\\ x_3 \leq M_3y_3\\ x_j \geq 0 \ 且为整数, \ j=1,2,3\\ y_j = 0或1, \ j=1,2,3\\ \end{cases}\\ M_j\ 为\ x_j的某个上界, 可取M=150 s.t.⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧2x1+4x2+8x3≤5002x1+3x2+4x3≤300 x1+2x2+3x3≤1003x1+5x2+7x3≤700x1≤M1y1x2≤M2y2x3≤M3y3xj≥0 且为整数, j=1,2,3yj=0或1, j=1,2,3Mj 为 xj的某个上界,可取M=150
LINGO程序如下:
MODEL:
DATA:
M = 150;
ENDDATA
max = 3*x1 + 4*x2 + 8*x3 - 100*y1 - 150*y2 - 200*y3;
2*x1 + 4*x2 + 8*x3 <= 500;
2*x1 + 3*x2 + 4*x3 <= 300;
x1 + 2*x2 + 3*x3 <= 100;
3*x1 + 5*x2 + 7*x3 <= 700;
x1 <= M*y1; x2 <= M*y2; x3 <= M*y3;
@GIN(x1); @GIN(x2); @GIN(x3); !指定产品件数为整数;
@BIN(y1); @BIN(y2); @BIN(y3); !指定0-1变量;
END
笔记内容来源于" 中国大学MOOC 数学建模(西北工业大学) 第一章 第三讲"