LINGO入门.docx

上传人:b****6 文档编号:5383164 上传时间:2022-12-15 格式:DOCX 页数:21 大小:89.51KB
下载 相关 举报
LINGO入门.docx_第1页
第1页 / 共21页
LINGO入门.docx_第2页
第2页 / 共21页
LINGO入门.docx_第3页
第3页 / 共21页
LINGO入门.docx_第4页
第4页 / 共21页
LINGO入门.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

LINGO入门.docx

《LINGO入门.docx》由会员分享,可在线阅读,更多相关《LINGO入门.docx(21页珍藏版)》请在冰豆网上搜索。

LINGO入门.docx

LINGO入门

第四章LINGO入门

4.1LINGOWINDOWS的常用命令 

4.1.1文件菜单(FileMenu)

1.新建(New)

从文件菜单中选用“新建”命令、单击“新建”按钮或直接按F2键可以创建一个新的“Model”窗口。

在这个新的“Model”窗口中能够输入所要求解的模型。

2.打开(Open)

从文件菜单中选用“打开”命令、单击“打开”按钮或直接按F3键可以打开一个已经存在的文本文件。

这个文件可能是一个Model文件。

3.保存(Save)

从文件菜单中选用“保存”命令、单击“保存”按钮或直接按F4键用来保存当前活动窗口(最前台的窗口)中的模型结果、命令序列等保存为文件。

4.另存为...(SaveAs...)

从文件菜单中选用“另存为...”命令或按F5键可以将当前活动窗口中的内容保存为文本文件,其文件名为你在“另存为...”对话框中输入的文件名。

利用这种方法你可以将任何窗口的内容如模型、求解结果或命令保存为文件。

5.关闭(Close)

在文件菜单中选用“关闭”(Close)命令或按F6键将关闭当前活动窗口。

如果这个窗口是新建窗口或已经改变了当前文件的内容,LINGO系统将会提示是否想要保存改变后的内容。

6.打印(Print)

在文件菜单中选用“打印”(Print)命令、单击“打印”按钮或直接按F7键可以将当前活动窗口中的内容发送到打印机。

7.打印设置(PrintSetup...)

在文件菜单中选用“打印设置...”命令或直接按F8键可以将文件输出到指定的打印机。

8.打印预览(PrintPreview)

在文件菜单中选用“打印预览...”命令或直接按Shift+F8键可以进行打印预览。

9.输出到日志文件(LogOutput...)

从文件菜单中选用“LogOutput...”命令或按F9键打开一个对话框,用于生成一个日志文件,它存储接下来在“命令窗口”中输入的所有命令。

10.提交LINGO命令脚本文件(TakeCommands...)

从文件菜单中选用“TakeCommands...”命令或直接按F11键就可以将LINGO命令脚本(commandscript)文件提交给系统进程来运行。

11.引入LINGO文件(ImportLingoFile...)

从文件菜单中选用“ImportLingoFile...”命令或直接按F12键可以打开一个LINGO格式模型的文件,然后LINGO系统会尽可能把模型转化为LINGO语法允许的程序。

12.退出(Exit)

从文件菜单中选用“Exit”命令或直接按F10键可以退出LINGO系统。

4.1.2编辑菜单(EditMenu)

1.恢复(Undo)

从编辑菜单中选用“恢复”(Undo)命令或按Ctrl+Z组合键,将撤销上次操作、恢复至其前的状态。

2.剪切(Cut)

从编辑菜单中选用“剪切”(Cut)命令或按Ctrl+X组合键可以将当前选中的内容剪切至剪贴板中。

3.复制(Copy)

从编辑菜单中选用“复制”(Copy)命令、单击“复制”按钮或按Ctrl+C组合键可以将当前选中的内容复制到剪贴板中。

4.粘贴(Paste)

从编辑菜单中选用“粘贴”(Paste)命令、单击“粘贴”按钮或按Ctrl+V组合键可以将粘贴板中的当前内容复制到当前插入点的位置。

