1、数学软件数学软件 LINGO LINGO集合功效1第1页LINGOLINGO软件介绍软件介绍n一、一、LINGO中集合中集合n二、集合循环函数二、集合循环函数n三、集合操作函数三、集合操作函数n四、利用定义集合方法求解规划问题四、利用定义集合方法求解规划问题n五、基本数学函数五、基本数学函数2第2页一、一、LINGOLINGO中集合中集合集集合合是是一一群群相相联联络络对对象象,这这些些对对象象也也称称为为集集合合组组员员。一一个个集集合合可可能能是是一一系系列列产产品品、卡卡车车或或雇雇员员。每每个个集集合合组组员员可可能能有有一一个个或或多多个个与与之之相相关关联联特特征征,我我们们把把这
2、这些些特特征征称称为为属属性性。属属性性值值能能够够预先给定,也能够是未知,有待于预先给定,也能够是未知,有待于LINGO求解。求解。集集合合实实例例:产产品品集集合合中中每每个个产产品品能能够够有有一一个个价价格格属属性性;卡卡车车集集合合中中每每辆辆卡卡车车能能够够有有一一个个牵牵引引力力属属性性;雇雇员员集集合合中中每每位位雇雇员员能能够够有有一一个个薪薪水水属性,也能够有一个生日属性等等。属性,也能够有一个生日属性等等。3第3页一、一、LINGOLINGO中集合中集合 集合部分集合部分是是LINGO模型一个模型一个可选可选部分。部分。在在LINGO模型中使用集合之前,必须在集模型中使用
3、集合之前,必须在集合部分事先定义。集合部分以关键字合部分事先定义。集合部分以关键字“sets:”开始,以开始,以“endsets”结束。结束。一个模型能够没有集合部分,或有一一个模型能够没有集合部分,或有一个简单集合部分,或有多个集合部分。一个简单集合部分,或有多个集合部分。一个集合部分能够放置于模型任何地方,不个集合部分能够放置于模型任何地方,不过一个集合及其属性在模型约束中被引用过一个集合及其属性在模型约束中被引用之前必须定义了它们。之前必须定义了它们。4第4页一、一、LINGOLINGO中集合中集合 LINGO有两种类型集合:有两种类型集合:原始集合原始集合(primitive set)
4、和和派生集合派生集合(derived set)。一个一个原始集合原始集合是由一些最基本对象组成。是由一些最基本对象组成。一个一个派生集合派生集合是用一个或多个其它集合是用一个或多个其它集合来定义,也就是说,它组员来自于其它已来定义,也就是说,它组员来自于其它已存在集合。存在集合。5第5页原始集合定义方法原始集合定义方法 LINGO可识别集合只有两种类型:可识别集合只有两种类型:原原始集合始集合和和派生集合派生集合。为了定义一个原始集合,必须说明以为了定义一个原始集合,必须说明以下几点:下几点:(1)集合名字;)集合名字;(2)集合组员(可选);)集合组员(可选);(3)集合组员属性(可选)。)
5、集合组员属性(可选)。定义一个原始集合,用下面语法:定义一个原始集合,用下面语法:setname/member_list/:attribute_list;6第6页原始集合定义方法原始集合定义方法setname/member_list/:attribute_list;(1)setname是你选择来标识集合名字,是你选择来标识集合名字,最好含有较强可读性。集合名字必须严格最好含有较强可读性。集合名字必须严格符合标准命名规则:以拉丁字母或下划线符合标准命名规则:以拉丁字母或下划线(_)为首字符,其后由拉丁字母()为首字符,其后由拉丁字母(AZ)、下划线、阿拉伯数字()、下划线、阿拉伯数字(0,1,9
6、)组成总长度不超出)组成总长度不超出32个字符字符串,个字符字符串,且不区分大小写。且不区分大小写。7第7页原始集合定义方法原始集合定义方法setname/member_list/:attribute_list;(2)member_list是集合组员列表。假是集合组员列表。假如集合组员放在集合定义中,那么对它们如集合组员放在集合定义中,那么对它们可采取显式罗列和隐式罗列两种方式。假可采取显式罗列和隐式罗列两种方式。假如集合组员不放在集合定义中,那么能够如集合组员不放在集合定义中,那么能够在随即数据部分定义它们。在随即数据部分定义它们。8第8页原始集合定义方法原始集合定义方法1.当显式罗列组员时
7、,必须为每个组员输入一当显式罗列组员时,必须为每个组员输入一个不一样名字,中间用个不一样名字,中间用空格空格或或逗号逗号搁开,允许混搁开,允许混合使用。合使用。例:能够定义一个名为例:能够定义一个名为students原始集合,它原始集合,它含有组员含有组员John、Jill、Rose和和Mike,属性有,属性有sex和和age:9第9页原始集合定义方法原始集合定义方法2.当隐式罗列组员时,无须罗列出每个集合组当隐式罗列组员时,无须罗列出每个集合组员。可采取以下语法:员。可采取以下语法:setname/member1.memberN/:attribute_list;这里这里member1是集合第
8、一个组员名,是集合第一个组员名,memberN是集合最末一个组员名。是集合最末一个组员名。LINGO将将自动产生中间全部组员名。自动产生中间全部组员名。LINGO也接收一些也接收一些特定首组员名和末组员名,用于创建一些特殊集特定首组员名和末组员名,用于创建一些特殊集合。合。10第10页原始集合定义方法原始集合定义方法n隐式组员列表格式隐式组员列表格式 示例示例 n所产生集合组员所产生集合组员 1.n 1.5 1,2,3,4,5 StringM.StringN Car2.Car14 Car2,Car3,Car4,Car14 DayM.DayN Mon.Fri Mon,Tue,Wed,Thu,Fr
9、i MonthM.MonthN Oct.Jan Oct,Nov,Dec,Jan MonthYearM.MonthYearN nOct.Jan nOct,Nov,Dec,Jan11第11页原始集合定义方法原始集合定义方法3.集合组员不放在集合定义中,而在随即数据集合组员不放在集合定义中,而在随即数据部分来定义。比如:部分来定义。比如:12第12页原始集合定义方法原始集合定义方法注意:注意:开头用感叹号(开头用感叹号(!),末尾用分号(),末尾用分号(;)表示)表示注释注释,可跨多行。,可跨多行。在集合部分只定义了一个集合在集合部分只定义了一个集合students,并未指定组员。在数据部分罗列了并
10、未指定组员。在数据部分罗列了集合组员集合组员John、Jill、Rose和和Mike,并对,并对属性属性sex和和age分别给出了值。分别给出了值。集合组员不论用何种字符标识,它索引都集合组员不论用何种字符标识,它索引都是从是从1开始连续计数。在开始连续计数。在attribute_ list能够指能够指定一个或多个集合组员属性,定一个或多个集合组员属性,属性属性之间必须之间必须用逗用逗号隔开号隔开。13第13页派生集合定义方法派生集合定义方法为了定义一个派生集合,必须详细申明:为了定义一个派生集合,必须详细申明:(1)集合名字;)集合名字;(2)父集合名字;)父集合名字;(3)集合组员(可选)
11、;)集合组员(可选);(4)集合组员属性(可选)集合组员属性(可选)可用下面语法定义一个派生集合:可用下面语法定义一个派生集合:setname(parent_set_list)/member_list/:attribute_list;14第14页派生集合定义方法派生集合定义方法(1)setname是集合名字。是集合名字。(2)parent_set_list是是已已定定义义集集合合列列表表,多多个个时时必必须须用用逗逗号号隔隔开开。假假如如没没有有指指定定组组员员列列表表,那那么么LINGO会会自自动动创创建建父父集集合合组组员员全全部部组组合合作作为为派派生生集集合合组组员员。派派生生集集合合
12、父父集集合合既既能能够够是是原原始始集集合合,也也能能够够是是其其它它派生集合。派生集合。(3)/member_list/(4):attribute_list后面关于(后面关于(3)()(4)介绍同原始集合)介绍同原始集合15第15页派生集合定义方法派生集合定义方法16第16页派生集合定义方法派生集合定义方法组组员员列列表表被被忽忽略略时时,派派生生集集合合组组员员由由父父集集合合组组员员全全部部组组合合组组成成,这这么么派派生生集集合合成成为为稠稠密密集集合合。假假如如限限制制派派生生集集合合组组员员,使使它它成成为为父父集集合合组组员员全全部部组组合合组组成成集集合合合合一一个个子子集集合
13、合,这这么么派派生生集集合合成成为为稀稀疏疏集集合合。同同原原始始集集合合一一样样,派派生生集集合合组组员员申申明明也能够放在数据部分。也能够放在数据部分。比如上例中:比如上例中:LINGO生生成成了了三三个个父父集集合合全全部部组组合合共共八八组组作作为为allowed集集 合合 组组 员员。列列 表表 以以 下下:(A,M,1),(A,M,2),(A,N,1),(A,N,2),(B,M,1),(B,M,2),(B,N,1),(B,N,2)17第17页派生集合定义方法派生集合定义方法一个派生集合组员列表有两种方式生成:一个派生集合组员列表有两种方式生成:方式方式1.显式罗列;显式罗列;方式方
14、式2.设置组员资格过滤器。设置组员资格过滤器。当采取当采取方式方式1时,必须显式罗列出全部要包含在时,必须显式罗列出全部要包含在派生集合中组员,而且罗列每个组员必须属于稠派生集合中组员,而且罗列每个组员必须属于稠密集合。密集合。使用前面例子,显式罗列派生集合组员:使用前面例子,显式罗列派生集合组员:allowed(product,machine,week)/A M 1,A N 2,B N 1/;18第18页派生集合定义方法派生集合定义方法 假如需要生成一个大、稀疏集合,那么显式假如需要生成一个大、稀疏集合,那么显式罗列就会很罗嗦、很繁杂。幸运地是许多稀疏集罗列就会很罗嗦、很繁杂。幸运地是许多稀
15、疏集合组员都满足一些条件以和非组员相区分。我们合组员都满足一些条件以和非组员相区分。我们能够采取能够采取方式方式2,把这些逻辑条件看作过滤器,把这些逻辑条件看作过滤器,在在LINGO生成派生集合组员时把使逻辑条件为生成派生集合组员时把使逻辑条件为假组员从稠密集合中过滤掉。假组员从稠密集合中过滤掉。这里顺便罗列一下这里顺便罗列一下LINGO运算符:运算符:19第19页派生集合定义方法派生集合定义方法LINGO运算符:运算符:(1)算术运算符:)算术运算符:+(加),(加),-(减或负号),(减或负号),*(乘),(乘),/(除),(除),(求幂)(求幂)(2)逻辑运算符:)逻辑运算符:#and#
16、(与),(与),#or#(或)(或),#not#(非)(非)(3)关系运算符:)关系运算符:#eq#(等于),(等于),#ne#(不等于),(不等于),#gt#(大于),(大于),#ge#(大于等(大于等于),于),#lt#(小于),(小于),#le#(小于等于)(小于等于)20第20页派生集合定义方法派生集合定义方法经过经过方式方式2设置组员资格过滤器实例:设置组员资格过滤器实例:21第21页一、一、LINGOLINGO中集合(小结中集合(小结1 1)总来说,总来说,LINGO可识别集合只有两种类型:可识别集合只有两种类型:原始集合原始集合和和派生集合派生集合。在一个模型中,在一个模型中,原
17、始集合原始集合是基本对象,不能是基本对象,不能再被拆分成更小组分。原始集合能够由再被拆分成更小组分。原始集合能够由显式罗列显式罗列和和隐式罗列隐式罗列两种方式来定义。当用显式罗列方式两种方式来定义。当用显式罗列方式时,需在集合组员列表中逐一输入每个组员。当时,需在集合组员列表中逐一输入每个组员。当用隐式罗列方式时,只需在集合组员列表中输入用隐式罗列方式时,只需在集合组员列表中输入首组员和末组员,而中间组员由首组员和末组员,而中间组员由LINGO产生。产生。22第22页一、一、LINGOLINGO中集合(小结中集合(小结2 2)其次,派生集合是由其它集合来创建。这些集合被称为该派生集合父集合(原
18、始集合或其它派生集合)。一个派生集合既可以是稀疏,也可以是稠密。稠密集合包含了父集合成员全部组合(有时也称为父集合笛卡尔乘积)。稀疏集合仅包含了父集合笛卡尔乘积一个子集合,可经过显式罗列和成员资格过滤器这两种方式来定义。显式罗列方法就是逐个罗列稀疏集合成员。成员资格过滤器方法经过使用稀疏集合成员必须满足逻辑条件从稠密集合成员中过滤出稀疏集合成员。23第23页二、集合循环函数二、集合循环函数集合循环函数遍历整个集合进行操作。其集合循环函数遍历整个集合进行操作。其语法为:语法为:function(setname(set_index_list)|conditional_qualifier:expre
19、ssion_list);function对应于下面罗列五个集合循环对应于下面罗列五个集合循环函数之一:函数之一:for,sum,prod,min,max24第24页二、集合循环函数二、集合循环函数语法说明语法说明:function(setname(set_index_list)|conditional_qualifier:expression_list);(1)setname是要遍历集合;(2)set_ index_list是集合索引列表;(3)conditional_qualifier是用来限制集合循环函数范围,当集合循环函数遍历集合每个组员时,LINGO都要对conditional_qua
20、lifier进行评价,若结果为真,则对该组员执行function操作,不然跳过,继续执行下一次循环。25第25页二、集合循环函数二、集合循环函数语法说明:语法说明:function(setname(set_index_list)|conditional_qualifier:expression_list);(4)expression_list是被应用到每个集合组员表示式列表,当用是for函数时,expression_list能够包含多个表示式,其间用逗号隔开。这些表示式将被作为约束加到模型中。当使用其余四个集合循环函数时,expression_list只能有一个表示式。假如省略set_inde
21、x_list,那么在expression_list中引用全部属性类型都是setname集合。26第26页二、集合循环函数二、集合循环函数(一)(一)for该函数用来产生对集合组员约束。基于建模语该函数用来产生对集合组员约束。基于建模语言标量需要显式输入每个约束,不过言标量需要显式输入每个约束,不过for函函数允许只输入一个约束,然后数允许只输入一个约束,然后LINGO自动产自动产生每个集合组员约束。生每个集合组员约束。例:例:产生序列产生序列1,4,9,16,2527第27页二、集合循环函数二、集合循环函数(二)(二)sum与与prod函数函数sum返回遍历指定集合组员一个表示式返回遍历指定集
22、合组员一个表示式和。函数和。函数prod返回遍历指定集合组员一个表返回遍历指定集合组员一个表示式积。示式积。例:求向量例:求向量5,1,3,4,6,10前前5个数和个数和与后与后3个数积:个数积:28第28页二、集合循环函数二、集合循环函数(三)(三)min和和max返回指定集合组员一个表示式最小值或最大值。返回指定集合组员一个表示式最小值或最大值。例:求向量例:求向量5,1,3,4,6,10前前5个数最个数最小值,后小值,后3个数最大值。个数最大值。29第29页三、集合操作函数三、集合操作函数 LINGO提供了几个函数帮助处理集合。提供了几个函数帮助处理集合。(一)(一)in(二)(二)in
23、dex(三)(三)wrap(四)(四)size30第30页三、集合操作函数三、集合操作函数(一)(一)inin(set_name,primitive_index_1,primitive_index_2,)假如元素在指定集合中,返回假如元素在指定集合中,返回1;不然返回;不然返回0。例例 全集合为全集合为I,B是是I一个子集合,一个子集合,C是是B补集补集合。合。sets:I/x1.x4/;B(I)/x2/;C(I)|#not#in(B,&1):;endsets 31第31页三、集合操作函数三、集合操作函数(二)(二)indexindex(set_name,primitive_set_eleme
24、nt)该函数返回在集合该函数返回在集合set_name中原始集合组员中原始集合组员primitive_set_element索引。假如索引。假如set_name被忽略,那么被忽略,那么LINGO将返回与将返回与primitive_set_element匹配第一个原始集匹配第一个原始集合组员索引。假如找不到,则产生一个错误。合组员索引。假如找不到,则产生一个错误。32第32页三、集合操作函数三、集合操作函数(二)(二)index例例 怎样确定集合组员怎样确定集合组员(B,Y)属于派生集合属于派生集合S3。sets:S1/A B C/;S2/X Y Z/;S3(S1,S2)/A X,A Z,B Y
25、,C X/;endsets X=in(S3,index(S1,B),index(S2,Y);33第33页三、集合操作函数三、集合操作函数(二)(二)index看下面例子,表明有时为看下面例子,表明有时为index指定集合是指定集合是必要。必要。例例 sets:girls/debble,sue,alice/;boys/bob,joe,sue,fred/;endsets I1=index(sue);I2=index(boys,sue);I1值是值是2,I2值是值是3。我们提议在使用。我们提议在使用index函数时最好指定集合。函数时最好指定集合。34第34页三、集合操作函数三、集合操作函数(三)(
26、三)wrapwrap(index,limit)该函数返回该函数返回j=index-k*limit,其中,其中k是一个是一个整数,取适当值确保整数,取适当值确保j落在区间落在区间1,limit内。内。该函数相当于该函数相当于index模模limit再加再加1。该函数在。该函数在循环、多阶段计划编制中尤其有用。循环、多阶段计划编制中尤其有用。35第35页三、集合操作函数三、集合操作函数(四)(四)sizesize(set_name)该函数返回集合该函数返回集合set_name组员个数。在模型组员个数。在模型中明确给出集合大小时最好使用该函数。它使中明确给出集合大小时最好使用该函数。它使用使模型愈加
27、数据中立,集合大小改变时也更用使模型愈加数据中立,集合大小改变时也更易维护。易维护。36第36页四、利用定义集合方法求解规划问题四、利用定义集合方法求解规划问题37第37页四、利用定义集合方法求解规划问题四、利用定义集合方法求解规划问题 任务A任务B任务C任务D任务E员工11415131811员工210810813员工32625272423员工44235473441员工5131518101438第38页四、利用定义集合方法求解规划问题四、利用定义集合方法求解规划问题解法一解法一:直接将算式输入LINGO中进行运算(不过变量较多时,会感觉输入过程有大量重复),即可取得结果。39第39页四、利用定
28、义集合方法求解规划问题四、利用定义集合方法求解规划问题结果为:指派员工结果为:指派员工1做任务做任务C,员工,员工2做任务做任务A,员工,员工3做任务做任务E,员工,员工4做任务做任务B,员工,员工5做任做任务务D,最小总耗时为,最小总耗时为Z(=13+10+23+35+10)=91小时。小时。【必须注意到必须注意到:另一个解(指派员工:另一个解(指派员工1做任务做任务C,员工,员工2做任务做任务B,员工,员工3做任务做任务E,员工,员工4做做任务任务D,员工,员工5做任务做任务A,最小总耗时为,最小总耗时为Z(=13+8+23+34+13)=91小时)却小时)却并并没有被求得没有被求得】40
29、第40页四、利用定义集合方法求解规划问题四、利用定义集合方法求解规划问题解法二解法二:利用定义集合方法进行求解,可得到相同运算结果。41第41页四、利用定义集合方法求解规划问题四、利用定义集合方法求解规划问题解法一解法一:直接将算式输入LINGO中进行运算,即可取得结果。42第42页四、利用定义集合方法求解规划问题四、利用定义集合方法求解规划问题解法二解法二:利用定义集合方法进行求解,可得到相同运算结果。43第43页四、利用定义集合方法求解规划问题四、利用定义集合方法求解规划问题44第44页四、利用定义集合方法求解规划问题四、利用定义集合方法求解规划问题例例3 酒酒精精问问题题:体体重重约约7
30、0KG某某人人在在短短时时间间内内喝喝下下2瓶瓶啤啤酒酒后后,隔隔一一定定时时间间测测量量他他血血液液中中酒酒精精含含量量,得得到到数数据据以以下下表表,试试建建立立饮饮酒酒后后血血液液中酒精含量数学模型。中酒精含量数学模型。时间(t小时)0.250.50.7511.522.533.5酒精含量y306875828277686858时间(t小时)44.5567891011酒精含量y515041383528251815时间(t小时)1213141516酒精含量y121077445第45页四、利用定义集合方法求解规划问题四、利用定义集合方法求解规划问题46第46页四、利用定义集合方法求解规划问题四、
31、利用定义集合方法求解规划问题47第47页四、利用定义集合方法求解规划问题四、利用定义集合方法求解规划问题48第48页四、利用定义集合方法求解规划问题四、利用定义集合方法求解规划问题49第49页五、基本数学函数五、基本数学函数绝对值绝对值abs(x)、余弦余弦cos(x)、指数指数exp(x)、取整取整floor(x)、Gamma-对数对数lgm(x)【Gamma函数自然对数函数函数自然对数函数】、自然对数自然对数log(x)、模取余模取余mod(x,y)、次幂次幂pow(x,y)、符号符号sign(x)【x=0时时值值为为1,与与MATLABsign()不一样不一样】、50第50页五、基本数学
32、函数五、基本数学函数正弦正弦sin(x)、一列数一列数(list)最大值最大值smax(list)、一列数一列数(list)最小值最小值smin(list)、平方平方sqr(x)、开平方、开平方sqrt(x)、正切、正切tan(x)另外还有一个逻辑判断函数另外还有一个逻辑判断函数IF:IF(逻辑表示式逻辑表示式,True_value,False_value)【当逻辑表示式值为当逻辑表示式值为True时,输出时,输出True_value;为;为False时,输出时,输出False_value。非零值为。非零值为True,0为为False】51第51页1.P163练习题练习题1、2、3,文件名分别为:文件名分别为:ex6_2_1set.lg4、ex6_2_2set.lg4、ex6_2_3set.lg4 2.再现教材再现教材P158-159程序文件程序文件:assign0.lg4、assign.lg4要求:提交程序文件和对应截图文件(图形文件格式要求:提交程序文件和对应截图文件(图形文件格式为为 JPG格式,文件名主名相同)格式,文件名主名相同)发给:发给:adminsystem.mail上机作业上机作业52第52页