收藏 分享(赏)

LINGO入门教程.pdf

上传人:weiwoduzun 文档编号:3581135 上传时间:2018-11-13 格式:PDF 页数:53 大小:566.63KB
下载 相关 举报
LINGO入门教程.pdf_第1页
第1页 / 共53页
LINGO入门教程.pdf_第2页
第2页 / 共53页
LINGO入门教程.pdf_第3页
第3页 / 共53页
LINGO入门教程.pdf_第4页
第4页 / 共53页
LINGO入门教程.pdf_第5页
第5页 / 共53页
点击查看更多>>
资源描述

1、LINGO快速入门 LINGO 是用来求解线性和非线性优化问题的简易工具。LINGO 内置了一种建立最优 化模型的语言,可以简便地表达大规模问题,利用 LINGO高效的求解器可快速求解并分析 结果。 1 LINGO快速入门 2 2 LINGO中的集 3 2.1 为什么使用集3 2.2 什么是集4 2.3 模型的集部分4 2.3.1 定义原始集.4 2.3.2 定义派生集.5 3 模型的数据部分和初始部分.7 3.1 模型的数据部分7 3.1.1 数据部分入门.7 3.1.2 参数.8 3.1.3 实时数据处理.8 3.1.4 指定属性为一个值.9 3.1.5 数据部分的未知数值.9 3.2 模

2、型的初始部分10 4 LINGO函数 10 4.1 基本运算符10 4.1.1 算术运算符.11 4.1.2 逻辑运算符.11 4.1.3 关系运算符.11 4.2 数学函数12 4.3 金融函数13 4.4 概率函数13 4.5 变量界定函数15 4.6 集操作函数15 4.7 集循环函数16 4.8 输入和输出函数18 4.9 辅助函数21 5 LINGO WINDOWS命令22 5.1 文件菜单(File Menu) .22 5.2 编辑菜单(Edit Menu)23 5.3 LINGO菜单 23 5.4 窗口菜单(Windows Menu) 35 5.5 帮助菜单(Help Menu)

3、.37 6 LINGO的命令行命令 37 7 综合举例.41 1 1 LINGO快速入门 当你在windows 下开始运行LINGO 系统时,会得到类似下面的一个窗口: 外层是主框架窗口, 包含了所有菜单命令和工具条, 其它所有的窗口将被包含在主窗口之下。 在主窗口内的标题为 LINGO Model LINGO1 的窗口是 LINGO的默认模型窗口,建立的模型 都都要在该窗口内编码实现。下面举两个例子。 例1.1 如何在LINGO 中求解如下的LP 问题: 0 , 600 2 100 350 . . 3 2 min 2 1 2 1 1 2 1 2 1 + + + x x x x x x x t

4、 s x x 在模型窗口中输入如下代码: min=2*x1+3*x2; x1+x2=350; x1=100; 2*x1+x2=600; 然后点击工具条上的按钮 即可。 例 1.2 使用 LINGO 软件计算 6 个发点 8 个收点的最小费用运输问题。产销单位运价如 下表。 单 位 销地 运 价 产地 B1 B2 B3 B4 B5 B6 B7 B8 产量 A1 6 2 6 7 4 2 5 9 60 A2 4 9 5 3 8 5 8 2 55 A3 5 2 1 9 7 4 3 3 51 A4 7 6 7 3 9 2 7 1 43 A5 2 3 9 5 7 2 6 5 41 A6 5 5 2 2 8

