收藏 分享(赏)

第二讲 集合的使用.doc

上传人:dwy79026 文档编号:6490276 上传时间:2019-04-14 格式:DOC 页数:17 大小:145KB
下载 相关 举报
第二讲  集合的使用.doc_第1页
第1页 / 共17页
第二讲  集合的使用.doc_第2页
第2页 / 共17页
第二讲  集合的使用.doc_第3页
第3页 / 共17页
第二讲  集合的使用.doc_第4页
第4页 / 共17页
第二讲  集合的使用.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、第二讲 集合的使用1. 集合的使用集合是一些相关对象的全体.集合中的每一个元素都有一个或多个与之相关的特征, 这特征称为属性.在求解 LINGO 模型时,这些属性可以已知或未知.例如,在一个产品集合中,可以将每一个产品的价格作为属性;在一个卡车的模型中 ,可以将每一辆的运输能力作为属性;在一个雇员模型中,可以将每一个雇员 的工资作为属性,也可以将每个雇员的生日作为属性.LINGO 具有基本集合和衍生集合两种类型.基本集合的元素不能被进一步简化.衍生集合可以被定义为使用一个或多个其他集合的集合.换句话说,衍生集合是由已存在的集合作为元素衍生形成的.此外,衍生集合也可以由其他的衍生集合形成. 1.

2、1 模型的集合域集合可以在 LINGO 模型的任意位置定义,定义集合的语句被称为集合域.集合域以关键字“SETS:”开始,以关 键字“ENDSETS”结束.一个模型中可以没有集合域,也可以有一个或多个集合域,并且集合域可以出现在模型的任意位置,唯一的限制就是必须在模型的约束条件使用集合之前定义集合及属性.1.1.1 基本集合的定 义基本集合包括如下参数:1) 集合的名称;2) 集合包含的元素,即集合中的对象(可选);3) 集合中元素的所有属性(可选).语法:setname/member_list/:attribute_list;集合的名称(setname)是用来 标志集合的,它最好具有一定的描

3、述性 ,以便记忆或区分.命名集合有一定的规则:集合名称必须以字母开 头,后面是其他字母或下画线.LINGO 集合名称中的字母不区分大小写.元素列表(member_list) 是组成集合的元素的列表 .如果集合元素包含在集合的定义中,可以将它们直接或间接列出;如果集合元素不包含在集合的定 义中,可以随后在模型的数据域中对其进行定义.使用间接列表语法:setname/member1memberN/:attribute_list;member1 是集合中的第一个元素 ,memberN 是集合中的最后一个元素.LINGO自动生成 member1 到 memberN 之间的元素名称. 请注意, 起始元素

4、名称和末端元素名称的格式必须一致.所有可能用到的间接集合元素列表的各式:格式 举例 集合元素1N 16 1,2,3,4,5,6stringMstringN TRUCKS3TRUCKS27 TRUCKS3,TRUCKS4,TRUCKS27dayMdayN MONFRI MON,TUE,WED,THU,FRImonthMmonthN OCTJAN OCT,NOV,DEC,JANmonthYearMmonthYearN OCT2001JAN2002 OCT2001,NOV2001,DEC2001,JAN2002集合的元素可能有一个或多个属性,这些属性在集合定义中的属性表内列出. 一个属性值就是集合中

5、每一个元素表现出来的特性.属性名称必须遵循标准命名规则,并且用逗号隔开.例如:假设仓库有与其位置和装卸码头数量有关的额外属性,这些 额外属性可以被加到集合属性表中, 如下所示:WAREHOUSES/16/:CAPACITY,LOCATION,DOCKS;1.1.2 衍生集合的定 义衍生集合包括如下参数:1)集合的名称;2)集合的父集合名称;3)集合的元素( 可选);4)集合的元素属性( 可选).语法:setname(parent_set_list)/member_list/:attribute_list;setname 是衍生集合的名称. parent_set_list 是先前定义的集合列表,

6、 用逗号隔开. 如果没有指明一个衍生集合的元素列表(member_list), LINGO 将采用其父集合元素的所有组合作为衍生集合的元素构建新集合.例如下面的集合域:SETS:PRODUCT/A B/;MACHINE/M N/;WEEK/12/;ALLOWED(PRODUCT, MACHINE, WEEK);ENDSETSPRODUCT, MACHINE, WEEK 是基本集合, ALLOWED 是从 PRODUCT, MACHINE 和 WEEK 派生出来的集合 . ALLOWED 使用了所有父集合中的元素.ALLOWED 集合元素:索引 元素 索引 元素1 (A,M,1) 5 (B,M,

7、1)2 (A,M,2) 6 (B,M,2)3 (A,N,1) 7 (B,N,1)4 (A,N,2) 8 (B,N,2)元素列表是可选的,当衍生集合只是父集合所有元素组合中的一部分时,才会用到元素列表.此外,元素列表还可以放在模型的数据域中进行说明. 如前所述,如果元素列表被省略,衍生集合将包含父集合中所有元素的组合,这样,它就被认为是一个稠密集合. 当衍生集合包含元素列表时,它就被限制为一个稠密集合的子集, 称为稀疏集合.衍生集合的列表使用以下两种方法构建:1) 直接元素列表;2) 集合元素过滤器.当使用直接元素列表的方法定义一个衍生集合的元素时,必须具体地列出包含在集合中的所有元素的名称,每

