LINGO简介

LINDO 是一种专门用于求解数学规划问题的优化计算软件包,版权现在由美国 LINDO 系统公司(Lindo System Inc.)所拥有。LINDO 由美国芝加哥大学的 Linus Schrage 教授首先开发,随后又推出了 GINO, LINGO, LINGO NL (又称LINGO2) 和“what’s best!”等优化软件,现在一般仍用 LINDO 作为这些软件的统称。
LINDO 软件包的特点是:
程序执行速度 快,易于方便地输入、修改、求解和分析一个数学规划(优化问题
简要介绍:

  1. LINDO 是 Linear Interactive and Discrete Optimizer 字首的缩写形式,可以用来 求解线性规划(LP—Linear Programming),整数规划(IP—Integer Programming)和二次规 划(QP—Quadratic Programming)问题。
  2. GINO 是 General Interactive Optimizer 字首的缩写形式,可以用来求解非线 性规划(NLP—–Non-Linear Programming)问题,也可用于求解一些线性和非线性方程 (组)以及代数方程求根等。GINO 中包含了各种一般的数学函数(包括大量的概率函 数),可供使用者建立问题模型时调用
  3. LINGO 可以用来求解线性,非线性和整数规划问题。
  4. LINGO NL (LINGO2) 可以用来求解线性,非线性和整数规划问题。
    与 LINDO 和 GINO 不同的是,LINGO 和 LINGO NL (LINGO2) 包含了內置的建模 语言,允许以简练,直观的方式描述较大规模的优化问题,模型中所需的数据可以以一 定格式保存在独立的文件中。
  5. “what’s best!” 组件主要用于数据文件是由电子表格软件(如 LUTOS1-2-3 和 MS OFFICE 等)生成的情形。

LINGO快速入门

LINGO基础

当你在 windows 下开始运行 LINGO 系统时,会得到一个窗口:
外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主 窗口之下。在主窗口内的标题为 LINGO Model – LINGO1 的窗口是 LINGO 的默认模型窗 口,建立的模型都要在该窗口内编码实现。
由于 LINGO 中已假设所有的变量是非负的,所以非负约束不必再输入到计算机中, LINGO 也不区分变量中的大小写字符(任何小写字符将被转换为大写字符)

Lingo 模型由 4 个部分构成:目标与约束,集合,数据,初始。
pkIn3TI.png

Lingo 中有三类运算符:算术运算符,逻辑运算符和关系运算符。运算符的优先级

优先级 运算符
最高 #NOT# ,-(负号)
^
* ,/
+,-(减号)
#EQ#,#NE#,#GE#,#GT#,#LE#,#LT#
#AND#,#OR#
最低 <,=,>

LINGO 中的集 对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群 体、交通工具和雇工等等。LINGO 允许把这些相联系的对象聚合成集(sets)。一旦把 对象聚合成集,就可以利用集来最大限度的发挥 LINGO 建模语言的优势。

数据部分以关键字“data:”开始,以关键字“enddata”结束。在这里,可以指定 集成员、集的属性。其语法如下: object_list = value_list;

LINGO中的集和数据

LINGO中的集

什么是集

对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群 体、交通工具和雇工等等。LINGO 允许把这些相联系的对象聚合成集(sets)。一旦把 对象聚合成集,就可以利用集来最大限度的发挥 LINGO 建模语言的优势
集是一群相联系的对象,这些对象也称为集的成员。一个集可能是一系列产品、卡 车或雇员。每个集成员可能有一个或多个与之有关联的特征,我们把这些特征称为属性。 属性值可以预先给定,也可以是未知的,有待于 LINGO 求解。例如,产品集中的每个产 品可以有一个价格属性;卡车集中的每辆卡车可以有一个牵引力属性;雇员集中的每位 雇员可以有一个薪水属性,也可以有一个生日属性等等

集的部分

LINGO 有两种类型的集:原始集(primitive set)和派生集(derived set)。
一个原始集是由一些最基本的对象组成的。
一个派生集是用一个或多个其它集来定义的,也就是说,它的成员来自于其它已存在的集。

模型的集部分

集部分是 LINGO 模型的一个可选部分。在 LINGO 模型中使用集之前,必须在集部分 事先定义。集部分以关键字“sets:”开始,以“endsets”结束。一个模型可以没有集 部分,或有一个简单的集部分,或有多个集部分。一个集部分可以放置于模型的任何地 方,但是一个集及其属性在模型约束中被引用之前必须定义了它们

模型的数据部分和初始部分

数据部分入门

数据部分以关键字“data:”开始,以关键字“enddata”结束。在这里,可以指定 集成员、集的属性。其语法如下: object_list = value_list;
在处理模型的数据时,需要为集指派一些成员并且在 LINGO 求解模型之前为集的某 些属性指定值。为此,$\quad$LINGO 为用户提供了两个可选部分:输入集成员和数据的数据部 分(Data Section)和为决策变量设置初始值的初始部分(Init Section)。
对象列(object_list)包含要指定值的属性名、要设置集成员的集名,用逗号或 空格隔开。一个对象列中至多有一个集名,而属性名可以有任意多。如果对象列中有多 个属性名,那么它们的类型必须一致。如果对象列中有一个集名,那么对象列中所有的 属性的类型就是这个集。
$\quad$数值列(value_list)包含要分配给对象列中的对象的值,用逗号或空格隔开。注 意属性值的个数必须等于集成员的个数。看下面的例子。

参数

在数据部分也可以指定一些标量变量(scalar variables)。当一个标量变量在数 据部分确定时,称之为参数。看一例,假设模型中用利率 8.5%作为一个参数,就可以 象下面一样输入一个利率作为参数。

LINGO函数

LINGO 有 9 种类型的函数:
1. 基本运算符:包括算术运算符、逻辑运算符和关系运算符;
2. 数学函数:三角函数和常规的数学函数;
3. 金融函数:LINGO 提供的两种金融函数;
4. 概率函数:LINGO 提供了大量概率相关的函数;
5. 变量界定函数:这类函数用来定义变量的取值范围;
6. 集操作函数:这类函数为对集的操作提供帮助;
7. 集循环函数:遍历集的元素,执行一定的操作的函数;
8. 数据输入输出函数:这类函数允许模型和外部数据源相联系,进行数据的输入 输出;
9. 辅助函数:各种杂类函数。

运算符

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#

关系运算符

LINGO 中,关系运算符主要是被用在模型中,来指定一个表达式的左边是否等于、 小于等于、或者大于等于右边,形成模型的一个约束条件。关系运算符与逻辑运算符 #eq#、#le#、#ge#截然不同,前者是模型中该关系运算符所指定关系的为真描述,而后 者仅仅判断一个该关系是否被满足:满足为真,不满足为假。

数学函数

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 函数的自然对数
@mod(x,y) 返回 x 除以 y 的余数
@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 中的最小值

金融函数

1.@fpa(I,n):
单位时段利率为 I,连续 n 个时段支付,每个时段支付单 位费用。若每个时段支付 x 单位的费用,则净现值可用 x 乘以@fpa(I,n)算得

例 (贷款买房问题)贷款金额 50000 元,贷款年利率 5.31%,采取分期付款方 式(每年年末还固定金额,直至还清)。问拟贷款 10 年,每年需偿还多少元?
LINGO 代码如下: 50000 = x * @fpa(.0531,10);
[图片上传中…(image-q0rVttehXTYU1LlG)]
2.@fpl(I,n)
返回如下情形的净现值:单位时段利率为 I,第 n 个时段支付单位费用
输入图片说明

概率函数

指令 意义
@pbn(p,n,x) 二项分布的累积分布函数。当 n 和(或)x 不是整数时,用线性插值法进行计算
@pcx(n,x) 自由度为 n 的 χ2分布的累积分布函数
@peb(a,x) 当到达负荷为 a,服务系统有 x 个服务器且允许无穷排队时的 Erlang 繁忙概率
@pel(a,x) 当到达负荷为 a,服务系统有 x 个服务器且不允许排队时的 Erlang 繁忙概率
@pfd(n,d,x) 自由度为 n 和 d 的 F 分布的累积分布函数
@pfs(a,x,c) 当负荷上限为 a,顾客数为 c,平行服务器数量为 x 时,有限源的 Poisson 服务系统的等待或返修顾客数的期望值。a 是顾客数乘以平均服务时间,再除以平均返修时间。当 c 和(或)x 不是整数时,采用线性插值进行计算
@phg(pop,g,n,x) 超几何(Hypergeometric)分布的累积分布函数。pop 表示产品总数,g 是正品数。从所有产品中任意取出 n(n≤pop)件。pop,g,n 和 x 都可以是非整数,这时采用线性插值进行计算
@pps(a,x) 均值为 a 的 Poisson 分布的累积分布函数。当 x 不是整数时,采用线性插值进行计算
@ppl(a,x) Poisson 分布的线性损失函数,即返回 max(0,z-x)的期望值,其中随机变量 z 服从均值为 a 的Poisson 分布
@psl(x) 单位正态线性损失函数,即返回 max(0,z-x)的期望值,其中随机变量 z 服从标准正态分布
@psn(x) 标准正态分布的累积分布函数
@ptd(n,x) 自由度为 n 的 t 分布的累积分布函数
@qrand(seed) 产生服从(0,1)区间的拟随机数。@qrand 只允许在模型的数据部分使用,它将用拟随机数填满集属性
@rand(seed) 返回 0 和 1 间的伪随机数,依赖于指定的种子。典型用法是 U(I+1)=@rand(U(I))。注意如果 seed 不变,那么产生的随机数也不变

变量界定函数

变量界定函数实现对变量取值范围的附加限制

指令 意义
@bin(x) 限制 x 为 0 或 1
@bnd(L,x,U) 限制 L≤x≤U
@free(x) 取消对变量 x 的默认下界为 0 的限制,即 x 可以取任意实数
@gin(x) 限制 x 为整数

集操作函数

指令 意义
@in(set_name,primitive_index_1 [,primitive_index_2,…]) 如果元素在指定集中,返回 1;否则返回 0
@index([set_name,] primitive_set_element) 该函数返回在集 set_name 中原始集成员primitive_set_element 的索引。如果set_name 被忽略,那么 LINGO 将返回与 primitive_set_element 匹配的第一个原始集成员的索引。如果找不到,则产生一个错误。
@wrap(index,limit) 该函数返回 j=index-k*limit,其中 k 是一个整数,取适当值保证 j 落在区间[1,limit]内。该函数在循环、多阶段计划编制中特别有用。
@size(set_name) 该函数返回集 set_name 的成员个数。在模型中明确给出集大小时最好使用该函数。它的使用使模型更加数据中立,集大小改变时也更易维护

集循环函数

集循环函数遍历整个集进行操作。其语法为 @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 集。

指令 意义
@for 该函数用来产生对集成员的约束。基于建模语言的标量需要显式输入每个约束,不 过@for 函数允许只输入一个约束,然后 LINGO 自动产生每个集成员的约束
@sum 该函数返回遍历指定的集成员的一个表达式的和
@min 和@max 返回指定的集成员的一个表达式的最小值或最大值

输入和输出函数

指令 意义
@file 函数 该函数用从外部文件中输入数据,可以放在模型中任何地方。该函数的语法格式为 @file(’filename’)。这里 filename 是文件名,可以采用相对路径和绝对路径两种表 示方式
@text 函数 该函数被用在数据部分用来把解输出至文本文件中。它可以输出集成员和集属性值
@ole 函数 从 EXCEL 中引入或输出数据的接口函数,可以同时读集成员和集属性,只能读一维或二维的 Ranges(在单个的 EXCEL 工作表(sheet)中),但不能读 间断的或三维的 Ranges。Ranges 是自左而右、自上而下来读

结果报告函数

指令 意义
@WRITE(obj1[,…,objn]) 这个函数只能在数据段中使用,用于输出一系列结果(obj1, …,objn),其中 obj1, …,objn 等可以是变量(但不能只是属性),也可以是字符串(放在单引号中的 为字符串)或换行(@NEWLINE(1))等。结果可以输出到一个文件,或电子表格(如 Excel), 或数据库,这取决于@WRITE 所在的输出语句中左边的定位函数
@WRITEFOR(setname[(set_index_list)[condition]]:obj1[,objn]) 该函数被用在数据部分用来把解输出至文本文件中。它可以输出集成员和集属性值
@ITERS() 这个函数只能在程序的数据段使用,调用时不需要任何参数,总是返回 LINGO 求解 器计算所使用的总迭代次数
@NEWLINE(n) 这个函数在输出设备上输出 n 个新行(n 为一个正整数)
@STRLEN(string) 这个函数返回字符串“string”的长度,如@STRLEN(123)返回值为 3
@NAME(var_or_row_reference)) 这个函数返回变量名或行名
“*” 在@write 和@writefor 函数中,可以使用符号“”表示将一个字符串重复多次, 用法是将“”放在一个正整数 n 和这个字符串之间,表示将这个字符串重复 n 次
@ranged(variable_or_row_name) 为了保持最优基不变,变量的费用系数或约束行的右端项允许减少的量
@rangeu(variable_or_row_name) 为了保持最优基不变,变量的费用系数或约束行的右端项允许增加的量
@dual @dual(variable_or_row_name)返回变量的判别数(检验数)或约束行的对偶(影 子)价格(dual prices)

