第二讲集合的使用

上传人:人*** 文档编号:488248916 上传时间:2023-07-10 格式:DOC 页数:13 大小:145KB
返回 下载 相关 举报
第二讲集合的使用_第1页
第1页 / 共13页
第二讲集合的使用_第2页
第2页 / 共13页
第二讲集合的使用_第3页
第3页 / 共13页
第二讲集合的使用_第4页
第4页 / 共13页
第二讲集合的使用_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《第二讲集合的使用》由会员分享,可在线阅读,更多相关《第二讲集合的使用(13页珍藏版)》请在金锄头文库上搜索。

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

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

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

4、有可能用到的间接集合元素列表的各式:格式举例集合元素1.N1.61,2,3,4,5,6stringM.stringNTRUCKS3.TRUCKS27TRUCKS3,TRUCKS4,TRUCKS27dayM.dayNMON.FRIMON,TUE,WED,THU,FRImonthM.monthNOCT.JANOCT,NOV,DEC,JANmonthYearM.monthYearNOCT2001.JAN2002OCT2001,NOV2001,DEC2001,JAN2002 集合的元素可能有一个或多个属性,这些属性在集合定义中的属性表内列出. 一个属性值就是集合中每一个元素表现出来的特性.属性名称必须

5、遵循标准命名规则,并且用逗号隔开.例如:假设仓库有与其位置和装卸码头数量有关的额外属性,这些额外属性可以被加到集合属性表中, 如下所示:WAREHOUSES/1.6/: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/1.2/;ALLOWED(PRODUCT, MACHINE, WEEK);ENDSETSPRODUCT, MACHINE, WEEK是基本集合, ALLOWED是从PRODUCT, MACHINE和 WEEK派生出来的集合. ALLOWED使用了所有父集合中的元素.ALLOWED集合元素:索引元素索引元素1(A,M,1)5(B,M,1)2(A,M,2)6(B,M,2)3(A,N,1)7(B,N,1)4(A

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

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

9、元素过滤器的标志. 过滤器将运输能力超过50000的卡车放入集合HEAVY_DUTY 中.符号&1是过滤器中的集合索引占位符.当使用集合元素过滤器时,LINGO要扫描所有父集合中的元素,如果集合元素通过过滤器的验证,就会放入衍生集合中.在验证时, 第一个父集合的元素放到&1, 第二个父集合的元素放到&2,依次类推.符号#GT#是逻辑运算符.逻辑运算符列表:逻辑运算符含义逻辑运算符含义#EQ#等于#GT#大于#NE#不等于#LT#小于#GE#大于等于#LE#小于等于集合衍生集合直接列表定义过滤器定义稀蔬集合稠密集合基本集合LINGO集合类型及关系1.2 模型的数据域数据域以关键字“DATA:”开

10、始,以关键字“ENDDATA”结束. 语法:attribute_list=value_list; 属性列表(attribute_list)中包含需要初始化的属性名,属性名之间可以用空格或逗号隔开.如果在表达式的左边有多于一个的属性名,则这些属性必须是在同一个集合中定义的.数值列表(value_list)中包含将要赋给属性列表中属性的值,同样用空格或逗号隔开.例如:SETS: SETS1/A, B,C/:X,Y; ENDSET DATA: X=1 2 3; Y=4 5 6; ENDDATA注意: LINGO是按列输入,而不是按行输入.( 先读第一行的第一个数据,再读第二行的第一个数据,依次类推.

11、)SETS: SETS1/A, B,C/:X,Y; ENDSET DATA: X Y= 1 42 5 3 6; ENDDATA1.3 集合循环函数 集合循环函数列表:函数函数功能FOR用于形成作用于集合所有元素的约束条件SUM用于计算作用于集合中元素的表达式的和MIN用于计算作用于集合中元素的表达式最小值MAX用于计算作用于集合中元素的表达式最大值集合循环函数的语法如下:function(setname(set_index_list)|conditional_qualifier:expression_list);式中, function为循环函数的名称; setname是循环函数操作的集合名;

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

13、忽略,所有在表达式列表中被提到的属性都必须是在同一集合setname中被定义的.1.4 嵌套的集合循环函数 当在一个集合循环函数中使用另一个循环函数时,就称为集合循环函数的嵌套.2.模型举例2.1 基本集合模型-员工安排员工安排问题: 假设经营一家餐馆, 一周营业7天. 餐馆雇用的员工每周工作5天,休息2天,并且每个员工得到相同的周薪.基于过去的经验,一周内有些天比较忙而有些天顾客相对较少,所以每天需要的员工数也不同, 如下表:员工需求量:星期一二三四五六日需求量(人)20161316191412该问题就是要在满足每天员工需求量的条件下确定所需雇用的最少员工总数.建立模型:约束条件, 即必须每

14、天工作的员工数满足或是超过每天的需求量.而当天工作的员工数可以由下式计算:当天工作的员工数=(当天开始工作的人数)+(一天前开始工作的员工数)+(二天前开始工作的员工数) +(三天前开始工作的员工数)+(四天前开始工作的员工数) 换句话说,为了算出当天工作的人数,就需要求出当天开始工作的人数和前四天开始工作的人数之和,而五天和六天前开始工作的人数不计入,因为这些员工正在休息.用数学符号表达的约束条件为:转换成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);注意:由于

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号