5.粘贴特定..(PasteSpecial。

与上面的命令不同,它可以用于剪贴板中的内容不是文本的情形。

6.全选(SelectAll)

从编辑菜单中选用“SelectAll”命令或按Ctrl+A组合键可选定当前窗口中的所有内容。

7.匹配小括号(MatchParenthesis)

从编辑菜单中选用“MatchParenthesis”命令、单击“MatchParenthesis”按钮或按Ctrl+P组合键可以为当前选中的开括号查找匹配的闭括号。

8.粘贴函数(PasteFunction)

从编辑菜单中选用“PasteFunction”命令可以将LINGO的内部函数粘贴到当前插入点。

4.1.3LINGO菜单

1.求解模型(Slove)

从LINGO菜单中选用“求解”命令、单击“Slove”按钮或按Ctrl+S组合键可以将当前模型送入内存求解。

2.求解结果...(Solution...)

从LINGO菜单中选用“Solution...”命令、单击“Solution...”按钮或直接按Ctrl+O组合键可以打开求解结果的对话框。

这里可以指定查看当前内存中求解结果的那些内容。

3.查看...(Look...)

从LINGO菜单中选用“Look...”命令或直接按Ctrl+L组合键可以查看全部的或选中的模型文本内容。

4.灵敏性分析(Range,Ctrl+R)

用该命令产生当前模型的灵敏性分析报告:

研究当目标函数的费用系数和约束右端项在什么范围(此时假定其它系数不变)时,最优基保持不变。

灵敏性分析是在求解模型时作出的,因此在求解模型时灵敏性分析是激活状态,但是默认是不激活的。

为了激活灵敏性分析,运行LINGO|Options…,选择GeneralSolverTab,在DualComputations列表框中,选择PricesandRanges选项。

灵敏性分析耗费相当多的求解时间,因此当速度很关键时,就没有必要激活它。

4.2LINGO的常用函数

LINGO有9种类型的函数:

1. 基本运算符:

包括算术运算符、逻辑运算符和关系运算符

2. 数学函数:

三角函数和常规的数学函数

3. 金融函数:

LINGO提供的两种金融函数

4. 概率函数:

LINGO提供了大量概率相关的函数

5. 变量界定函数:

这类函数用来定义变量的取值范围

6. 集操作函数:

这类函数为对集的操作提供帮助

7. 集循环函数:

遍历集的元素,执行一定的操作的函数

8. 数据输入输出函数:

这类函数允许模型和外部数据源相联系,进行数据的输入输出

9. 辅助函数:

各种杂类函数

4.2.1基本运算符

这些运算符是非常基本的,甚至可以不认为它们是一类函数。

事实上,在LINGO中它们是非常重要的。

4.2.1.1算术运算符

算术运算符是针对数值进行操作的。

LINGO提供了5种二元运算符:

^ 乘方

﹡ 乘

/ 除

﹢ 加

﹣ 减

LINGO唯一的一元算术运算符是取反函数“﹣”。

这些运算符的优先级由高到底为:

﹣ ^ ﹡/ ﹢﹣。

运算符的运算次序为从左到右按优先级高低来执行。

运算的次序可以用圆括号“()”来改变。

4.2.1.2逻辑运算符

在LINGO中,逻辑运算符主要用于集循环函数的条件表达式中,来控制在函数中哪些集成员被包含,哪些被排斥。

在创建稀疏集时用在成员资格过滤器中。

LINGO具有9种逻辑运算符:

#not# 否定该操作数的逻辑值,#not#是一个一元运算符

#eq#  若两个运算数相等,则为true;否则为flase

#ne#若两个运算符不相等,则为true;否则为flase

#gt#若左边的运算符严格大于右边的运算符,则为true;否则为flase

#ge# 若左边的运算符大于或等于右边的运算符,则为true;否则为flase

#lt# 若左边的运算符严格小于右边的运算符,则为true;否则为flase

#le# 若左边的运算符小于或等于右边的运算符,则为true;否则为flase

#and# 仅当两个参数都为true时,结果为true;否则为flase

#or#仅当两个参数都为false时,结果为false;否则为true

这些运算符的优先级由高到低为:

高#not#

#eq##ne##gt##ge##lt##le#

低#and##or#

4.2.1.3关系运算符

在LINGO中,关系运算符主要是被用在模型中,来指定一个表达式的左边是否等于、小于等于、或者大于等于右边,形成模型的一个约束条件。

关系运算符与逻辑运算符#eq#、#le#、#ge#截然不同,前者是模型中该关系运算符所指定关系的为真描述,而后者仅仅判断一个该关系是否被满足:

满足为真,不满足为假。

LINGO有三种关系运算符:

“=”、“<=”和“>=”。

LINGO中还能用“<”表示小于等于关系,“>”表示大于等于关系。

LINGO并不支持严格小于和严格大于关系运算符。

然而,如果需要严格小于和严格大于关系,比如让A严格小于B:

A

那么可以把它变成如下的小于等于表达式:

A+ε<=B,

这里ε是一个小的正数,它的值依赖于模型中A小于B多少才算不等。

 

下面给出以上三类操作符的优先级:

高 #not#﹣(取反)

  ^

    ﹡/

  ﹢﹣

#eq##ne##gt##ge##lt##le#

#and##or#

低<==>=

4.2.2数学函数

LINGO提供了大量的标准数学函数:

@abs(x)返回x的绝对值

@sin(x)返回x的正弦值,x采用弧度制

@cos(x)返回x的余弦值

@tan(x)返回x的正切值

@exp(x)返回常数e的x次方

@log(x)返回x的自然对数

@lgm(x)返回x的gamma函数的自然对数

@sign(x)如果x<0返回-1;否则,返回1

@floor(x)返回x的整数部分。

当x>=0时,返回不超过x的最大整数;当x<0时,返回不低于x的最大整数。

@smax(x1,x2,…,xn)返回x1,x2,…,xn中的最大值

@smin(x1,x2,…,xn)返回x1,x2,…,xn中的最小值

4.2.3金融函数

目前LINGO提供了两个金融函数。

1.

返回如下情形的净现值(净现值就是在一定时期内为了获得一定收益在该时期初所支付的实际费用):

单位时段利率为I,连续n个时段支付,每个时段支付单位费用。

若每个时段支付x单位的费用,则净现值可用x乘以

算得。

的计算公式为:

2.

返回如下情形的净现值:

单位时段利率为I,第n个时段支付单位费用。

的计算公式为

4.2.4概率函数

1.@pbn(p,n,x)

二项分布的累积分布函数。

当n和(或)x不是整数时,用线性插值法进行计算。

2.@pcx(n,x)

自由度为n的χ2分布的累积分布函数。

3.@peb(a,x)

当到达负荷为a,服务系统有x个服务器且允许无穷排队时的Erlang繁忙概率。

4.@pel(a,x)

当到达负荷为a,服务系统有x个服务器且不允许排队时的Erlang繁忙概率。

5.@pfd(n,d,x)

自由度为n和d的F分布的累积分布函数。

6.@pfs(a,x,c)

当负荷上限为a,顾客数为c,平行服务器数量为x时,有限源的Poisson服务系统的等待或返修顾客数的期望值。

a是顾客数乘以平均服务时间,再除以平均返修时间。

当c和(或)x不是整数时,采用线性插值进行计算。

7.@phg(pop,g,n,x)

超几何(Hypergeometric)分布的累积分布函数。

pop表示产品总数,g是正品数。

从所有产品中任意取出n(n≤pop)件。

pop,g,n和x都可以是非整数,这时采用线性插值进行计算。

8.@ppl(a,x)

Poisson分布的线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z服从均值为a的Poisson分布。

9.@pps(a,x)

均值为a的Poisson分布的累积分布函数。

当x不是整数时,采用线性插值进行计算。

10.@psl(x)

单位正态线性损失函数,即返回max(0,z-x)的期望值,其中随机变量z服从标准正态分布。

11.@psn(x)

标准正态分布的累积分布函数。

12.@ptd(n,x)

自由度为n的t分布的累积分布函数。

13.@qrand(seed)

产生服从(0,1)区间的拟随机数。

@qrand只允许在模型的数据部分使用,它将用拟随机数填满集属性。

通常,声明一个m×n的二维表,m表示运行实验的次数,n表示每次实验所需的随机数的个数。

在行内,随机数是独立分布的;在行间,随机数是非常均匀的。

这些随机数是用“分层取样”的方法产生的。

14.@rand(seed)

返回0和1间的伪随机数,依赖于指定的种子。

典型用法是U(I+1)=@rand(U(I))。

注意如果seed不变,那么产生的随机数也不变。

4.2.5变量界定函数

变量界定函数实现对变量取值范围的附加限制,共4种:

@bin(x)限制x为0或1

@bnd(L,x,U)限制L≤x≤U

@free(x)取消对变量x的默认下界为0的限制,即x可以取任意实数

@gin(x)限制x为整数

在默认情况下,LINGO规定变量是非负的,也就是说下界为0,上界为+∞。

@free取消了默认的下界为0的限制,使变量也可以取负值。

@bnd用于设定一个变量的上下界,它也可以取消默认下界为0的约束。

4.2.6集操作函数

LINGO提供了几个函数帮助处理集。

1.@in(set_name,primitive_index_1[,primitive_index_2,…])

如果元素在指定集中,返回1;否则返回0。

2.@index([set_name,]primitive_set_element)

该函数返回在集set_name中原始集成员primitive_set_element的索引。

如果set_name被忽略,那么LINGO将返回与primitive_set_element匹配的第一个原始集成员的索引。

如果找不到,则产生一个错误。

3.@wrap(index,limit)

该函数返回j=index-k*limit,其中k是一个整数,取适当值保证j落在区间[1,limit]内。

该函数相当于index模limit再加1。

该函数在循环、多阶段计划编制中特别有用。

4.@size(set_name)

该函数返回集set_name的成员个数。

在模型中明确给出集大小时最好使用该函数。

它的使用使模型更加数据中立,集大小改变时也更易维护。

4.2.7集循环函数

集循环函数遍历整个集进行操作。

其语法为

@function(setname[(set_index_list)[|conditional_qualifier]]:

expression_list);

@function相应于下面罗列的四个集循环函数之一;setname是要遍历的集;set_index_list是集索引列表;conditional_qualifier是用来限制集循环函数的范围,当集循环函数遍历集的每个成员时,LINGO都要对conditional_qualifier进行评价,若结果为真,则对该成员执行@function操作,否则跳过,继续执行下一次循环。

expression_list是被应用到每个集成员的表达式列表,当用的是@for函数时,expression_list可以包含多个表达式,其间用逗号隔开。

这些表达式将被作为约束加到模型中。

当使用其余的三个集循环函数时,expression_list只能有一个表达式。

如果省略set_index_list,那么在expression_list中引用的所有属性的类型都是setname集。

1.@for

该函数用来产生对集成员的约束。

基于建模语言的标量需要显式输入每个约束,不过@for函数允许只输入一个约束,然后LINGO自动产生每个集成员的约束。

2.@sum

该函数返回遍历指定的集成员的一个表达式的和。

3.@min和@max

返回指定的集成员的一个表达式的最小值或最大值。

4.2.8输入和输出函数

输入和输出函数可以把模型和外部数据比如文本文件、数据库和电子表格等连接起来。

1.@file函数

该函数用从外部文件中输入数据,可以放在模型中任何地方。

该函数的语法格式为@file(’filename’)。

这里filename是文件名,可以采用相对路径和绝对路径两种表示方式。

@file函数对同一文件的两种表示方式的处理和对两个不同的文件处理是一样的,这一点必须注意。

2.@text函数

该函数被用在数据部分用来把解输出至文本文件中。

它可以输出集成员和集属性值。

其语法为

@text([’filename’])

这里filename是文件名,可以采用相对路径和绝对路径两种表示方式。

如果忽略filename,那么数据就被输出到标准输出设备(大多数情形都是屏幕)。

@text函数仅能出现在模型数据部分的一条语句的左边,右边是集名(用来输出该集的所有成员名)或集属性名(用来输出该集属性的值)。

我们把用接口函数产生输出的数据声明称为输出操作。

输出操作仅当求解器求解完模型后才执行,执行次序取决于其在模型中出现的先后。

3.@ole函数

@OLE是从EXCEL中引入或输出数据的接口函数,它是基于传输的OLE技术。

OLE传输直接在内存中传输数据,并不借助于中间文件。

当使用@OLE时,LINGO先装载EXCEL,再通知EXCEL装载指定的电子数据表,最后从电子数据表中获得Ranges。

为了使用OLE函数,必须有EXCEL5及其以上版本。

OLE函数可在数据部分和初始部分引入数据。

@OLE可以同时读集成员和集属性,集成员最好用文本格式,集属性最好用数值格式。

原始集每个集成员需要一个单元(cell),而对于n元的派生集每个集成员需要n个单元,这里第一行的n个单元对应派生集的第一个集成员,第二行的n个单元对应派生集的第二个集成员,依此类推。

@OLE只能读一维或二维的Ranges(在单个的EXCEL工作表(sheet)中),但不能读间断的或三维的Ranges。

Ranges是自左而右、自上而下来读。

在EXCEL中定义Ranges名:

①按鼠标左键拖曳选择Range,

②释放鼠标按钮,

③选择“插入|名称|定义”,

④输入希望的名字,

⑤点击“确定”按钮。

4.@ranged(variable_or_row_name)

为了保持最优基不变,变量的费用系数或约束行的右端项允许减少的量。

5.@rangeu(variable_or_row_name)

为了保持最优基不变,变量的费用系数或约束行的右端项允许增加的量。

6.@status()

返回LINGO求解模型结束后的状态:

0GlobalOptimum(全局最优)

1Infeasible(不可行)

2Unbounded(无界)

3Undetermined(不确定)

4Feasible(可行)

5InfeasibleorUnbounded(通常需要关闭“预处理”选项后重新求解模型,以确定模型究竟是不可行还是无界)

6LocalOptimum(局部最优)

7LocallyInfeasible(局部不可行,尽管可行解可能存在,但是LINGO并没有找到一个)

8Cutoff(目标函数的截断值被达到)

9NumericError(求解器因在某约束中遇到无定义的算术运算而停止)

通常,如果返回值不是0、4或6时,那么解将不可信,几乎不能用。

该函数仅被用在模型的数据部分来输出数据。

7.@dual

@dual(variable_or_row_name)返回变量的判别数(检验数)或约束行的对偶(影子)价格(dualprices)。

4.2.9辅助函数

1.@if(logical_condition,true_result,false_result)

@if函数将评价一个逻辑表达式logical_condition,如果为真,返回true_result,否则返回false_result。

2.@warn(’text’,logical_condition)

如果逻辑条件logical_condition为真,则产生一个内容为’text’的信息框。

4.3LINGO中的集

对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群体、交通工具和雇工等等。

LINGO允许把这些相联系的对象聚合成集(sets)。

一旦把对象聚合成集,就可以利用集来最大限度的发挥LINGO建模语言的优势。

现在我们将深入介绍如何创建集,并用数据初始化集的属性。

学完本节后,你对基于建模技术的集如何引入模型会有一个基本的理解。

4.3.1为什么使用集

集是LINGO建模语言的基础,是程序设计最强有力的基本构件。

借助于集,能够用一个单一的、长的、简明的复合公式表示一系列相似的约束,从而可以快速方便地表达规模较大的模型。

 

4.3.2什么是集

集是一群相联系的对象,这些对象也称为集的成员。

一个集可能是一系列产品、卡车或雇员。

每个集成员可能有一个或多个与之有关联的特征,我们把这些特征称为属性。

属性值可以预先给定,也可以是未知的,有待于LINGO求解。

例如,产品集中的每个产品可以有一个价格属性;卡车集中的每辆卡车可以有一个牵引力属性;雇员集中的每位雇员可以有一个薪水属性,也可以有一个生日属性等等。

LINGO有两种类型的集:

原始集(primitive set)和派生集(derivedset)。

一个原始集是由一些最基本的对象组成的。

一个派生集是用一个或多个其它集来定义的,也就是说,它的成员来自于其它已存在的集。

 

4.3.3模型的集部分

集部分是LINGO模型的一个可选部分。

在LINGO模型中使用集之前,必须在集部分事先定义。

集部分以关键字“sets:

”开始,以“endsets”结束。

一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分。

一个集部分可以放置于模型的任何地方,但是一个集及其属性在模型约束中被引用之前必须定义了它们。

定义原始集:

为了定义一个原始集,必须详细声明:

·集的名字

·可选,集的成员

·可选,集成员的属性

定义一个原始集,用下面的语法:

setname[/member_list/][:

attribute_list];

注意:

用“[]”表示该部分内容可选。

下同,不再赘述。

Setname是你选择的来标记集的名字,最好具有较强的可读性。

集名字必须严格符合标准命名规则:

以拉丁字母或下划线(_)为首字符,其后由拉丁字母(A—Z)、下划线、阿拉伯数字(0,1,…,9)组成的总长度不超过32个字符的字符串,且不区分大小写。

注意:

该命名规则同样适用于集成员名和属性名等的命名。

Member_list是集成员列表。

如果集成员放在集定义中,那么对它们可采取显式罗列和隐式罗列两种方式。

如果集成员不放在集定义中,那么可以在随后的数据部分定义它们。

①当显式罗列成员时,必须为每个成员输入一个不同的名字,中间用空格或逗号搁开,允许混合使用。

②当隐式罗列成员时,不必罗列出每个集成员。

可采用如下语法:

setname/member1..memberN/[:

attribute_list];

这里的member1是集的第一个成员名,memberN是集的最末一个成员名。

LINGO将自动产生中间的所有成员名。

LINGO也接受一些特定的首成员名和末成员名,用于创建一些特殊的集。

列表如下:

表4-1基本集合的隐式列举法

隐式成员列表格式

示例

所产生集成员

1..n

1..5

1,2,3,4,5

StringM..StringN

Car2..car14

Car2,Car3,Car4,…,Car14

DayM..DayN

Mon..Fri

Mo

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

当前位置:首页 > 高等教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1