@status(): 返回 LINGO 求解模型结束后的状态
0 Global Optimum(全局最优)
1 Infeasible(不可行)
2 Unbounded(无界)
3 Undetermined(不确定)
4 Feasible(可行)
5 Infeasible or Unbounded(通常需要关闭“预处理”选项后重新求解模型,
以确定模型究竟是不可行还是无界)
6 Local Optimum(局部最优)
7 Locally Infeasible(局部不可行,尽管可行解可能存在,但是 LINGO 并没有
找到一个)
8 Cutoff(目标函数的截断值被达到)
9 Numeric Error(求解器因在某约束中遇到无定义的算术运算而停止)
注:通常,如果返回值不是 0、4 或 6 时,那么解将不可信,几乎不能用。

辅助函数

指令 意义
@if(logical_condition,true_result,false_result) @if 函数将评价一个逻辑表达式 logical_condition,如果为真,返回 true_ result,否则返回 false_result
@warn(’text’,logical_condition) 如果逻辑条件 logical_condition 为真,则产生一个内容为’text’的信息框

LINGO的命令行命令

以下将按类型列出在 LINGO 命令行窗口中使用的命令,每条命令后都附有简要的描述说明。
从窗口菜单中选用“Command Window”命令或直接按 Ctrl+1 可以打开 LINGO 的命令行窗口,便可以在命令提示符“:”后输入以下命令。
如果需要以下命令的详细描述说明,可以查阅 LINGO 的帮助。
1. LINGO 信息
Cat 显示所有命令类型
Com 按类型显示所用 LINGO 命令
Help 显示所需命令的简要帮助信息
Mem 显示内存变量的信息

