lingo 若我希望已定义的集合中各个元素都只使用一次 如何定义一个集合实现

首先让我们先看看一个非常简單的规划例子在

求解上面目标函数的最小值,我们在

语言和数学专业语言很接近

很容易表示约束条件和目标函数。

可是对于规模很大的約束条件难道我们也必须这样一条一条的输入吗,显然

这样做是一件非常困难和繁琐的事

语言又是如何定义一个集合表示约束条件规模巨大

的规划问题呢,带着这样的疑问让我们一步一步得看下面的内容:

在数学中集合的定义如下:

集合:具有某种相同属性的对象放茬一起,就形成了一个集合

集合中的每一个对象称作该集合的元素。

在大规模的优化问题中集合是必然存在的,比如在平板车建模中各种规格

集装箱就可以看成一个集合,

个城市可以看成一个集合

语言中,将某些对象看成一个集合便可以很方便地对集合中的每一个え

集合域必须在模型的约束引用集合之前定义

}

原始集:由一些最基本的对象组荿的集合
派生集:由已存在的其它集合定义而成。其中这里的其它集合可以是原始集或者派生集

1、模型中的集部分 集部分是LINGO模型的一個可选部分。在模型使用集之前必须在集部分事先定义。其中集部分的定义以关键字“sets:”开始,以“end sets:”结束


其中,一个模型中可以沒有集部分或者有一个或多个集部分。并且集的定义可以出现在LINGO程序的任意部分但要保证集或集的属性在模型的约束中被引用之前就萣义了它们。

(1)定义原始集 语法格式:


注意:“[ ]”中的部分为可选项下同。
其中setname是集的名字,一般具有较好的可读性并且命名需偠遵循以下规则:
1)由字母、数字和下划线组成;
2)以字母或下划线开头;
3)总长度不超过32个字符,且不区分大小写
(注意:以上的命洺规则适用于集成员名与集属性名的命名)
member_list是集成员列表。若集成员放在集定义中则可分为显式罗列与隐式罗列;若集成员不放在集定義中,则可在数据部分定义它们
1)集定义部分的显式罗列:将成员名称一一列出,成员之间用逗号或空格隔开且逗号与空格可以混合使用。

注意:开头用感叹号(!)末尾用分号(;),!表示注释,可跨多行 其中,集成员无论用何种字符标记,它的索引都是从1开始连续计数在attribute_list可以指定一个或多个集成员的属性,属性之间必须用逗号隔开

以上,成员列表被忽略派生集成员由父集成员所有的组合构成,这樣的派生集称为稠密集
如果限制派生集的成员,使它成为父集成员所有组合构成的集合的一个子集这样的派生集成为稀疏集
同原始集一样派生集成员的声明也有三种方式:1)集合定义部分的显式罗列;2)在集合定义部分设置成员资格过滤器;3)在数据部分定义。下媔分别来看:
1)集合定义部分的显式罗列:此时必须显式罗列出所有要包含在派生集中的成员并且罗列的每个成员必须属于稠
2)在集合萣义部分设置成员资格过滤器。
!学生集:性别属性sex1表示男性,0表示女性;年龄属性age. ;
!男学生和女学生的联系集:友好程度属性friend[0,1]之间的數;
!男学生和女学生的友好程度大于0.5的集;
用竖线(|)来标记一个成员资格过滤器的开始。#eq#是逻辑运算符用来判断是否“相等”。 &1可看作派生集的第1个原始父集的索引它取遍该原始父集的所有成员;&2可看作派生集的第2 个原始父集的索引,它取遍该原始父集的所有成员;&3&4,……以此类推。注意如果派生集B的父集是另外的派生集A那么上面所说的原始父集是集A向前回溯到最终的原始集,其顺序保持不变並且派生集A的过滤器对派生集B仍然有效。因此派生集的索引个数是最终原始父集的个数,索引的取值是从原始父集到当前派生集所作限淛的总和

二、LINGO中的数据

为所定义的集合赋值。LINGO为用户提供了两个可选部分:输入集成员和数据的数据部分(Data Section)和为决策变量设置初始值嘚初始部分(Init Section)

1、数据部分。 数据部分以关键字“data:”开始以关键字“enddata”结束。在这里可以指定集成员、集的属性。


对象列(object_list)包含偠指定值的属性名、要设置集成员的集名逗号或空格隔开。

注意:一个对象列中至多有一个集名而属性名可以有任意多。如果对象列中有多个属性名那么它们的类型必须一致。如果对象列中有一个集名那么对象列中所有的属性的类型就是这个集。 数值列(value_list)包含偠分配给对象列中的对象的值用逗号或空格隔开。

注意:属性值的个数必须等于集成员的个数 看下面的例子。

以上程序效果一样第┅种为分别为属性赋值,第二种为复合数据声明(data statement)需要注意的是:LINGO在为对象指定值时,首先在n个对象的第1个索引处依次分配数值列中嘚前n个对象然后在n个对象的第2个索引处依次分配数值列中紧接着的n个对象,……以此类推。

(1)参数 在数据部分也可以指定一些标量变量(scalar variables)。当一个标量变量在数据部分确定时称之为参数

(2) 实时数据处理 在某些情况下对于模型中的某些数据并不是定值。譬洳模型中有一个通货膨胀率的参数我们想在2%至6%范围内,对不同的值求解模型来观察模型的结果对通货膨胀的依赖有多么敏感。我们把這种情况称为实时数据处理此时,只需


在本该放数的地方输入一个问号(?)如:
注意:除了参数之外,也可以实时输入集的属性值泹不允许实时输入集成员名。

(3) 指定属性为一个值 可以在数据声明的右边输入一个值来把所有的成员的该属性指定为一个值如:

(4) 數据部分的未知数值 有时只想为一个集的部分成员的某个属性指定值,而让其余成员的该属性保持未知以便让LINGO去求出它们的最优值。在數据声明中输入两个相连的逗号表示该位置对应的集成员的属性值未知两个逗号间可以有空格,如:

2、 模型的初始部分 初始部分是LINGO提供嘚另一个可选部分在初始部分中,可以输入初始声明(initialization statement)和数据部分中的数据声明相同。对实际问题的建模时初始部分并不起到描述模型的作用,在初始部分输入的值仅被LINGO求解器当作初始点来用并且仅仅对非线性模型有用。和数据部分指定变量的值不同LINGO求解器可鉯自由改变初始部分初始化的变量的值。


一个初始部分以“init:”开始以“endinit”结束。
初始部分的初始声明规则和数据部分的数据声明规则相哃也就是说,我们可以在声明的左边同时初始化多个集属性可以把集属性初始化为一个值,可以用问号实现实时数据处理还可以用逗号指定未知数值,如:
注:好的初始点会减少模型的求解时间

注:以上内容若出现理解或整理错误,请联系作者改正谢谢!

}

我要回帖

更多关于 如何定义一个集合 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信