04-第四章 Lingo的输入输出及界面
LINGO软件的使用方法

2
2
答案
model: max=98*x1+277*x2-x1^2 -0.3*x1*x2-2*x2^2; x1+x2<100; x1<2*x2; @gin(x1); @gin(x2); end ※@gin()是调用的整数函数
第三节 在LINGO中使用集合
• 例题:某公司要决定下四个季度帆船生 产量。下四个季度需求量分别是40条, 60条,75条,25条。每季度生产能力40 条,生产费用400美元/条,如果加班生产 费用450美元/条,每季度库存费20美元/ 条。假定生产提前期为0,初始库存10条, 问如何安排生产总费用最小?
显式列举法 元素列表 隐式列举法
第四节 运算符及其优先级
• 算术运算符:+,-,*,/,^ • 逻辑运算符: #AND#,#OR#.#NOT#,#EQ#,#NE#,#GT#,# GE#,#LT#,#LE#,TRUE,FALSE • 关系运算符:<(即<=),=,>(即>=)
优先级
优先级 表: 最高 运算符 #NOT#,-(负号) ^ *,/ +,-(减号) #EQ#,#NE#,#GT#,#GE#, #LT#,#LE# #AND#,#OR# <,=,>
集合循环函数
• 用法:@function(setname:expression_list); • 具体如下:@for @sum @max @min
变量界定函数
• • • • @BND(L,X,U)-限制L<=X<=U @BIN(X)-限制X为0或1 @FREE(X)-取消对X的符号限制 @GIN(X)-限制X为整数
• • • • • • • • • 以model:开始,以end结束。 不区分大小写。 目标函数为max=。 语句以;结束。 数与变量之间的乘号不能省。 约束S.t.省略不写。 <与<=,>与>=是等价的。 非负约束可以不输入。 说明语句以!开头。
lingo入门教程(共55张)

3 3
A2
8 67
A3 4
7
B2
8 9
5 C2 6
T
第18页,共55页。
分析
(fēnxī)
6 A1 5 6
B1 6 C1
S
3 3
A2
8 67
A3 4
7
B2
8 9
5 C2 6
T
假设从S到T的最优行驶路线 P 经过城市C1, 则P中从S到C1的子路也一定 是从S到C1的最优行驶路线; 假设 P 经过城市C2, 则P中从S到C2的子路也一定是从S到C2的最优行驶路线. 因此, 为得到从S到T的最优行驶路线, 只需要先求出从S到Ck(k=1,2)的最 优行驶路线, 就可以方便地得到从S到T的最优行驶路线.
第19页,共55页。
分析
(fēnxī)
6 A1 5 6
B1 6 C1
S
3 3
A2
8 67
A3 4
7
B2
8 9
5 C2 6
T
此例中可把从S到T的行驶过程分成4个阶段,即 S→Ai (i=1,2 或3), Ai → Bj(j=1或2), Bj → Ck(k=1或2), Ck → T. 记d(Y,X)为城 市Y与城市X之间的直接距离(若这两个城市之间没有道路直 接相连,则可以认为直接距离为∞),用L(X)表示城市S到城市
L B2 minL A1 5, L A2 6, L A3 4 7 L A3 4; L C1 minL B1 6, L B2 8 15 L B2 8;
略2去),最小运量136.2275(吨公里)。
1
3
5
0
0
1
2
3
4
5
6
第04讲 Lingo软件入门