8、一个元素必须来自于由其父集合元素 组成的稠密集合中.例如:ALLOWED(PRODUCT, MACHINE, WEEK)/A M 1,A N 2,B N 2/;如果集合是含有大量元素的稀疏集合,用直接元素列表就 过于复杂. 如果稀疏集合中含有的元素与非集合中的元素有明确的区分条件,就可以使用集合元素过滤器来定义.使用集合元素过滤器定义一个衍生集合 时必须指明集合元素应该符合的逻辑条件( 过滤器).例如: 假设已经定义了一个卡车集合 TRUCKS,每一辆卡 车有一个属性CAPACITY.要以 TRUCKS 为基础构建一个衍生集合,元素为运 输能力大的卡车. 方法:HEAVY_DUTY(TRUCK

9、S)|CAPACITY(该衍生集合的名称是 HEAVY_DUTY, 竖线(|)作为集合元素过滤器的标志. 过滤器将运输能力超过 50000 的卡车放入集合 HEAVY_DUTY 中.符号属性列表(attribute_list) 中包含需要初始化的属性名 ,属性名之间可以用空格或逗号隔开.如果在表达式的左边有多于一个的属性名,则这些属性必须是在同一个集合中定义的.数值列表(value_list )中包含将要赋给 属性列表中属性的值,同样用空格或逗号隔开.例如:SETS:SETS1/A, B,C/:X,Y;ENDSETDATA:X=1 2 3;Y=4 5 6;ENDDATA注意: LINGO 是按

10、列输入,而不是按行输入.( 先读第一行的第一个数据,再读第二行的第一个数据,依次类推.)SETS:SETS1/A, B,C/:X,Y;ENDSETDATA:X Y= 1 42 53 6;ENDDATA1.3 集合循 环 函数集合循环函数列表:函数 函数功能FOR 用于形成作用于集合所有元素的约束条件SUM 用于计算作用于集合中元素的表达式的和MIN 用于计算作用于集合中元素的表达式最小值MAX 用于计算作用于集合中元素的表达式最大值集合循环函数的语法如下:function(setname(set_index_list)|conditional_qualifier:expression_list

11、);式中, function 为循环函数的名称; setname 是循环函数操作的集合名; 集合索引列表 set_index_list 是可选的, 用来构建索引, 每一项索引对应集合中的一个元素;条件过滤器 conditional_qualifier 也是可选的, 用于控制循环函数的使用范围, 当 LINGO 对集合中的元素进行循环时,首先为条件过滤器估值, 如果条件过滤器的值为真, 函数将对其进行操作,否则就跳过; expression_list 是应用于集合中每个元素的表达式列表. 当使用FOR 函数时, 列表中可以包含许多表达式, 彼此间用分号隔开.这样,这些表达式就以约束条件的形式加入

12、到模型中.当使用其他三个循环函数(SUM,MAX,MIN) 时,表达式列表中只能包含一个表达式.如果索引列表被忽略,所有在表达式列表中被提到的属性都必须是在同一集合 setname 中被定义的.1.4 嵌套的集合循 环 函数当在一个集合循环函数中使用另一个循环函数时,就称为集合循环函数的嵌套.2.模型举例2.1 基本集合模型 -员 工安排员工安排问题:假设经营一家餐馆, 一周营业 7 天. 餐馆雇用的员工每周工作 5 天,休息 2 天,并且每个员工得到相同的周薪.基于过去的经验,一周内有些天比较忙而有些天顾客相对较少,所以每天需要的员工数也不同, 如下表:员工需求量:星期 一 二 三 四 五

13、六 日需求量(人) 20 16 13 16 19 14 12该问题就是要在满足每天员工需求量的条件下确定所需雇用的最少员工总数.建立模型:约束条件, 即必须每天工作的员工数满足或是超过每天的需求量.而当天工作的员工数可以由下式计算:当天工作的员工数=(当天开始工作的人数)+(一天前开始工作的员工数)+(二天前开始工作的员工数) +(三天前开始工作的员工数) +(四天前开始工作的员工数)换句话说,为了算出当天工作的人数,就需要求出当天开始工作的人数和前四天开始工作的人数之和,而五天和六天前开始工作的人数不计入,因为这些员工正在休息.用数学符号表达的约束条件为: 4, , ijSTARiEQUID

14、jforAYS转换成 LINGO 语言为:FOR(DAYS(J):SUM(DAYS(I)|I#LE#5:START(J-I+1)=REQUIRED(J);会产生错误.为什么?以星期四为例, 星期四在集合 DAYS 中的索引是 4,并且星期四的约束条件为:START(4-1+1)+ START(4-2+1)+ START(4-3+1)+ START(4-4+1)+START(4-5+1)=REQUIRED(4);即:START(4)+ START(3)+ START(2)+ START(1)+START(0)=REQUIRED(4);注意:由于 START(0)会产生错误,因为 0 索引“超出了

15、范 围(out of range)”,希望小于或等于 0 的索引回绕到一周的末端。也就是说, 0 对应 7,即 Sunday; -1 对应 6, 即 Saturday, and so on. 利用函数 WRAP 可以解决 问题.函数WRAP 有两个参数 INDEX 和 LIMIT, 其返回值为 J, 并且J=INDEX-K*LIMIT式中,K 为能使 J 落入范围1,LIMIT 的整数. 即函数WRAP 将在 INDEX 上减去或加上数个 LIMIT, 直到 INDEX 落入1,LIMIT 区间内.这样就解决了建立多阶段计划模型时需要回绕索引的问题. P34-36于是,约束条件, 即必须每天工

16、作的员工数满足或是超过每天的需求量, 改为FOR(DAYS(J):SUM(DAYS(I)|I#LE#5:START(WRAP(J-I+1,7)=REQUIRED(J);模型为:MODEL:!一周中的每一天;SETS:! REQUIRED 为每天的员工需求量, START 为每天开始工作的 员工数(决策变量);DAYS/MON TUE WED THU FRI SAT SUN/:REQUIRED,START;ENDSETSMIN=SUM(DAYS(I):START(I);FOR(DAYS(J):SUM(DAYS(I)|I#LE#5:START(WRAP(J-I+1,7)=REQUIRED(J);D

17、ATA:REQUIRED=20 16 13 16 19 14 12;ENDDATAEND结果:Global optimal solution found at iteration: 15Objective value: 22.00000Variable Value Reduced CostREQUIRED( MON) 20.00000 0.000000REQUIRED( TUE) 16.00000 0.000000REQUIRED( WED) 13.00000 0.000000REQUIRED( THU) 16.00000 0.000000REQUIRED( FRI) 19.00000 0.0

18、00000REQUIRED( SAT) 14.00000 0.000000REQUIRED( SUN) 12.00000 0.000000START( MON) 8.000000 0.000000START( TUE) 2.000000 0.000000START( WED) 0.000000 0.3333333START( THU) 6.000000 0.000000START( FRI) 3.000000 0.000000START( SAT) 3.000000 0.000000START( SUN) 0.000000 0.000000Row Slack or Surplus Dual P

19、rice1 22.00000 -1.0000002 0.000000 -0.33333333 0.000000 -0.33333334 0.000000 0.0000005 0.000000 -0.33333336 0.000000 0.0000007 0.000000 -0.33333338 0.000000 0.0000002.2 稠密衍生集合模型 -配比模型配比模型:Chess 公司生产四种品牌的混合坚果.这四种品牌的混合 坚果分别为Pawn,Knight,Bishop 和 King. 每一种品牌的产品包含不同比例的花生和腰果,价格也有所不同,如表:产品价格:Pawn Knight Bi

20、shop King花生 (盎司) 15 10 6 2腰果 (盎司) 1 6 10 14售价 (磅) 2 3 4 5已知 Chess 公司每天可以从供货商处获得 750 磅花生和 250 磅腰果.该问题的目标是在不超过可得到的坚果数的情况下,确定每天生产多少磅各种产品可以获得最大的利润.(16 盎司=1 磅)模型为:SETS:NUTS/PEANUTS,CASHEWS/:SUPPLY;BRANDS/PAWN,KNIGHT,BISHOP,KING/:PRICE,PRODUCE;FORMULA(NUTS,BRANDS):OUNCES;ENDSETSMAX=SUM(BRANDS(I):PRICE(I)*

21、PRODUCE(I):FOR(NUTS(I):SUM(BRANDS(J):OUNCES(I,J)*PRODUCE(J)/16)1 的元素. 方法是在最终的衍生集合中用一个集合元素过滤器, 使数对(I,J)满足 J 大于 I 的条件 :PAIRS(ANALYSTS, ANALYSTS)|元素过滤器由一个竖线标记(|)开始,符号MATCH: 表示专家 I 与专家 J 是否匹配.PAIRS(ANALYSTS, ANALYSTS)|数据域为:DATA:RATING=9 3 4 2 1 5 61 7 3 5 2 14 4 2 9 21 5 5 28 7 6 2 34;ENDDATA属性 MATCH 包含

22、模型中的决策变量,令 MATCH(I,J)取值为 1,表示专家 I与专家 J 匹配,否则为 0.模型的目 标是最终匹配形式的不相容等 级之和最小:MIN=SUM(PAIRS(I,J):RATING(I,J)*MATCH(I,J);模型只有一类约束条件,即对于一个专家,只能与另外一个确定的专家匹配.语句为:FOR(ANALYSTS(I):SUM(PARS(J,K)|J#EQ#I#OR#K#EQ#I:MATCH(J,K)=1);FOR(PAIRS(I,J):BIN(MATCH(I,J);整个模型:MODEL:SETS:ANALYSTS/18/;PAIRS(ANALYSTS, ANALYSTS)|E

23、NDSETSMIN=SUM(PAIRS(I,J):RATING(I,J)*MATCH(I,J);FOR(ANALYSTS(I):SUM(PAIRS(J,K)|J#EQ#I#OR#K#EQ#I:MATCH(J,K)=1);FOR(PAIRS(I,J):BIN(MATCH(I,J);DATA:RATING=9 3 4 2 1 5 61 7 3 5 2 14 4 2 9 21 5 5 28 7 6 2 34;ENDDATAEND结果:Global optimal solution found at iteration: 0Objective value: 6.000000Variable Value

24、 Reduced CostRATING( 1, 2) 9.000000 0.000000RATING( 1, 3) 3.000000 0.000000RATING( 1, 4) 4.000000 0.000000RATING( 1, 5) 2.000000 0.000000RATING( 1, 6) 1.000000 0.000000RATING( 1, 7) 5.000000 0.000000RATING( 1, 8) 6.000000 0.000000RATING( 2, 3) 1.000000 0.000000RATING( 2, 4) 7.000000 0.000000RATING(

25、2, 5) 3.000000 0.000000RATING( 2, 6) 5.000000 0.000000RATING( 2, 7) 2.000000 0.000000RATING( 2, 8) 1.000000 0.000000RATING( 3, 4) 4.000000 0.000000RATING( 3, 5) 4.000000 0.000000RATING( 3, 6) 2.000000 0.000000RATING( 3, 7) 9.000000 0.000000RATING( 3, 8) 2.000000 0.000000RATING( 4, 5) 1.000000 0.0000

26、00RATING( 4, 6) 5.000000 0.000000RATING( 4, 7) 5.000000 0.000000RATING( 4, 8) 2.000000 0.000000RATING( 5, 6) 8.000000 0.000000RATING( 5, 7) 7.000000 0.000000RATING( 5, 8) 6.000000 0.000000RATING( 6, 7) 2.000000 0.000000RATING( 6, 8) 3.000000 0.000000RATING( 7, 8) 4.000000 0.000000MATCH( 1, 2) 0.0000

27、00 9.000000MATCH( 1, 3) 0.000000 3.000000MATCH( 1, 4) 0.000000 4.000000MATCH( 1, 5) 0.000000 2.000000MATCH( 1, 6) 1.000000 1.000000MATCH( 1, 7) 0.000000 5.000000MATCH( 1, 8) 0.000000 6.000000MATCH( 2, 3) 0.000000 1.000000MATCH( 2, 4) 0.000000 7.000000MATCH( 2, 5) 0.000000 3.000000MATCH( 2, 6) 0.0000

28、00 5.000000MATCH( 2, 7) 1.000000 2.000000MATCH( 2, 8) 0.000000 1.000000MATCH( 3, 4) 0.000000 4.000000MATCH( 3, 5) 0.000000 4.000000MATCH( 3, 6) 0.000000 2.000000MATCH( 3, 7) 0.000000 9.000000MATCH( 3, 8) 1.000000 2.000000MATCH( 4, 5) 1.000000 1.000000MATCH( 4, 6) 0.000000 5.000000MATCH( 4, 7) 0.0000

29、00 5.000000MATCH( 4, 8) 0.000000 2.000000MATCH( 5, 6) 0.000000 8.000000MATCH( 5, 7) 0.000000 7.000000MATCH( 5, 8) 0.000000 6.000000MATCH( 6, 7) 0.000000 2.000000MATCH( 6, 8) 0.000000 3.000000MATCH( 7, 8) 0.000000 4.000000Row Slack or Surplus Dual Price1 6.000000 -1.0000002 0.000000 0.0000003 0.000000 0.0000004 0.000000 0.0000005 0.000000 0.0000006 0.000000 0.0000007 0.000000 0.0000008 0.000000 0.0000009 0.000000 0.000000从目标值中可以看到,所有数对的不相容等级之和为 6,并且由第一列可知, 优先匹配的专家为(1,6),(2,7),(3,8) 和(4,5).

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 中等教育 > 小学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报