赞
踩
LINGO是一种专门用于求解数学规划问题的软件包。由于LINGO执行速度快,易于方便地输入、求解和分析数学规划问题,因此在教学、科研和工业界得到广泛应用。LINGO主要用于求解线性规划、非线性规划、二次规划和整数规划等问题,也可以用于求解一些线性和非线性方程组及代数方程求根等。
LINGO模型以 MODEL 开始,以 END 结束。中间为语句,分为四大部分。
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;
attribute = value_listattribute = value_listLINGO建立优化模型时可以引用大量内部函数,这些函数以" @ "符号打头。
@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的最小值用法如下:
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)@MAX(set_name: expression)@MIN(set_name: expression)@SUM(set_name: expression)@SIZE(set_name)@IN(set_name, set_element)变量函数对变量的取值范围附加限制,共有四种:
@BND(L, X, U) 限制L ≤ X ≤ U@BIN(X) 限制X为0或1@FREE(X) 取消对X的符号限制(可取任意实数值)@GIN(X) 限制X为整数值某昼夜服务的公交路线每天各时间区段内所需司机和乘务人员见表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 |
表一 班次表
设司机和乘务人员分别在各时间区段一开始上班,并连续工作八小时,问该公交线路至少配备多少名司机和乘务人员?从第一班开始排,试建立线性模型
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
公司在各地有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}=
设
矩
阵
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.
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
有四种资源被用于生产三种产品,资源量、产品单件可变费用、单件售价、资源单耗量及组织三种商品生产的固定费用见下表。现要求制定一个生产计划,使总收益最大。
| 产品 | ||||
| 资源 | Ⅰ | Ⅱ | Ⅲ | 资源量 |
| 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 数据详细表
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 数学建模(西北工业大学) 第一章 第三讲"
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。