第4讲 Lingo 软件入门司守奎烟台市,海军航空工程学院数学教研室Email :sishoukui@4.1 初识Lingo 程序Lingo 程序书写实际上特别简捷,数学模型怎样描述,Lingo 语言就对应地怎样表达。
首先介绍两个简单的Lingo 程序。
例4.1 求解如下的线性规划问题:121212112max726450,128480,s.t.3100,,0z x x x x x x x x x =++≤⎧⎪+≤⎪⎨≤⎪⎪≥⎩ Lingo 求解程序如下max =72*x1+64*x2; x1+x2<=50;12*x1+8*x2<=480; 3*x1<=100;说明:Lingo 中默认所有的变量都是非负的,在Lingo 中就不需写出对应的约束。
例4.2 抛物面22y x z +=被平面1=++z y x 截成一椭圆,求原点到这椭圆的最短距离。
该问题可以用拉格朗日乘子法求解。
下面我们把问题归结为数学规划模型,用Lingo 软件求解。
设原点到椭圆上点),,(z y x 的距离最短,建立如下的数学规划模型:⎩⎨⎧+==++++.,1s.t.min 22222y x z z y x z y xLingo 求解程序如下: min =(x^2+y^2+z^2)^(1/2); x+y+z=1; z=x^2+y^2;@free (x); @free (y);说明:Lingo 中默认所有变量都是非负的,这里y x ,的取值是可正可负的,所以使用Lingo 函数free 。
例4.3 求解如下的数学规划模型:⎪⎪⎩⎪⎪⎨⎧==∑∑∑===.,1s.t.min9912100100110012i ii i i ix x x x用Lingo 求解上述数学规划问题,使用集合和函数比较方便,使用集合的目的是为了定义向量,集合使用前,必须先定义;Lingo 程序中的标量不需要定义,直接使用即可。
sets :var/1..100/:x; endsetsmin =@sqrt (@sum (var(i):x(i)^2)); @sum (var(i):x(i))=1;x(100)=@sum (var(i)|i#le#99:x(i)^2); @for (var(i)|i#le#99:@free (x(i)));说明:如果不使用集合和函数,全部使用标量x1,x2,…,x100,最后一个约束就要写99遍,@free(x1); …; @free (x99)。
学习LINGO语言课件

LINGO中的输入/输出语句
探索如何使用LINGO中的输入/输出语句与用户进行交互,读取和显示数据,以及将结果输出到文件中。
线性规划与LINGO优化
介绍线性规划的基本概念,并学习如何在LINGO中进行线性规划建模和求解 优化问题。
学习LINGO语言课件
欢迎来到「学习LINGO语言课件」!在本课程中,我们将探索LINGO语言的 重要性和优化应用。准备好迈向优化技术的下一个级别吗?让我们开始吧!
LINGO语言概述
了解LINGO语言的基本概念和界面,探索其强大的功能,为优化问题寻找解决方案。
LINGO语言语法和结构
深入了解LINGO语言的语法和结构,掌握如何编写有效的代码,并避免常见 的错误。
LINGO中的变量和数据类型
学习如何在LINGO中声明变量并了解不同的数据类型,以便正确处理和操作 数据。
LINGO中的数学运算符
掌握LINGO中常用的数学运算符,如加法、减法、乘法和除法,以及如何进行数学计算。
LINGO中的条件语句和循环
学习如何在LINGO中使用条件语句(如if-else)和循环结构(如for和while循 环),以便根据特定条件执行不同的操作。
LINGO教程(数据输入输出)

14
例:
LLIINNGGOO 教 程
首先,建立相应的EXCEL数据文件 mydata.xls ,并定义相应的数据单元
B4:B7单元 C4:C7单D元4:D7单元E4:E7单元 F4:F7单元 命名为 CITIES 命名为 CO命S名T 为 NEE命D 名为SUPP命LY名为SOLUTION
用于输出结果
已经存在,则覆盖原文件
11
例:
Lingo程序exam0403.LG4(部分) :
输出表头, 并换行
LLIINNGGOO 教 程
@TEXT('exam0403.txt')=@write(4*' ','Value',12*' ','Dual',13*' ', 输出变量Ordered
'Decrease',8*' ','Increase',@newline(2)); @TEXT('exam0403.txt')=@write('Variables:',@newline(2));
• 打开EXCEL文件 • 菜单命令“插入|对象” • 选择“新建|LINDO
Document”,建立一个空的 LINGO文件对象,且在EXCEL 中出现LINGO菜单 • 输入LINGO 程序内容,即可在 EXCEL中运行LINGO程序 •虽然在EXCEL文件中嵌入了LINGO对象,但需要人工干预才能运行这个对象。 •若希望在EXCEL中自动运行一个LINGO程序 ,则需要将LINGO程序用命令脚 本进行描述,并需要用EXCEL的宏命令进行调用。
数据单元定义方法:选择EXCEL的菜单命令“插入|名称|定义” ,才谈出对话框中输入单元名称
lingo 的使用方法

• 当前光标 的位置 • 模型窗口(Model 模型窗口( Window),用于输入 ),用于输入 ), LINGO优化模型(即 优化模型( 优化模型 LINGO程序)。 程序)。 程序
• 状态行(最左边显 状态行( 示“Ready”,表示 , 准备就绪” “准备就绪”)
• 当前时间
LINGO的文件类型 LINGO的文件类型 •.LG4:LINGO格式的模型文件,保存了模型窗口中所 : 格式的模型文件, 格式的模型文件 能够看到的所有文本和其他对象及其格式信息; 能够看到的所有文本和其他对象及其格式信息; •.LNG:文本格式的模型文件,不保存模型中的格式信 :文本格式的模型文件, 如字体、颜色、嵌入对象等); 息(如字体、颜色、嵌入对象等); •.LDT:LINGO数据文件; : 数据文件; 数据文件 •.LTF:LINGO命令脚本文件; : 命令脚本文件; 命令脚本文件 •.LGR:LINGO报告文件; : 报告文件; 报告文件 •.LTX: LINDO格式的模型文件; : 格式的模型文件; 格式的模型文件
程序语句输入的备注: 程序语句输入的备注: •LINGO总是根据“MAX=”或“MIN=”寻找目标函数, 总是根据“ 寻找目标函数, 总是根据 或 寻找目标函数 而除注释语句和TITLE语句外的其他语句都是约束条 而除注释语句和 语句外的其他语句都是约束条 件,因此语句的顺序并不重要 。 •限定变量取整数值的语句为“@GIN(X1)”和 限定变量取整数值的语句为“ 限定变量取整数值的语句为 和 “@GIN(X2)”,不可以写成“@GIN(2)”,否则 ,不可以写成“ , LINGO将把这个模型看成没有整数变量。 将把这个模型看成没有整数变量。 将把这个模型看成没有整数变量 •LINGO中函数一律需要以“@”开头,其中整型变量 中函数一律需要以“ 开头 开头, 中函数一律需要以 函数( 函数(@BIN、@GIN)和上下界限定函数(@FREE、 、 )和上下界限定函数( 、 @SUB、@SLB)与LINDO中的命令类似。而且 变 中的命令类似。 、 ) 中的命令类似 而且0/1变 量函数是@BIN函数。 函数。 量函数是 函数
第四章 LINGO入门

第四章 LINGO 入门LINGO 9.0 功能增强,性能稳定,解答结果可靠.LINDO 用于求解线性规划和二次规划, LINGO 除了具有 LINDO 的全部功能外,还可以用于求解非线性规划,也可以用于一些线性和 非线性方程组的求解以及代数方程求根等.LINDO 和 LINGO 软件的最大特色在于可以允许优 化模型中的决策变量是整数(即整数规划),而且执行速度很快.LINGO 实际上还是最优化问 题的一种建模语言,包括许多常用的函数可供使用者建立优化模型时调用, 并提供与其它数 据文件(如文本文件、EXCEL 电子表格文件、数据库文件等)的接口,易于方便地输入、求 解和分析大规模最优化问题.由于这些特点,LINDO 和 LINGO 软件在教学、科研和工业、商 业、服务等领域得到广泛应用.第一节 简单的LINGO 模型1.1 LINGO 软件安装LINGO 安装过程与 LINDO for Windows 类似.安装过程中需要接受安装协议、选择安装 目录(缺省 C:\LINGO9).安装完成前,在出现的对话框(如图)中选择缺省的建模(即编程) 语言,系统推荐的是采用 LINGO.安装后可通过“LINGO|Options|File Format”命令修改缺 省的建模(即编程)语言.第一次运行时提示输入授权密码.LINGO 版本分为:演示版、求解包、高级版、超级版、工业版和扩展版,演示版之外 的都是正式版,它们的区别不只在于求解规模的限制,而且对于演示版还有试用时间限制, 同时有些功能限制.若没有授权密码,只能安装演示版.对于扩展版来说,对变量的数目和约 束的数目都没有限制,就是说可以求解无限规模的优化问题.本书以 LINGO9.0 版本为例.1.2 模型的输入首先,打开 LINGO 软件后,直接显示输入界面,如下图:图4-1 LINGO编辑界面编辑窗口与 LINDO编辑窗口类似,快捷按钮表示的功能也是相同的,唯一明显的差别是在窗 口的最下部有一个状态行.我们要在主窗口中的 model 窗口输入 LINGO 模型.首先,模型以“model:”开始,以“end”结束,并且要注意“model”后面的“:”不 要丢掉, 对一些简单问题来说也可以省略不写,并且 LINDO 模型在 LINGO 中仍然是有效的;其次,在目标函数行中,“max”后面一定要加“=”,而在“LINDO”中是不加的,这 是它们的一个显著区别;第三,任何一行内容输入完毕后需要在后面加“;”以标志一个语 句段的结束, 这样我们就允许两行的内容在同一行中书写, 只要中间用“; ”隔开就可以了, 但是为了保证较好的可读性,我们不赞成这样的写法;第四,在系数与变量之间的乘号一定 要写出来,这里与通常的计算机语言一样,用“*”表示乘号,这也是一个与“LINDO”明显 的区别; 第五,在书写约束时,我将变量按列对齐地写了出来, 这不过是为了阅读清楚而已, 在“LINGO”中与在“LINDO”中一样,忽略多余的空格,并且不区分字母的大小写,认为大 写的和小写的具有同一含义;第六,点击“LINGO”菜单的“Generate”子菜单下的 “Display model”命令,弹出一个窗口,这是 LINGO 的模型报告,在这里与之前输入时的 主要差别在于每一行前添加了行号,要注意的是,LINGO 中的行号是写在方括号“[ ]”之 中.因为我在输入时没有规定行号,所以程序自动按 1,2,3,4 ,…进行了编号,并且在 数字前有下划线“_”;第七,在 LINGO中不需要在约束前面写“ST”进行说明,程序自 动根据 “MAX=”或“MIN=”语句在各行中寻找目标函数,其它语句都作为约束条件来处 理,因此语句的顺序是不重要的,当然我们仍然是建议将目标函数写在最前面,使得模型清 晰; 第八, 在 LINGO 中对于变量都做非负假设, 不是非负变量需要进行说明; 第九, 在 LINGO 中允许将变量放在式子的右端;第十,在 LINGO 中可以调用已经存储好的 LINDO 模型,也 就是说 LINDO 模型在LINGO中仍然是被接受的.当然在 LINGO 模型的输入中还有很多的内容需要学习,我们将在后面的内容中逐步介 绍.1.3 模型的求解在“LINGO”菜单下选择“SOLVE”命令, 或者在快捷按钮中点击图标,则马上弹出下面 的求解状态窗口图4-2 LINGO求解状态窗口下面我们对其各个部分的含义进行说明:1) Variables:表示变量的数目.Total:表示变量总数;Nonlinear:非线性变量数;Integers:整型变量数.2) Constraints:约束的数目.Total:总约束数;Nonlinear:非线性约束数.3) Nonzeros:非零系数个数.Total:非零系数总数;Nonlinear:非线性项的系数个数.4) Generator Memory Used(K):内存的使用量,单位为千字节.5) Elapsed Runtime(hh:mm:ss):到目前为止求解所用的时间.6) Solver Status:求解器状态.Model:模型的类型,可能的显示有 IP、QP、ILP、IQP、PILP、PIQP、NLP、INLP、PINLP 等;State:求解到目前为止解的状态,可能的结果有Global Optimum:全局最优解;Local Optimum:局部最优解;Feasible:可行解;Infeasible:不可行解;Unbounded:无界解;Interrupted:用户中断;Undetermined:不确定;Objective:当前解的目标函数值;Infeasibility:当前每个约束不满足的数值总和,但是即使这个值为“0”,结果也不 一定是可行的;Iterations:到目前为止的迭代次数.7) Extended Solver Status:扩展的求解器状态.Solver Type:使用了什么样的特殊求解程序B-and-B:分支定界算法求解程序;Global:全局最优解求解程序;Multistart:使用多个初始点的求解程序;Best Obj:到目前为止找到的可行解的最佳目标值;Obj Bound:目标函数值的界;Steps:特殊求解程序当前运行的步数;Active:有效步数.8) Update:状态窗口刷新的时间间隔,可直接在窗口中进行修改.9) Interrupt Solver:中断求解,当求解完成后该按钮失效,变为灰色.10) Close:关闭状态窗口,但是模型计算仍在进行,在需要时可以在“Windows”菜单 下再打开该窗口.需要注意的是,这里多次用到了“到目前为止”这个词,这是因为在求解大规模的问题 时,有可能需要运算很长的时间,状态窗口实时地对求解过程进行着跟踪报告,如果无法等 到最终结果的出现,当达到满意解时就可以人为地终止了,这也就是中断按钮的作用.由于 这个问题规模非常小,当状态窗口打开时计算已经完成,因此中断按钮已经是灰色的,并且 运行时间显示为“00:00:00”,说明运行时间已经小于 0.005 秒.这时已经自动打开了一 个“Solution Report”(求解报告)窗口,如果该窗口没有自动打开,在计算结束后可以 在“Windows”菜单下打开该窗口.第二节 运算符与函数这些运算符是非常基本的,甚至可以不认为它们是一类函数.事实上,在 LINGO 中它们 是非常重要的.2.1 算术运算符算术运算符是针对数值进行操作的运算符.LINGO提供了 5 种二元运算符:^ 乘方﹡ 乘/ 除﹢ 加﹣ 减LINGO 唯一的一元算术运算符是取反函数“﹣”.这些运算符的优先级由高到底为:高 ﹣(取反)^﹡/低 ﹢﹣”来() 运算符的运算次序为从左到右按优先级高低来执行.运算的次序可以用圆括号“改变.2.2 关系运算符在 LINGO 中,关系运算符主要是被用在模型中,来指定一个表达式的左边是否等于、小 于等于、 或者大于等于右边, 形成模型的一个约束条件.关系运算符与逻辑运算符#eq#、 #le#、 #ge#截然不同,前者是模型中该关系运算符所指定关系的为真描述,而后者仅仅判断一个该 关系是否被满足:满足为真,不满足为假.LINGO 有三种关系运算符:“=”、“<=”和“>=”.LINGO 中还能用“<”表示小于等于 “>”表示大于等于关系.LINGO 并不支持严格小于和严格大于关系运算符.然而,如果 关系,需要严格小于和严格大于关系,比如让A 严格小于 B:A<B,那么可以把它变成如下的小于等于表达式:A+ε<=B,这里ε是一个小的正数,它的值依赖于模型中 A小于B 多少才算不等.下面给出以上三类操作符的优先级:高 #not# ﹣(取反)^﹡ /﹢﹣#eq# #ne# #gt# #ge# #lt# #le##and# #or#低 <= = >=2.3 逻辑运算符在 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#2.4 函数1.数学函数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 中的最小值.2. 金融函数目前 LINGO 提供了两个金融函数.1) @fpa(I,n)返回如下情形的净现值:单位时段利率为 I,连续n 个时段支付,每个时段支付单位费 用.若每个时段支付 x 单位的费用,则净现值可用 x 乘以@fpa(I,n)算得.@fpa 的计算公式为I I I nnk k - = + - = + å ) 1 ( 1 ) 1 ( 1 1 . 净现值就是在一定时期内为了获得一定收益在该时期初所支付的实际费用.2) @fpl(I,n)返回如下情形的净现值:单位时段利率为 I,第 n 个时段支付单位费用.@fpl(I,n)的计 算公式为n I - + ) 1 ( .细心的读者可以发现这两个函数间的关系:å= = n k k I fpl n I fpa 1 ), ( @ ) , ( @ .3. 概率函数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.变量界定函数变量界定函数实现对变量取值范围的附加限制,共 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的约束.5. 集操作函数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 的成员个数.在模型中明确给出集大小时最好使用该函数.它的 使用使模型更加数据中立,集大小改变时也更易维护.6. 集循环函数集循环函数遍历整个集进行操作.其语法为@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)@prod该函数返回遍历指定集成员的表达式的积.7. 输入和输出函数输入和输出函数可以把模型和外部数据比如文本文件、数据库和电子表格等连接起来.1) @file 函数该函数用从外部文件中输入数据,可以放在模型中任何地方.该函数的语法格式为 @file(’filename’).这里 filename 是文件名,可以采用相对路径和绝对路径两种表示方 式.@file 函数对同一文件的两种表示方式的处理和对两个不同的文件处理是一样的,这一 点必须注意.当使用@file 函数时,可把记录的内容(除了记录结束标记“~”外)看作是替代模型一条记录可以是声明的一部分, 整个声明, 中@file(’filename’)位置的文本.这也就是说,或一系列声明.在数据文件中注释被忽略.注意在LINGO 中不允许嵌套调用@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,② 释放鼠标按钮,③ 选择“插入|名称|定义”,④ 输入希望的名字,⑤ 点击“确定”按钮.我们在模型的数据部分用如下代码从 EXECL中引入数据:PRODUCT,MACHINE,WEEK,ALLOWED,x,y=@OLE('D:\IMPORT.XLS');@OLE('D:\IMPORT.XLS')=rate;等价的描述为PRODUCT,MACHINE,WEEK,ALLOWED,x,y=@OLE('D:\IMPORT.XLS', PRODUCT,MACHINE,WEEK,ALLOWED,x,y);@OLE('D:\IMPORT.XLS',rate)=rate;这一等价描述使得变量名和 Ranges 不同亦可.4) @ranged(variable_or_row_name)为了保持最优基不变,变量的费用系数或约束行的右端项允许减少的量.5) @rangeu(variable_or_row_name)为了保持最优基不变,变量的费用系数或约束行的右端项允许增加的量.6) @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 时,那么解将不可信,几乎不能用.该函数仅被用在模 型的数据部分来输出数据.7) @dual@dual(variable_or_row_name)返回变量的判别数(检验数)或约束行的对偶(影子) 价格(dual prices).8. 辅助函数1) @if(logical_condition,true_result,false_result)@if 函数将评价一个逻辑表达式 logical_condition,如果为真,返回 true_ result, 否则返回 false_result.2) @warn(’text’,logical_condition)如果逻辑条件 logical_condition 为真,则产生一个内容为’text’的信息框.第三节 集与属性对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群体、 交通工具和雇工等等.LINGO 允许把这些相联系的对象聚合成集(sets).一旦把对象聚合成 集,就可以利用集来最大限度的发挥 LINGO 建模语言的优势.本节我们将深入介绍如何创建 集,并用数据初始化集的属性.3.1 集与属性的定义集是 LINGO 建模语言的基础,是程序设计最强有力的基本构件.借助于集,能够用一个 单一的、长的、简明的复合公式表示一系列相似的约束,从而可以快速方便地表达规模较大 的模型.集是一群相联系的对象,这些对象也称为集的成员.一个集可能是一系列产品、卡车或 雇员.每个集成员可能有一个或多个与之有关联的特征, 我们把这些特征称为属性.属性值可 以预先给定,也可以是未知的,有待于 LINGO 求解.例如,产品集中的每个产品可以有一个 价格属性;卡车集中的每辆卡车可以有一个牵引力属性;雇员集中的每位雇员可以有一个薪 水属性,也可以有一个生日属性等等.3.2 原始集与派生集LINGO 有两种类型的集:原始集(primitive set)和派生集(derived set).一个原始集是由一些最基本的对象组成的.一个派生集是用一个或多个其它集来定义的,也就是说,它的成员来自于其它已存在的 集.1.定义原始集为了定义一个原始集,必须详细声明:集的名字;集的成员(可选);集成员的属性(可选).定义一个原始集,用下面的语法:setname[/member_list/][:attribute_list];注意:用“[]”表示该部分内容可选.下同,不再赘述.setname 是你选择的来标记集的名字,最好具有较强的可读性.集名字必须严格符合标 准命名规则:以拉丁字母或下划线(_)为首字符,其后由拉丁字母(A—Z)、下划线、阿拉 伯数字(0,1,…,9)组成的总长度不超过 32 个字符的字符串,且不区分大小写.该命名 规则同样适用于集成员名和属性名等的命名.Member_list 是集成员列表.如果集成员放在集定义中,那么对它们可采取显式罗列和 隐式罗列两种方式.如果集成员不放在集定义中,那么可以在随后的数据部分定义它们.1) 当显式罗列成员时,必须为每个成员输入一个不同的名字,中间用空格或逗号搁,.2) 当隐式罗列成员时,不必罗列出每个集成员.可采用如下语法:setname/member1..memberN/[: attribute_list];这里的 member1 是集的第一个成员名, memberN 是集的最末一个成员名.LINGO 将自动产生中 间的所有成员名.LINGO 也接受一些特定的首成员名和末成员名,用于创建一些特殊的集.列 表如下:表4.1隐式成员列表格式 示例 所产生集成员1..n 1..5 1,2,3,4,5StringM..StringN Car2..car14 Car2,Car3,Car4,…,Car14 DayM..DayN Mon..Fri Mon,Tue,Wed,Thu,FriMonthM..MonthN Oct..Jan Oct,Nov,Dec,Jan MonthYearM..MonthYearN Oct2001..Jan2002 Oct2001,Nov2001,Dec2001,Jan20023) 集成员不放在集定义中,而在随后的数据部分来定义.集成员无论用何种字符标记,它的索引都是从1开始连续计数.在attribute_ list可以 指定一个或多个集成员的属性,属性之间必须用逗号隔开.可以把集、集成员和集属性同C 语言中的结构体作个类比.如下所示:集 ←→ 结构体集成员 ←→ 结构体的域集属性 ←→ 结构体实例LINGO 内置的建模语言是一种描述性语言,用它可以描述现实世界中的一些问题,然后 再借助于 LINGO 求解器求解.因此,集属性的值一旦在模型中被确定,就不可能再更改.在 LINGO 中,只有在初始部分中给出的集属性值在以后的求解中可更改.这与前面并不矛盾, 初始部分是 LINGO 求解器的需要,并不是描述问题所必须的.2.定义派生集为了定义一个派生集,必须详细声明:集的名字;父集的名字;集成员(可选);集成员的属性(可选).可用下面的语法定义一个派生集:setname(parent_set_list)[/member_list/][:attribute_list];setname 是集的名字.parent_set_list 是已定义的集的列表,多个时必须用逗号隔开. 如果没有指定成员列表,那么 LINGO 会自动创建父集成员的所有组合作为派生集的成员.派 生集的父集既可以是原始集,也可以是其它的派生集.例 1sets:product/A B/;machine/M N/;week/1..2/;allowed(product,machine,week):x;endsetsLINGO 生成了三个父集的所有组合共八组作为 allowed 集的成员.列表如下:编号 成员1 (A,M,1)2 (A,M,2)3 (A,N,1)4 (A,N,2)5 (B,M,1)6 (B,M,2)7 (B,N,1)8 (B,N,2)成员列表被忽略时, 派生集成员由父集成员所有的组合构成, 这样的派生集成为稠密集. 如果限制派生集的成员,使它成为父集成员所有组合构成的集合的一个子集,这样的派生集 成为稀疏集.同原始集一样, 派生集成员的声明也可以放在数据部分.一个派生集的成员列表 有两种方式生成:①显式罗列;②设置成员资格过滤器.当采用方式①时,必须显式罗列出 所有要包含在派生集中的成员,并且罗列的每个成员必须属于稠密集.使用前面的例子,显 式罗列派生集的成员:allowed(product,machine,week)/A M 1,A N 2,B N 1/;如果需要生成一个大的、稀疏的集,那么显式罗列就很讨厌.幸运地是许多稀疏集的成员都 满足一些条件以和非成员相区分.我们可以把这些逻辑条件看作过滤器,在 LINGO 生成派生集的成员时把使逻辑条件为假的成员从稠密集中过滤掉.例 2sets :!学生集:性别属性sex,1表示男性,0表示女性;年龄属性age. ;students/John,Jill,Rose,Mike/:sex,age;!男学生和女学生的联系集:友好程度属性friend,[0,1]之间的数. ;linkmf(students,students)|sex(&1) #eq# 1 #and# sex(&2) #eq# 0: friend;!男学生和女学生的友好程度大于0.5的集;linkmf2(linkmf) | friend(&1,&2) #ge# 0.5 : x;endsetsdata :sex,age = 1 160 140 170 13;friend = 0.3 0.5 0.6;enddata用竖线(|)来标记一个成员资格过滤器的开始.#eq#是逻辑运算符,用来判断是否“相 等”. &1 可看作派生集的第 1 个原始父集的索引,它取遍该原始父集的所有成员;&2 可看 作派生集的第 2 个原始父集的索引,它取遍该原始父集的所有成员;&3,&4,……,以此 类推.注意如果派生集 B 的父集是另外的派生集 A,那么上面所说的原始父集是集 A 向前回 溯到最终的原始集,其顺序保持不变,并且派生集 A 的过滤器对派生集 B 仍然有效.因此, 派生集的索引个数是最终原始父集的个数, 索引的取值是从原始父集到当前派生集所作限制 的总和.总的来说,LINGO 可识别的集只有两种类型:原始集和派生集.在一个模型中,原始集是基本的对象,不能再被拆分成更小的组分.原始集可以由显式 罗列和隐式罗列两种方式来定义.当用显式罗列方式时,需在集成员列表中逐个输入每个成 员.当用隐式罗列方式时, 只需在集成员列表中输入首成员和末成员, 而中间的成员由 LINGO 产生.另一方面,派生集是由其它的集来创建.这些集被称为该派生集的父集(原始集或其它 的派生集).一个派生集既可以是稀疏的, 也可以是稠密的.稠密集包含了父集成员的所有组 合(有时也称为父集的笛卡尔乘积).稀疏集仅包含了父集的笛卡尔乘积的一个子集,可通 过显式罗列和成员资格过滤器这两种方式来定义.显式罗列方法就是逐个罗列稀疏集的成员. 成员资格过滤器方法通过使用稀疏集成员必须满足的逻辑条件从稠密集成员中过滤出稀疏 集的成员.不同集类型的关系见下图.集稠密集原始集显式罗列 稀疏集 过滤器派生集 图4-3 LINGO 集类型。
LINGO操作

