附录B Lingo软件初步(第2版21)(2)

2019-08-31 21:11

数学建模

例B6 写出例B4中最短路径问题的Lingo模型的数据段.

data: d=2 1 8

6 1 7 9 5 1 2 3 9 4 6 3;

L=0,,,,,,,;!对L进行赋值,后面的“,”代表未知的L值,其个数需与L的剩余成员个数相一致; enddata

B3 Lingo的运算符和函数

Lingo是一种编程语言,它提供了三种运算符,即算术运算符、逻辑运算符和关系运算符. 为了方便的编写Lingo模型,Lingo软件也提供了大量的内部函数,这些函数均以@开始.

B3.1 运算符

除了B1中所介绍的5种算术运算符,Lingo软件还提供了丰富的逻辑运算符编写Lingo模型,具体见附表2.1,这些逻辑运算符通常在生成稀疏集时作为过滤条件使用.

Lingo软件提供了三个关系运算符,用于表示优化模型的约束条件,分别为:=(等于),<=(小于等于)和>=(大于等于).由于数学规划中的约束条件中一般没有严格小于或严格大于关系,所以Lingo默认“<”等同于“?”,“>”等同于“?”.

对Lingo软件的上述三类运算符,其运算优先级见附表2.2(其中同一优先级按从左到右的顺序执行;若有括号,则优先计算括号内的表达式).

附表2.1 逻辑运算符

指令 #EQ# #GT# #LT# #NOT# #OR# 含义 判断左右两端是否相等 判断左端是否严格大于右端 判断左端是否严格小于右端 非运算 或运算 指令 #NE# #GE# #LE# #AND# 附表2.2 三类运算符的优先级

优先级 最高 最低 运算符 #NOT#,-(负号) ^ *,/ +,-(减法) #EQ#,#NE#,#GT#,#GE#,#LT#,#LE# #AND#,#OR# < ,= , > 含义 判断左右两端是否不等 判断左端是否大于等于右端 判断左端是否小于等于右端 与运算 例B7 已知两个分别含有4个和6个成员的基本集var和col,以其为父集,利用过滤

253

数学建模

条件生成一个稀疏集,要求稀疏集中成员有序数对(s,t)(s?var,t?col)满足s?t且s?1.

sets: var/1..4/; col/1..6/;