5、 1 4 3 52 2销量 35 37 22 32 41 32 43 38 使用 LINGO 软件,编制程序如下: model: !6 发点 8 收点运输问题; sets: warehouses/wh1wh6/: capacity; vendors/v1v8/: demand; links(warehouses,vendors): cost, volume; endsets !目标函数; min=sum(links: cost*volume); !需求约束; for(vendors(J): sum(warehouses(I): volume(I,J)=demand(J); !产量约束; for

6、(warehouses(I): sum(vendors(J): volume(I,J)=capacity(I); !这里是数据; data: capacity=60 55 51 43 41 52; demand=35 37 22 32 41 32 43 38; cost=6 2 6 7 4 2 9 5 4 9 5 3 8 5 8 2 5 2 1 9 7 4 3 3 7 6 7 3 9 2 7 1 2 3 9 5 7 2 6 5 5 5 2 2 8 1 4 3; enddata end 然后点击工具条上的按钮 即可。 为了能够使用 LINGO 的强大功能,接着第二节的学习吧。 2 LINGO中的

7、集 对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群体、 交通工具和雇工等等。LINGO 允许把这些相联系的对象聚合成集(sets) 。一旦把对象聚合 成集,就可以利用集来最大限度的发挥 LINGO 建模语言的优势。 现在我们将深入介绍如何创建集,并用数据初始化集的属性。学完本节后,你对基于建 模技术的集如何引入模型会有一个基本的理解。 2.1 为什么使用集 集是 LINGO建模语言的基础,是程序设计最强有力的基本构件。借助于集,能够用一个 单一的、长的、简明的复合公式表示一系列相似的约束,从而可以快速方便地表达规模较大 的模型。 32.2 什么是集 集是一群相联系的对

8、象,这些对象也称为集的成员。一个集可能是一系列产品、卡车或 雇员。每个集成员可能有一个或多个与之有关联的特征,我们把这些特征称为属性。属性值 可以预先给定,也可以是未知的,有待于 LINGO 求解。例如,产品集中的每个产品可以有一 个价格属性;卡车集中的每辆卡车可以有一个牵引力属性;雇员集中的每位雇员可以有一个 薪水属性,也可以有一个生日属性等等。 LINGO 有两种类型的集:原始集(primitive set)和派生集(derived set)。 一个原始集是由一些最基本的对象组成的。 一个派生集是用一个或多个其它集来定义的,也就是说,它的成员来自于其它已存在的 集。 2.3 模型的集部分

9、集部分是LINGO 模型的一个可选部分。在 LINGO 模型中使用集之前,必须在集部分事先 定义。集部分以关键字“sets:”开始,以“endsets”结束。一个模型可以没有集部分,或 有一个简单的集部分,或有多个集部分。一个集部分可以放置于模型的任何地方,但是一个 集及其属性在模型约束中被引用之前必须定义了它们。 2.3.1 定义原始集 为了定义一个原始集,必须详细声明: 集的名字 可选,集的成员 可选,集成员的属性 定义一个原始集,用下面的语法: setname/member_list/:attribute_list; 注意:用“”表示该部分内容可选。下同,不再赘述。 Setname 是你

10、选择的来标记集的名字,最好具有较强的可读性。集名字必须严格符合标 准命名规则:以拉丁字母或下划线(_)为首字符,其后由拉丁字母(AZ) 、下划线、阿拉 伯数字(0,1,9)组成的总长度不超过 32 个字符的字符串,且不区分大小写。 注意:该命名规则同样适用于集成员名和属性名等的命名。 Member_list是集成员列表。如果集成员放在集定义中,那么对它们可采取显式罗列和 隐式罗列两种方式。如果集成员不放在集定义中,那么可以在随后的数据部分定义它们。 当显式罗列成员时,必须为每个成员输入一个不同的名字,中间用空格或逗号搁开, 允许混合使用。 例 2.1 可以定义一个名为 students的原始集

11、,它具有成员 John、Jill、Rose 和Mike, 属性有sex 和age: sets: students/John Jill, Rose Mike/: sex, age; endsets 当隐式罗列成员时,不必罗列出每个集成员。可采用如下语法: setname/member1memberN/: attribute_list; 这里的 member1 是集的第一个成员名,memberN 是集的最末一个成员名。LINGO 将自动产生 中间的所有成员名。 LINGO 也接受一些特定的首成员名和末成员名, 用于创建一些特殊的集。 列表如下: 隐式成员列表格式 示例 所产生集成员 41n 15

12、1,2,3,4,5 StringMStringN Car2car14 Car2,Car3,Car4,Car14 DayMDayN MonFri Mon,Tue,Wed,Thu,Fri MonthMMonthN OctJan Oct,Nov,Dec,Jan MonthYearMMonthYearN Oct2001Jan2002 Oct2001,Nov2001,Dec2001,Jan2002 集成员不放在集定义中,而在随后的数据部分来定义。 例2.2 !集部分; sets: students:sex,age; endsets !数据部分; data: students,sex,age= John

13、1 16 Jill 0 14 Rose 0 17 Mike 1 13; enddata 注意:开头用感叹号(!) ,末尾用分号(;)表示注释,可跨多行。 在集部分只定义了一个集 students,并未指定成员。在数据部分罗列了集成员 John、 Jill、Rose 和Mike,并对属性sex 和age 分别给出了值。 集成员无论用何种字符标记,它的索引都是从 1 开始连续计数。在 attribute_ list 可 以指定一个或多个集成员的属性,属性之间必须用逗号隔开。 可以把集、集成员和集属性同 C 语言中的结构体作个类比。如下图: 集 结构体 集成员 结构体的域 集属性 结构体实例 LIN

14、GO 内置的建模语言是一种描述性语言,用它可以描述现实世界中的一些问题,然后 再借助于 LINGO 求解器求解。因此,集属性的值一旦在模型中被确定,就不可能再更改。在 LINGO 中,只有在初始部分中给出的集属性值在以后的求解中可更改。这与前面并不矛盾, 初始部分是 LINGO 求解器的需要,并不是描述问题所必须的。 2.3.2 定义派生集 为了定义一个派生集,必须详细声明: 集的名字 父集的名字 可选,集成员 可选,集成员的属性 可用下面的语法定义一个派生集: setname(parent_set_list)/member_list/:attribute_list; setname 是集的名

15、字。parent_set_list是已定义的集的列表,多个时必须用逗号隔开。 如果没有指定成员列表,那么 LINGO会自动创建父集成员的所有组合作为派生集的成员。派 生集的父集既可以是原始集,也可以是其它的派生集。 例2.3 sets: product/A B/; machine/M N/; 5 week/12/; allowed(product,machine,week):x; endsets LINGO 生成了三个父集的所有组合共八组作为 allowed 集的成员。列表如下: 编号 成员 1 (A,M,1) 2 2 (A,M,2) 3 3 (A,N,1) 4 4 (A,N,2) 5 5 (

16、B,M,1) 6 6 (B,M,2) 7 7 (B,N,1) 8 8 (B,N,2) 成员列表被忽略时, 派生集成员由父集成员所有的组合构成, 这样的派生集成为稠密集。 如果限制派生集的成员,使它成为父集成员所有组合构成的集合的一个子集,这样的派生集 成为稀疏集。同原始集一样,派生集成员的声明也可以放在数据部分。一个派生集的成员列 表有两种方式生成:显式罗列;设置成员资格过滤器。当采用方式时,必须显式罗列 出所有要包含在派生集中的成员,并且罗列的每个成员必须属于稠密集。使用前面的例子, 显式罗列派生集的成员: allowed(product,machine,week)/A M 1,A N 2,

17、B N 1/; 如果需要生成一个大的、稀疏的集,那么显式罗列就很讨厌。幸运地是许多稀疏集的成员都 满足一些条件以和非成员相区分。我们可以把这些逻辑条件看作过滤器,在 LINGO 生成派生 集的成员时把使逻辑条件为假的成员从稠密集中过滤掉。 例2.4 sets: !学生集:性别属性 sex,1 表示男性,0 表示女性;年龄属性 age. ; students/John,Jill,Rose,Mike/:sex,age; !男学生和女学生的联系集:友好程度属性friend,0,1之间的数。 ; linkmf(students,students)|sex( !男学生和女学生的友好程度大于 0.5 的集

18、; linkmf2(linkmf) | friend( endsets data: sex,age = 1 16 0 14 0 17 0 13; friend = 0.3 0.5 0.6; enddata 用竖线(|)来标记一个成员资格过滤器的开始。#eq#是逻辑运算符,用来判断是否“相 等”,可参考4. 对象列(object_list)包含要指定值的属性名、要设置集成员的集名,用逗号或空格 隔开。 一个对象列中至多有一个集名, 而属性名可以有任意多。 如果对象列中有多个属性名, 那么它们的类型必须一致。如果对象列中有一个集名,那么对象列中所有的属性的类型就是 这个集。 7数值列(value_

19、list)包含要分配给对象列中的对象的值,用逗号或空格隔开。注意属 性值的个数必须等于集成员的个数。看下面的例子。 例3.1 sets: set1/A,B,C/: X,Y; endsets data: X=1,2,3; Y=4,5,6; enddata 在集 set1 中定义了两个属性 X 和Y。X 的三个值是 1、2 和3,Y 的三个值是 4、5 和6。 也可采用如下例子中的复合数据声明(data statement)实现同样的功能。 例3.2 sets: set1/A,B,C/: X,Y; endsets data: X,Y=1 4 2 5 3 6; enddata 看到这个例子,可能会认

20、为 X 被指定了 1、4 和2 三个值,因为它们是数值列中前三个, 而正确的答案是 1、2 和 3。假设对象列有 n 个对象,LINGO 在为对象指定值时,首先在 n 个对象的第 1 个索引处依次分配数值列中的前 n个对象, 然后在 n 个对象的第 2 个索引处依 次分配数值列中紧接着的 n 个对象,以此类推。 模型的所有数据属性值和集成员被单独放在数据部分, 这可能是最规范的数据 输入方式。 3.1.2 参数 在数据部分也可以指定一些标量变量(scalar variables) 。当一个标量变量在数据部 分确定时,称之为参数。看一例,假设模型中用利率 8.5%作为一个参数,就可以象下面一 样

21、输入一个利率作为参数。 例3.3 data: interest_rate = .085; enddata 也可以同时指定多个参数。 例3.4 data: interest_rate,inflation_rate = .085 .03; enddata 3.1.3 实时数据处理 在某些情况, 对于模型中的某些数据并不是定值。 譬如模型中有一个通货膨胀率的参数, 我们想在 2%至 6%范围内,对不同的值求解模型,来观察模型的结果对通货膨胀的依赖有多 么敏感。我们把这种情况称为实时数据处理(what if analysis) 。LINGO 有一个特征可方 便地做到这件事。 8在本该放数的地方输入一个

22、问号(?) 。 例3.5 data: interest_rate,inflation_rate = .085 ?; enddata 每一次求解模型时,LINGO 都会提示为参数 inflation_rate 输入一个值。在 WINDOWS 操作 系统下,将会接收到一个类似下面的对话框: 直接输入一个值再点击 OK 按钮,LINGO 就会把输入的值指定给 inflation_rate,然后继续 求解模型。 除了参数之外,也可以实时输入集的属性值,但不允许实时输入集成员名。 3.1.4 指定属性为一个值 可以在数据声明的右边输入一个值来把所有的成员的该属性指定为一个值。 看下面的例 子。 例3.6

23、 sets: days /MO,TU,WE,TH,FR,SA,SU/:needs; endsets data: needs = 20; enddata LINGO 将用20 指定days 集的所有成员的needs 属性。对于多个属性的情形,见下例。 例3.7 sets: days /MO,TU,WE,TH,FR,SA,SU/:needs,cost; endsets data: needs cost = 20 100; enddata 3.1.5 数据部分的未知数值 有时只想为一个集的部分成员的某个属性指定值,而让其余成员的该属性保持未知,以 便让 LINGO去求出它们的最优值。 在数据声明中输

24、入两个相连的逗号表示该位置对应的集成 员的属性值未知。两个逗号间可以有空格。 例3.8 sets: years/15/: capacity; 9endsets data: capacity = ,34,20,; enddata 属性capacity 的第2 个和第3 个值分别为34 和20,其余的未知。 3.2 模型的初始部分 初始部分是 LINGO 提供的另一个可选部分。在初始部分中,可以输入初始声明 (initialization statement) ,和数据部分中的数据声明相同。对实际问题的建模时,初 始部分并不起到描述模型的作用,在初始部分输入的值仅被 LINGO 求解器当作初始点来

25、用, 并且仅仅对非线性模型有用。和数据部分指定变量的值不同,LINGO 求解器可以自由改变初 始部分初始化的变量的值。 一个初始部分以“init:”开始,以“endinit”结束。初始部分的初始声明规则和数据 部分的数据声明规则相同。也就是说,我们可以在声明的左边同时初始化多个集属性,可以 把集属性初始化为一个值,可以用问号实现实时数据处理,还可以用逗号指定未知数值。 例3.9 init: X, Y = 0, .1; endinit Y=log(X); X2+Y2=1; 好的初始点会减少模型的求解时间。 在这一节中,我们仅带大家接触了一些基本的数据输入和初始化概念,不过现在你应该 可以轻松的为

26、自己的模型加入原始数据和初始部分啦。 4 LINGO函数 有了前几节的基础知识,再加上本节的内容,你就能够借助于 LINGO 建立并求解复杂 的优化模型了。 LINGO 有9 种类型的函数: 1 基本运算符:包括算术运算符、逻辑运算符和关系运算符 2 数学函数:三角函数和常规的数学函数 3 金融函数:LINGO 提供的两种金融函数 4 概率函数:LINGO 提供了大量概率相关的函数 5 变量界定函数:这类函数用来定义变量的取值范围 6 集操作函数:这类函数为对集的操作提供帮助 7 集循环函数:遍历集的元素,执行一定的操作的函数 8 数据输入输出函数:这类函数允许模型和外部数据源相联系,进行数据

27、的输入输 出 9 辅助函数:各种杂类函数 4.1 基本运算符 这些运算符是非常基本的,甚至可以不认为它们是一类函数。事实上,在 LINGO 中它们 是非常重要的。 104.1.1 算术运算符 算术运算符是针对数值进行操作的。LINGO 提供了 5 种二元运算符: 乘方 乘 除 加 减 LINGO 唯一的一元算术运算符是取反函数“”。 这些运算符的优先级由高到底为: 高 (取反) 低 运算符的运算次序为从左到右按优先级高低来执行。运算的次序可以用圆括号“ () ”来 改变。 例4.1 算术运算符示例。 253,(24)5 等等。 4.1.2 逻辑运算符 在 LINGO 中,逻辑运算符主要用于集循

28、环函数的条件表达式中,来控制在函数中哪些集 成员被包含,哪些被排斥。在创建稀疏集时用在成员资格过滤器中。 LINGO 具有种逻辑运算符: #not# 否定该操作数的逻辑值,not是一个一元运算符 #eq# 若两个运算数相等,则为true;否则为flase #ne# 若两个运算符不相等,则为true;否则为flase #gt# 若左边的运算符严格大于右边的运算符,则为 true;否则为flase #ge# 若左边的运算符大于或等于右边的运算符,则为true;否则为flase #lt# 若左边的运算符严格小于右边的运算符,则为true;否则为flase #le# 若左边的运算符小于或等于右边的运算

29、符,则为true;否则为flase #and# 仅当两个参数都为true 时,结果为true;否则为flase #or# 仅当两个参数都为false 时,结果为false;否则为true 这些运算符的优先级由高到低为: 高 #not# #eq# #ne# #gt# #ge# #lt# #le# 低 #and# #or# 例4.2 逻辑运算符示例 2 #gt# 3 #and# 4 #gt# 2,其结果为假(0) 。 4.1.3 关系运算符 在 LINGO 中,关系运算符主要是被用在模型中,来指定一个表达式的左边是否等于、小 于等于、 或者大于等于右边, 形成模型的一个约束条件。 关系运算符与逻辑

30、运算符#eq#、 #le#、 #ge#截然不同,前者是模型中该关系运算符所指定关系的为真描述,而后者仅仅判断一个该 关系是否被满足:满足为真,不满足为假。 LINGO 有三种关系运算符:“=”、“=”。LINGO中还能用“”表示小于等11于关系, “”表示大于等于关系。LINGO 并不支持严格小于和严格大于关系运算符。然而, 如果需要严格小于和严格大于关系,比如让 A 严格小于 B: A= 4.2 数学函数 LINGO 提供了大量的标准数学函数: abs(x) 返回x 的绝对值 sin(x) 返回x 的正弦值,x 采用弧度制 cos(x) 返回x 的余弦值 tan(x) 返回x 的正切值 ex

31、p(x) 返回常数e 的x 次方 log(x) 返回x 的自然对数 lgm(x) 返回x 的gamma 函数的自然对数 sign(x) 如果x=0 时,返回不超过 x 的最大整数;当 x0 时,返回不低于 x 的最大整数。 smax(x1,x2,xn) 返回x1,x2,xn 中的最大值 smin(x1,x2,xn) 返回x1,x2,xn 中的最小值 例4.3 给定一个直角三角形,求包含该三角形的最小正方形。 解:如图所示。 , sin cos , cos , sin x b x a DE x b AD x a CE + = = = 求最小的正方形就相当于求如下的最优化问题: x b a E D

32、 C B A DE AD CE x , , max min 2 0 LINGO 代码如下: model: sets: object/13/: f; endsets data: a, b = 3, 4; !两个直角边长,修改很方便; enddata f(1) = a * sin(x); f(2) = b * cos(x); f(3) = a * cos(x) + b * sin(x); min = smax(f(1),f(2),f(3); bnd(0,x,1.57); end 12 在上面的代码中用到了函数bnd,详情请见4.5 节。 4.3 金融函数 目前 LINGO 提供了两个金融函数。 1

33、fpa(I,n) 返回如下情形的净现值:单位时段利率为 I,连续 n 个时段支付,每个时段支付单位费 用。若每个时段支付 x单位的费用,则净现值可用 x 乘以fpa(I,n)算得。fpa 的计算公式 为 I I I n n k k = + = + ) 1 ( 1 ) 1 ( 1 1 。 净现值就是在一定时期内为了获得一定收益在该时期初所支付的实际费用。 例 4.4 贷款买房问题 贷款金额 50000 元,贷款年利率 5.31%,采取分期付款方式(每 年年末还固定金额,直至还清) 。问拟贷款 10 年,每年需偿还多少元? LINGO 代码如下: 50000 = x * fpa(.0531,10)

34、; 答案是x=6573.069 元。 2fpl(I,n) 返回如下情形的净现值:单位时段利率为 I,第 n 个时段支付单位费用。fpl(I,n)的 计算公式为 n I + ) 1 ( 。 细心的读者可以发现这两个函数间的关系: = = n k k I fpl n I fpa 1 ) , ( ) , ( 。 4.4 概率函数 1pbn(p,n,x) 二项分布的累积分布函数。当 n 和(或)x 不是整数时,用线性插值法进行计算。 2pcx(n,x) 自由度为n的 2 分布的累积分布函数。 3peb(a,x) 当到达负荷为 a,服务系统有 x 个服务器且允许无穷排队时的 Erlang 繁忙概率。 4

35、pel(a,x) 当到达负荷为 a,服务系统有 x 个服务器且不允许排队时的 Erlang 繁忙概率。 5pfd(n,d,x) 自由度为 n 和 d 的 F 分布的累积分布函数。 6pfs(a,x,c) 当负荷上限为 a,顾客数为 c,平行服务器数量为 x 时,有限源的 Poisson 服务系统的 等待或返修顾客数的期望值。a 是顾客数乘以平均服务时间,再除以平均返修时间。当 c 和 (或)x 不是整数时,采用线性插值进行计算。 7phg(pop,g,n,x) 超几何(Hypergeometric)分布的累积分布函数。pop 表示产品总数,g 是正品数。从 所有产品中任意取出 n(npop)件

36、。pop,g,n 和 x 都可以是非整数,这时采用线性插值 进行计算。 8ppl(a,x) 13Poisson 分布的线性损失函数,即返回 max(0,z-x)的期望值,其中随机变量 z 服从均值 为a 的Poisson 分布。 9pps(a,x) 均值为 a 的Poisson 分布的累积分布函数。当 x不是整数时,采用线性插值进行计算。 10psl(x) 单位正态线性损失函数,即返回 max(0,z-x)的期望值,其中随机变量 z 服从标准正态 分布。 11psn(x) 标准正态分布的累积分布函数。 12ptd(n,x) 自由度为 n 的 t 分布的累积分布函数。 13qrand(seed)

37、 产生服从(0,1)区间的拟随机数。qrand 只允许在模型的数据部分使用,它将用拟随机 数填满集属性。通常,声明一个 mn的二维表,m 表示运行实验的次数,n 表示每次实验所 需的随机数的个数。在行内,随机数是独立分布的;在行间,随机数是非常均匀的。这些随 机数是用“分层取样”的方法产生的。 例4.5 model: data: M=4; N=2; seed=1234567; enddata sets: rows/1M/; cols/1N/; table(rows,cols): x; endsets data: X=qrand(seed); enddata end 如果没有为函数指定种子,那么

38、 LINGO 将用系统时间构造种子。 14rand(seed) 返回 0 和 1 间的伪随机数,依赖于指定的种子。典型用法是 U(I+1)=rand(U(I)。注 意如果 seed 不变,那么产生的随机数也不变。 例4.6 利用rand 产生 15 个标准正态分布的随机数和自由度为 2 的 t 分布的随机数。 model: !产生一列正态分布和 t 分布的随机数; sets: series/115/: u, znorm, zt; endsets !第一个均匀分布随机数是任意的; u( 1) = rand( .1234); !产生其余的均匀分布的随机数; for(series( I)| I #G

39、T# 1: u( I) = rand( u( I - 1) ); for( series( I): !正态分布随机数; psn( znorm( I) = u( I); 14 !和自由度为 2 的 t 分布随机数; ptd( 2, zt( I) = u( I); !ZNORM 和 ZT 可以是负数; free( znorm( I); free( zt( I); ); end 4.5 变量界定函数 变量界定函数实现对变量取值范围的附加限制,共 4 种: bin(x) 限制x 为0 或1 bnd(L,x,U) 限制LxU free(x) 取消对变量x 的默认下界为 0 的限制,即 x 可以取任意实数

40、 gin(x) 限制x 为整数 在默认情况下,LINGO 规定变量是非负的,也就是说下界为 0,上界为+。free 取消 了默认的下界为 0 的限制,使变量也可以取负值。bnd 用于设定一个变量的上下界,它也可 以取消默认下界为 0 的约束。 4.6 集操作函数 LINGO 提供了几个函数帮助处理集。 1in(set_name,primitive_index_1 ,primitive_index_2,) 如果元素在指定集中,返回 1;否则返回 0。 例4.7 全集为 I,B 是 I 的一个子集,C 是 B 的补集。 sets: I/x1x4/; B(I)/x2/; C(I)|#not#in(B

41、, endsets 2index(set_name, primitive_set_element) 该函数返回在集 set_name 中原始集成员 primitive_set_element 的索引。如果 set_name 被忽略,那么 LINGO 将返回与 primitive_set_element 匹配的第一个原始集成员的索引。如 果找不到,则产生一个错误。 例4.8 如何确定集成员(B,Y)属于派生集S3。 sets: S1/A B C/; S2/X Y Z/; S3(S1,S2)/A X, A Z, B Y, C X/; endsets X=in(S3,index(S1,B),inde

42、x(S2,Y); 看下面的例子,表明有时为index 指定集是必要的。 例4.9 sets: girls/debble,sue,alice/; boys/bob,joe,sue,fred/; endsets I1=index(sue); I2=index(boys,sue); I1 的值是 2,I2 的值是 3。我们建议在使用index 函数时最好指定集。 153wrap(index,limit) 该函数返回 j=index-k*limit, 其中 k是一个整数, 取适当值保证 j 落在区间1, limit 内。该函数相当于 index 模 limit 再加 1。该函数在循环、多阶段计划编制中

43、特别有用。 4size(set_name) 该函数返回集 set_name 的成员个数。在模型中明确给出集大小时最好使用该函数。它 的使用使模型更加数据中立,集大小改变时也更易维护。 4.7 集循环函数 集循环函数遍历整个集进行操作。其语法为 function(setname(set_index_list)|conditional_qualifier: expression_list); function 相应于下面罗列的四个集循环函数之一;setname 是要遍历的集;set_ index_list是集索引列表;conditional_qualifier 是用来限制集循环函数的范围,当集循

44、环函数遍历集的每个成员时, LINGO 都要对 conditional_qualifier 进行评价, 若结果为真, 则对该成员执行function 操作,否则跳过,继续执行下一次循环。expression_list 是被 应用到每个集成员的表达式列表,当用的是for函数时,expression_list可以包含多个表 达式,其间用逗号隔开。这些表达式将被作为约束加到模型中。当使用其余的三个集循环函 数时,expression_list 只能有一个表达式。如果省略 set_index_list,那么在 expression_list 中引用的所有属性的类型都是 setname 集。 1for

45、该函数用来产生对集成员的约束。基于建模语言的标量需要显式输入每个约束,不过 for 函数允许只输入一个约束,然后 LINGO 自动产生每个集成员的约束。 例4.10 产生序列1,4,9,16,25 model: sets: number/15/:x; endsets for(number(I): x(I)=I2); end 2sum 该函数返回遍历指定的集成员的一个表达式的和。 例4.11 求向量5,1,3,4,6,10前5 个数的和。 model: data: N=6; enddata sets: number/1N/:x; endsets data: x = 5 1 3 4 6 10; enddata s=sum(number(I) | I #le# 5: x); end 3min和max 返回指定的集成员的一个表达式的最小值或最大值。 例4.12 求向量5,1,3,4,6,10前 5 个数的最小值,后 3 个数的最大值。 model: data: N=6; 16

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

当前位置:首页 > 实用文档 > 简明教程

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


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

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

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