2. 输入(Input)
model 以命令行方式输入一个模型
take 执行一个文件的命令正本或从磁盘中读取某个模型文件

3. 显示(Display)
look 显示当前模型的内容
genl 产生 LINGO 兼容的模型
gen 生成并显示整个模型
hide 为模型设置密码保护
pause 暂停屏幕输出直至再次使用此命令

4. 文件输出(File Ouput)
div 将模型结果输出到文件
svrt 将模型结果输出到屏幕
save 将当前模型保存到文件
smps 将当前模型保存为 MPS 文件

5. 求解模型(Solution)
go 求解当前模型
solu 显示当前模型的求解结果

6. 编辑模型(Problem Editing)
del 从当前模型中删除指定的某一行或某两行之间(包括这两行)的所有行
ext 在当前模型中添加几行
alt 用新字符串替换掉某一行中、或某两行之间的所有行中的旧字符串
7. 退出系统(Quit)
quit 退出 LINGO 系统

8. 系统参数(System Parameters)
page 以“行”为单位设置每页长度
ter 以简略方式输出结果
ver 以详细方式输出结果
wid 以“字符”为单位设置显示和输出宽度
set 重新设置默认参数
freeze 保存当前参数设置,以备下一次重新启动 LINGO 系统时还是这样的设置
time 显示本次系统的运行时间
pkoxsMV.png
pkoxDx0.png
pkox6qU.png
pkoxB2q.png
以上便是本篇笔记的全部内容,更多详细内容可以下载这本资料
链接: https://pan.baidu.com/s/1puowh8YcTUANbFXvVYhBVQ
提取码: bfg8