mat(var,col)|(&1#GE#&2)#AND#(&1#NE#1); endsets

B3.2 基本数学函数和变量定界函数

Lingo软件提供了丰富的数学函数,用于编写Lingo模型,具体见附表2.3.

附表2.3 基本数学函数

名称 含义 正弦函数 余弦函数 正切函数 绝对值函数 名称 含义 名称 含义 返回list的最小值 返回list的最大值 指数函数xy @sin(x) @cos(x) @tan(x) @abs(x) @exp(x) @log(x) @floor(x) @sign(x) 指数函数(以e为底) @smin(list) 自然对数函数 朝0方向取整函数 @smax(list) @pow(x,y) 符号函数,当x<0时返回-1,当x?0时,返回1 除了上述数学函数,Lingo软件还提供了一些变量定界函数,专门处理数学规划问题中

的特殊变量或者对变量的取值范围加以限制,常用的有4种,见附表2.4.

附表2.4 变量定界函数

名称 @bnd(a,x,b) @bin(x) @gin(x) @free(x) 含义 定界函数,限制决策变量满足a?x?b. 0-1决策变量函数,限制决策变量x为0-1变量,其取值只为0或者1. 整数变量函数, 限制决策变量x整数变量,其取值只能为整数 取消决策变量x的非负限制. 例B8 利用Lingo软件求解下面整数规划.

min z?3x1?7x2?x3?x4s.. 2tx1?x2?x3?x4?1 x1?x2?6x3?4x4?8 5x1?3x2?x4?5 1?x4?3,x4?Z? x1,x2,x3??0,1?编写Lingo模型如下:

model:

min=3*x1+7*x2-x3+x4; 2*x1-x2+x3-x4>=1;

x1-x2+6*x3+4*x4>=8; 5*x1+3*x2+x4>=5; @bnd(1,x4,3);

@bin(x1);@bin(x2);@bin(x3); @gin(x4);

end

254

数学建模

运行得最优解为x?(1,0,1,1)T,最小值为3.

B3.3 集循环函数

集循环函数是指对集中的成员(下标)进行循环操作的函数,其使用格式为:

@function(set_name[(set_index_list)[|condition]]:expression_list);

其中function是集循环函数名,set_name和expression_list为其参数,前者是集名,表示对该集的所有成员(或满足过滤条件condition的成员)进行某些运算,后者给出运算的具体内容.集名中的参数set_index_list称为集索引(相当于矩阵或数组元素的下标),当表达式参与运算的属性属于同一个集时,该参数可省略.

Lingo软件提供了5个集循环函数:for, max, min, prod, sum;其含义分别见附表2.5.

附表2.5 集循环函数

名称 @for函数 @max函数 @min函数 @prod函数 @sum函数 含义 将运算expression_list循环独立作用于集set_name的每个满足过滤条件的成员. 返回集set_name上的表达式expression_list的最大值. 返回集set_name上的表达式expression_list的最小值. 返回集set_name上的表达式expression_list的积. 返回集set_name上的表达式expression_list的和. 基于所定义的集循环函数,可以在Lingo模型中编写数学规划问题的目标函数和约束条件,其内容构成Lingo模型的第3个基本要素,称为目标与约束段.集段,数据段和目标与约束段构成Lingo模型的最基本要素,利用这三大要素可求解大部分的数学规划问题.

例B9 利用三个基本要素构建Lingo模型,求解例B8的整数规划(求解结果略). 解 利用集段,数据段和目标约束段构建Lingo模型如下:

model: sets:

row/1..4/:c,x; col/1..3/:b; matrix(col,row):A; endsets

min=@sum(row:c*x); @for(col(i):@sum(row(j):A(i,j)*x(j))>=b(i));

@for(row(j)|j#LE#3:@bin(x(j))); @bnd(1,x(4),3); @gin(x(4));

data:

c=3,7,-1,1;b=1,8,5; A=2,-1,1-1 1,-1,6,4 5,3,0,1; enddata

end

Lingo模型的基本要素除了前面的集段,数据段和目标与约束段外,还包括一个“初始

255

数学建模

段和计算段.其中初始段(init)以“init:”开始,以“endinit”结束,主要用于对集的属性定义初值.其定义格式为:attribute(属性)=value_list(常数列表);计算段(calc)则以“calc:”开始,以“endcalc”结束,用于对一些原始数据进行计算预处理,它在数据段的数据输入完成之后,Lingo开始正式求解模型之前进行.

B3.4 集操作函数

集操作函数是指对集进行操作的函数,常用的有@index, @in, @wrap, @size四种,其含义分别见附表2.6.

附表2.6 集操作函数

名称 含义 @index([set_name,]element) 返回成员element在集set_name中的索引值 @in(set_name,index_1,…) 判断集set_name中是否含有索引值index_1,…所对应的元素,若有则返回1,否则返回0.索引用“&1”,或@index函数形式给出. @wrap(index,limit) 在集循环函数中,当达到集的最后一个(或第一个)成员后,此函数可把索引转到其第一个(或最后一个)成员.当index位于区间[1,limit]时返回index,否则返回index/limit的余数. @size(set_name) 返回数据集set_name中包含元素的个数. 例B10 集操作函数示例

model: sets: A/1..5/:; B/x y z/:;

C(A,B)/1,x 3,y 2,y/:; endsets

S1=@index(B,y); !返回B中所含y的索引值;

S2=@in(C, @index(A,2), @index(B,y)); !判断C中是否同时含有集A中的成员2和集B中的成员y; S3=@in(C, @index(A,1), @index(B,y)); !判断C中是否同时含有集A中的成员1和集B中的成员y; S4=@size(C); !计算C中所含成员的个数; end

例B11 某项工作一周7天都需要有人工作,周一至周日所需的最少人数分别为20,16,13,16,19,14和12.要求员工一周连续工作5天后休息2天,试给出安排方案,使得每周所需的总人数最少.

解:设周一至周日每天所需的最少人数为ri,安排上班的人数为xi(i?1,2,?,7),则由工作要求可知,周一上班的人可在周六和周日休息,周二上班的人可在周日和周一休息,依此类推,换言之,周二和周三上班的人在周一休息,周三和周四上班的人在周二休息,以此类推.设安排的总人数为z,则周i实际上班的人数为z?xi?1?xi?2,再考虑到每周7天的循环出现,于是有

z?xi?1?xi?2?z?x@wrap(i?1,7)?x@wrap(i?2,7)?ri,i?1,?,7

编写Lingo模型如下:

256

数学建模

model: sets:

days/mon..sun/:r,x; endsets

min=z; !最小化每周所需员工数; n=@size(days); z=@sum(days:x);

@for(days(i):z-x(@wrap(i+1,n))-x(@wrap(i+2,n))>=r(i)); data:

r=20 16 13 16 19 14 12; !每周所需的最少员工数; enddata end

运行得结果为:每周最少需要22个员工,周一安排8人开始上班,周二安排2人,周三不需要安排人,周四安排6人,周五和周六都安排3人,周日不需要安排人.

B4 Lingo软件与外部文件的接口技术

在很多实际问题中,决策变量个数、约束条件个数和数据量都很大,直接输入Lingo指令非常不便.Lingo模型语言通过集可以简洁、直观地描述较大规模的最优化问题,解决了决策变量个数和约束条件个数多这一难题.对于数据量较大这一问题,Lingo软件通过与外部文件的接口技术给予解决.在接口技术中,模型所需的数据被以一定格式保存在独立的文件中,计算所得的结果也被输入到独立的文件中得以保存,真正实现了模型指令和数据的分离.

B4.1 Lingo软件与文本文件的接口技术

Lingo利用函数@file从文本文件读取数据,其使用格式为:

变量名=@file(filename) ;

其中filename为存放数据的文件名(可包含完整的路径名,否则默认为Lingo软件所在的当前目录),该文件必须是纯文本(ASCⅡ码)文件,文件中可包含不同的数据段,数据段之间须以“~”分开,数据段内的数据之间用逗号或空格分开.

Lingo软件的求解结果可通过函数@text输出到文本文件,其使用格式是: @text(?filename.txt?)=变量名;

该语句通常放在数据段,其中参数?filename.txt?是数据输出的文件名,文件名可以包含完整的目录路径名,否则默认为当前目录.

例B12 以例B4的最短路径问题为例,介绍@file函数和@text函数的用法.

记dv,v为节点vi到vj的交通费用(若这两个节点没有路径连接,可视其交通费

ij用为无穷大),Lvi为节点v1到vi的最优旅行路线费用,则建立最短路径问题的数学模型如下:

Lv1?0;Lvi?min{Lvj?dvj,vi},vi?v1vi?vj

257


附录B Lingo软件初步(第2版21)(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2013专升本插班生考试《发展心理学》课程试卷

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: