LINGO 软件的基本使用方法(5)

2019-03-15 22:17

图 19

从这个例子还可以看出,虽然集合 CITIES 中的元素不是数字,但当它以 CITIES(I)的形式出

现在循环中时,引用下标 I 却实际上是正整数,也就是说 I 指的正是元素在集合中的位置(顺序),

一般称为元素的索引(INDEX)。我们在@for 循环中故意用了一个函数―@index‖, 其作用是返回

一个元素在集合中的索引值,这里@index(S )=1,所以逻辑关系式―I#GT#@index(S )‖可以直接等 价地写成―I#GT#1‖。这里@index(S )实际上还是@index(CITIES,S )的简写,即返回 S 在集合 CITIES 中的索引值。

15

Page 16 运行以上程序后得到结果(图 19)。可以看出, 从S到T的最优行驶路线的路长为 20(进一步分

析,可以得到从S到T的最优行驶路线为S→ A

3

→ B

2

→ C

1

→ T)。

上面这个例子中定义稀疏集合 ROADS 的方法是将其元素通过枚举给出,有时这还是太麻烦了, 用起来不方便。LINGO 提供了另一种定义稀疏集合的方法,这就是―元素过滤‖法,能够从构成派

生集合的父集合的笛卡儿积中系统地过滤下来一些真正的元素。请看下面的例子。

某班 8 名同学准备分成 4 个调查队(每队两人)前往 4 个地区进行社会调查。假设这 8 名同学

两两之间组队的效率如表 4 所示(由于对称性,只列出了上三角部分),问如何组队可以使总效率 最高? 学生 S1 S2 S3 S4 S5 S6 S7 S8 S1 - 9

3 4 2 1 5 6 S2 - - 1 7 3 5 2 1 S3 - - - 4 4 2 9 2 S4 - - - - 1 5 5 2 S5 - - - - - 8 7 6 S6 -

- - - - - 2 3 S7 - - - - - - - 4 表 4

这是一个典型的匹配(MATCHING)问题。把上面的效率矩阵记为 BENEFIT,用 MATCH(Si, Sj)=1 表示同学 Si,Sj 组成一队,而 0 表示不组队。由于对称性,只需考虑 i

显然,目标函数为 BENEFIT(Si,Sj)* MATCH(Si,Sj)之和;约束条件是每个同学只能(而且

必须在)某一组,即对于任意 i 有:只要 MATCH 属性的某个下标为 i 就加起来,此和=1。显然,

这是一个 0-1 线性规划。

模型输入见图 20,其中 STUDENTS 集合的元素列表―S1..S8‖等价于写成―S1 S2 S3 S4 S5 S6 S7 S8‖, 它没有相关的属性列表,主要用于表示下标集合。我们看到在派生集合 PAIRS 的定义中,

增加了过滤条件,即逻辑关系式―&2#GT#&1‖,意思是第 2 个父集合的元素的索引值(用―&2‖ 表示)大于第 1 个父集合的元素的索引值(用―&1‖表示)。 图 20

16

Page 17 选择菜单命令―LINGO|SOLVE‖运行这个程序,可以得到全局最优值=30。由于 MATCH 变量 中多数为 0,我们这里练习一下如何更清晰地浏览最优解解。选择菜单命令―LINGO|SOLUTION‖,

可以看到图 21 所示的对话框。在对话框中选择 MATCH 属性(变量)和 Nonzeros(只显示非零值)

选项,点击―OK‖按钮,得到的正是我们想看的关于最优解的报告(如图 22 所示)。 图 21 图 22

3.3.4 集合的使用小结

我们把前面介绍的关于集合的不同类型及其关系小结一下,表示在图 23 中。

集合 派生集合 基本集合 稀疏集合 稠密集合 元素列表法 元素过滤法 直接列举法 隐式列举法 图 23

现在,我们归纳一下基本集合和派生集合的定义语法。基本集合的定义格式为(以下语法中凡 是在方括号―[ ]‖中的内容,表示是可选的项,即该项可以有也可以没有):

17

Page 18 setname [/member_list/] [: attribute_list];

其中 setname 为定义的集合名,member_list 为元素列表,attribute_list 为属性列表。元 素列表可以采用显式列举法(即直接将所有元素全部列出,元素之间用逗号或空格分开),也可以

采用隐式列举法。隐式列举法可以有几种不同格式,见表 5。 类型

隐式列举格式 示例

示例集合表示的元素 数字型 1..n 1..5 1, 2, 3, 4, 5 字符-数 字型

stringM..stringN Car101..car208 Car101, car102, … , car208 日期(星 期)型 dayM..dayN MON..FRI

MON, TUE, WED, THU, FRI 月份型

monthM..monthN OCT..JAN

OCT, NOV, DEC, JAN 年份-月

份型

monthYearM..monthYearN OCT2001..JAN2002 OCT2001, NOV2001,

DEC2001, JAN2002 表 5

上面的语法还告诉我们元素列表和属性列表都是可选的。当属性列表不在集合定义中出现时, 这样的集合往往只是为了将来在程序中作为一个循环变量来使用;而当元素列表不在集合定义中出

现时,则必须在程序的数据段以赋值语句的方式直接给出元素列表。例如,3.3.1 节的模型(图 10)的集合段和数据段可以分别改为: SETS:

QUARTERS:DEM,RP,OP,INV; !注意没有给出元素列表; ENDSETS DATA:

QUARTERS DEM=1 40 2 60 3 75 4 25; !注意LINGO按列赋值的特点; ENDDATA

派生集合的一般定义格式为:

setname(parent_set_list) [/member_list/] [: attribute_list];

其中与基本集合的定义相比较只是多了一个 parent_set_list(父集合列表)。父集合列表中的 集合(如 set1,set2,…,等)称为派生集合 setname 的父集合,它们本身也可以是派生集合。 当元素列表(member_list)不在集合定义中出现时,还可以在程序的数据段以赋值语句的方式 给出元素列表;若在程序的数据段也不以赋值语句的方式给出元素列表,则认为父集合中所有元素

的组合(笛卡儿积)都是 setname 的元素。当元素列表在集合定义中出现时,又有―元素列表法‖ 和―元素过滤法‖两种不同方式,请参看本节前面的介绍。

3.4 运算符及其优先级

在前面的很多例子里,我们陆续用到了一些运算符,现在归纳一下 LING0 中的三类运算符: 算术运算符、逻辑运算符和关系运算符。

算术运算符有 5 种:+(加法),—(减法或负号),*(乘法),/(除法),^(求幂)。 逻辑运算符有 9 种:#AND#(与),#OR#(或),#NOT#(非),#EQ#(等于),#NE#(不 等于),#GT#(大于),#GE#(大于等于),#LT#(小于),#LE#(小于等于)。逻辑运算的

结果只有―真‖(TRUE)和―假‖(FALSE)两个值,LINGO 中用数字 1 代表 TRUE,其他值(典 型的值是 0)都是 FALSE。

18

Page 19 关系运算符有 3 种:<(即<=,小于等于),=(等于),>(即>=,大于等于)。注意在数学规 划中约束一般没有严格小于、严格大于关系。

这些运算符的优先级如表 6 所示(同一优先级按从左到右的顺序执行;如果有括号―()‖,


LINGO 软件的基本使用方法(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:湿接头及横隔板模板技术交底

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

马上注册会员

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