"Interrupted"(中断)Undetermined"(未确定)
Objective Infeasibility
当前解的目标函数值
实数
当前约束不满足的总 实数(即使该值=0,当前解也可能不可行,因为 量(不是不满足的约 这个量中没有考虑用上下界形式给出的约束) 束的个数)ations
3.3 扩展求解器状态(Extended Solver Status)框
显示LINGO中几个特殊求解器的运行状态。包括分枝定界求解器(Branchand- Bound Solver)、全局求解器(GlobalSolver)和多初始点求解器 (Multistart Solver)。
Active
非负整数
3.4 LINGO的报告窗口
“Global optimal solution found at iteration: 2”表示2次迭代后得到 全局最优解。 “Objective value:”表示最优目 标值 “Value”给出最优解中各变量的 值 “Slack or Surplus”给出松驰变 量的值 “Reduced Cost”列出最优单纯 形表中判别数所在行的变量的系 数,表示当变量有微小变动时, 目标函数的变化率。 “DUAL PRICE”(对偶价格)表 示当对应约束有微小变动时, 目 标函数的变化率
4.综合举例
例:如何在LINGO中求 解如下的LP问题: 在模型窗口中输入如下代 码: min=2*x1+3*x2; x1+x2>=350; x1>=100; 2*x1+x2<=600; 然后点击工具条上的求解 按钮即可。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
我们把用接口函数产生输出的数据声明称为输出操作。输出操 作仅当求解器求解完模型后才执行,执行次序取决于其在模型中出 现的先后。
第四章 Lingo的输入输出及界面
输入输出函数
MODEL: SETS: DAYS: REQUIRED, START; ENDSETS DATA: DAYS = MON TUE WED THU FRI SAT SUN; REQUIRED =20 16 13 16 19 14 12;
输入输出函数
Lingo函数
2.@text函数 该函数被用在数据部分用来把解输出至文本文件中。它可以输出 集成员和集属性值。其语法为 @text([’filename’]) 这里filename是文件名,可以采用相对路径和绝对路径两种表示方 式。如果忽略filename,那么数据就被输出到标准输出设备(大多数 情形都是屏幕)。@text函数仅能出现在模型数据部分的一条语句的 左边,右边是集名(用来输出该集的所有成员名)或集属性名(用 来输出该集属性的值)。
第四章 Lingo的输入输出及界面
输入输出函数
Lingo函数
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是自左而右、 自上而下来读。
Lingo函数
记录结束标记(~)之间的数据文件 部分称为记录。如果数据文件中没有 记录结束标记,那么整个文件被看作 单个记录。注意到除了记录结束标记 外,模型的文本和数据同它们直接放 在模型里是一样的。
在c盘下建立一个文本文件exp_data.txt,内容如下:
!List of warehouses; WH1 WH2 WH3 WH4 WH5 WH6 ~ !List of vendors; V1 V2 V3 V4 V5 V6 V7 V8 ~ !Warehouse capacities; 60 55 51 43 41 52 ~ !Vendor requirements; 35 37 22 32 41 32 43 38 ~ !Unit shipping costs; 62674259 49538582 52197433 76739271 23957265 55228143
第四章 Lingo的输入输出及界面
输入输出函数
Lingo函数
下面是一个夹带数据的LINGO程序(6仓库8客户问题) ! A 6 Warehouse 8 Vendor Transportation Problem; SETS: WAREHOUSES / WH1 WH2 WH3 WH4 WH5 WH6/: CAPACITY; VENDORS / V1 V2 V3 V4 V5 V6 V7 V8/ : DEMAND; LINKS( WAREHOUSES, VENDORS): COST, VOLUME; ENDSETS ! The objective; MIN = @SUM( LINKS( I, J): COST( I, J) * VOLUME( I, J)); ! The demand constraints; @FOR( VENDORS( J): @SUM( WAREHOUSES( I): VOLUME( I, J)) = DEMAND( J)); ! The capacity constraints; @FOR( WAREHOUSES( I): @SUM( VENDORS( J): VOLUME( I, J)) <= CAPACITY( I));
优化软件与应用
主讲人: 雒兴刚 东北大学系统工程研究所 Email:luoxinggang@ Tel: 83682292
第四章 Lingo的输入输出及界面
输入输出函数
Lingo函数
LINGO输入和输出函数可以把模型和外部数据比如文本文件、数 据库和电子表格等连接起来。 1.@file函数 该函数用从外部文件中输入数据,可以放在模型中任何地方。 该函数的语法格式为@file(’filename’)。这里filename是文件名,可以 采用相对路径和绝对路径两种表示方式。 下面通过一个例子讲解。
Excel07版:在公式-》定义 的名称-》名称管理器 中
第四章 Lingo的输入输出及界面
输入输出函数
Lingo函数
4.@ranged(variable_or_row_name) 为了保持最优基不变,变量的费用系数或约束行的右端项允许减 少的量。 5.@rangeu(variable_or_row_name) 为了保持最优基不变,变量的费用系数或约束行的右端项允许增 加的量。
Lingo函数
第四章 Lingo的输入输出及界面
输入输出函数
Lingo函数
把相关数据全部放在如下电子数据表中来输入。除了输入数据之外, 我们也必须定义Ranges名:PRODUCT,MACHINE,WEEK, ALLOWED,x,y: Name Range PRODUCT B3:B4 MACHINE C3:C4 WEEK D3:D5 ALLOWED B8:D10 X F8:F10 Y G8:G10 rate C13 在EXCEL中定义Ranges名的方法: ① 按鼠标左键拖曳选择Range, ② 释放鼠标按钮, ③ 选择“插入|名称|定义”, ④ 输入希望的名字, ⑤ 点击“确定”按钮。
min s.t.
f ( x) + g ( y ) x >0 x 0
y >0 y 0
100 + 2 x, f ( x) = 2 x, 60 + 3 y, g ( y) = 3 y, x + y 30 x, y 0
பைடு நூலகம்
MODEL: min=fx+fy; fx=@if(x #gt# 0, 100,0)+2*x; fy=@if(y #gt# 0,60,0)+3*y; x+y>=30; END
! The objective; MIN = @SUM( LINKS( I, J): COST( I, J) * VOLUME( I, J)); ! The demand constraints; @FOR( VENDORS( J): @SUM( WAREHOUSES( I): VOLUME( I, J)) = DEMAND( J)); ! The capacity constraints; @FOR( WAREHOUSES( I): @SUM( VENDORS( J): VOLUME( I, J)) <= CAPACITY( I)); ! Here is the data;
第四章 Lingo的输入输出及界面
输入输出函数
例:LINGO和Excel接口 MODEL: SETS: PRODUCT; !产品; MACHINE; !机器; WEEK; !周; ALLOWED(PRODUCT,MACHINE,WEEK):x,y; !允许组合及属性; ENDSETS DATA: rate=0.01; PRODUCT,MACHINE,WEEK,ALLOWED,x,y=@OLE('C:\Examp0201.xls'); @OLE('C:\Examp02-01.xls')=rate; ENDDATA END
第四章 Lingo的输入输出及界面
输入输出函数
Lingo函数
MODEL: SETS: WAREHOUSES / @FILE( 'c:\exp_data.txt')/: CAPACITY; VENDORS / @FILE( 'c:\exp_data.txt')/ : DEMAND; LINKS( WAREHOUSES, VENDORS): COST, VOLUME; ENDSETS
第四章 Lingo的输入输出及界面
输入输出函数
Lingo函数
! Here is the data; DATA: CAPACITY = 60 55 51 43 41 52; DEMAND = 35 37 22 32 41 32 43 38; COST = 6 2 6 7 4 2 5 9 49538582 52197433 76739271 23957265 红色的数据部分应该从程序中分离! 5 5 2 2 8 1 4 3; ENDDATA
输入输出函数
Lingo函数
2 Unbounded(无界) 3 Undetermined(不确定) 4 Feasible(可行) 5 Infeasible or Unbounded(通常需要关闭“预处理”选项后重新 求解模型,以确定模型究竟是不可行还是无界) 6 Local Optimum(局部最优) 7 Locally Infeasible(局部不可行,尽管可行解可能存在,但是 LINGO并没有找到一个) 8 Cutoff(目标函数的cutoff值被达到,即解精度值已达标) 9 Numeric Error(求解器因在某约束中遇到无定义的算术运算而停 止) 通常,如果返回值不是0、4或6时,那么解将不可信,几乎不能 用。该函数仅被用在模型的数据部分来输出数据。
DATA: CAPACITY = @FILE( 'c:\exp_data.txt'); DEMAND = @FILE( 'c:\exp_data.txt'); COST = @FILE( 'c:\exp_data.txt'); ENDDATA END