LINGO快速入门
第九章 Lingo软件快速入门
233第九章 Lingo软件快速入门9.1 Lingo概述LINDO和LINGO是美国LINDO系统公司开发的一套专门用于求解最优化问题的软件包。
LINGO用于求解线性规划和二次规划问题,LINGO除了具有LINDO的全部功能外,还可以用于求解非线性规划问题,也可以用于一些线性和非线性方程(组)的求解,等等。
LINDO 和LINGO软件的最大特色在于可以允许优化模型中的决策变量是整数(即整数规划),而且执行速度很快。
LINGO实际上还是最优化问题的一种建模语言,包括许多常用的函数可供使用者建立优化模型时调用,并提供与其他数据文件(如文本文件、Excel电子表格文件、数据库文件等)的接口,易于方便地输入、求解和分析大规模最优化问题.由于这些特点,LINDO和LINGO软件在教学、科研和工业、商业、服务等领域得到了广泛应用。
当你在windows下开始运行LINGO系统时,会得到类似下面的一个窗口:9.2 LINGO 菜单说明9.2.1 文件菜单(File Menu)新建(New)从文件菜单中选用“新建”命令、单击“新建”按钮或直接按F2键可以创建一个新的“Model”窗口。
在这个新的“Model”窗口中能够输入所要求解的模型。
打开(Open)从文件菜单中选用“打开”命令、单击“打开”按钮或直接按F3键可以打开一个已234 经存在的文本文件。
这个文件可能是一个Model文件。
保存(Save)从文件菜单中选用“保存”命令、单击“保存”按钮或直接按F4键用来保存当前活动窗口(最前台的窗口)中的模型结果、命令序列等保存为文件。
另存为...(Save As...)从文件菜单中选用“另存为...”命令或按F5键可以将当前活动窗口中的内容保存为文本文件,其文件名为你在“另存为...”对话框中输入的文件名。
利用这种方法你可以将任何窗口的内容如模型、求解结果或命令保存为文件。
关闭(Close)在文件菜单中选用“关闭”(Close)命令或按F6键将关闭当前活动窗口。
lingo教程
LINGO 是用来求解线性和非线性优化问题的简易工具。
LINGO 内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO 高效的求解器可快速求解并分析结果。
§1 LINGO 快速入门当你在windows 下开始运行LINGO 系统时,会得到类似下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。
在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO 的默认模型窗口,建立的模型都都要在该窗口内编码实现。
下面举两个例子。
例1.1 如何在LINGO 中求解如下的LP 问题:,6002100350..32min 212112121≥≤+≥≥++x x x x x x x t s x x在模型窗口中输入如下代码: min =2*x1+3*x2; x1+x2>=350; x1>=100;2*x1+x2<=600;然后点击工具条上的按钮 即可。
model:!6发点8收点运输问题;sets:warehouses/wh1..wh6/: capacity;vendors/v1..v8/: demand;links(warehouses,vendors): cost, volume;endsets!目标函数;min=@sum(links: cost*volume);!需求约束;@for(vendors(J):@sum(warehouses(I): volume(I,J))=demand(J));!产量约束;@for(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 54 95 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3;enddataend然后点击工具条上的按钮即可。
lingo教程 和MATLAB入门教程
LINGO 使用教程LINGO 是用来求解线性和非线性优化问题的简易工具。
LINGO 内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO 高效的求解器可快速求解并分析结果。
§1 LINGO 快速入门当你在windows 下开始运行LINGO 系统时,会得到类似下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。
在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO 的默认模型窗口,建立的模型都都要在该窗口内编码实现。
下面举两个例子。
例1.1 如何在LINGO 中求解如下的LP 问题:,6002100350..32min 212112121≥≤+≥≥++x x x x x x x t s x x在模型窗口中输入如下代码: min =2*x1+3*x2; x1+x2>=350; x1>=100;2*x1+x2<=600;然后点击工具条上的按钮 即可。
例1.2 使用LINGO 软件计算6个发点8个收点的最小费用运输问题。
产销单位运价如model:!6发点8收点运输问题;sets:warehouses/wh1..wh6/: capacity;vendors/v1..v8/: demand;links(warehouses,vendors): cost, volume;endsets!目标函数;min=@sum(links: cost*volume);!需求约束;@for(vendors(J):@sum(warehouses(I): volume(I,J))=demand(J));!产量约束;@for(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 54 95 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3;enddataend然后点击工具条上的按钮即可。
lingo基础教程
第4页
5 5 (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,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(&1) #eq# 1 #and# sex(&2) #eq# 0: friend; !男学生和女学生的友好程度大于 0.5 的集; linkmf2(linkmf) | friend(&1,&2) #ge# 0.5 : x; endsets data: sex,age = 1 16 0 14 0 17 0 13; friend = 0.3 0.5 0.6; enddata 用竖线(|)来标记一个成员资格过滤器的开始。#eq#是逻辑运算符,用来判断是否“相 等” ,可参考§4. &1 可看作派生集的第 1 个原始父集的索引,它取遍该原始父集的所有成员; &2 可看作派生集的第 2 个原始父集的索引,它取遍该原始父集的所有成员;&3,&4,„„, 以此类推。注意如果派生集 B 的父集是另外的派生集 A,那么上面所说的原始父集是集 A 向 前回溯到最终的原始集,其顺序保持不变,并且派生集 A 的过滤器对派生集 B 仍然有效。因 此,派生集的索引个数是最终原始父集的个数,索引的取值是从原始父集到当前派生集所作 限制的总和。 总的来说,LINGO 可识别的集只有两种类型:原始集和派生集。 在一个模型中,原始集是基本的对象,不能再被拆分成更小的组分。原始集可以由显式 罗列和隐式罗列两种方式来定义。当用显式罗列方式时,需在集成员列表中逐个输入每个成 员。 当用隐式罗列方式时, 只需在集成员列表中输入首成员和末成员,而中间的成员由 LINGO 产生。
数学软件应用之lingo
注:LINGO不询问对灵敏度进行分析,灵敏度分析需要 通过修改系统选项启动灵敏度分析后,再调用 “REPORT|RANGE”菜单命令来实现。我们可以把模 型和结果报告保存在文件中。
•运行状态窗口
Variables(变量数量) 变量总数(Total): 非线性变量数(Nonlinear): 整数变量数(Integer): Conatraints(约束数量) 约束总数(Total): 非线性约束个数( Nonlinear ):
返回本节
集循环函数
集循环函数遍历整个集进行操作。其语法为 @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集。
在LINGO中使用LINGO模型 1、在 LINGO中可以直接使用LINGO语法编写的优化 模型(优化程序)。举一个简单例题:在名为 LINGO1.lg4的模型文件中保存了一个LINGO模型, 我们现在看看如何打开它 (1)选择菜单命令“File|open(F3)”可以看到“打开文件” 对话框。 (2)打开“LINGO1.lg4”文件。 (3)选择“LINGO|Solve(Ctrl+S)”来运行这个程序。 (运行状态窗口如下图)
LINGO使用教程
LINGO使用指南目录§1 LINGO快速入门 (1)§2 LINGO中的集 (3)§3 模型的数据部分和初始部分 (6)§4 LINGO函数 (9)§5 LINGO WINDOWS命令 (22)§6 LINGO的命令行命令 (35)§7 综合举例 (38)LINGO是用来求解线性和非线性优化问题的简易工具。
LINGO内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO高效的求解器可快速求解并分析结果。
§1 LINGO快速入门当你在windows下开始运行LINGO系统时,会得到类似下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。
在主窗口内的标题为LINGO Model –LINGO1的窗口是LINGO的默认模型窗口,建立的模型都都要在该窗口内编码实现。
下面举两个例子。
例1.1如何在LINGO中求解如下的LP问题:,6002100350..32min 212112121≥≤+≥≥++x x x x x x x t s x x在模型窗口中输入如下代码: min =2*x1+3*x2; x1+x2>=350; x1>=100;2*x1+x2<=600;然后点击工具条上的按钮 即可。
例1.2 使用LINGO 软件计算6个发点8个收点的最小费用运输问题。
产销model :!6发点8收点运输问题; sets :warehouses/wh1..wh6/: capacity; vendors/v1..v8/: demand;links(warehouses,vendors): cost, volume; endsets !目标函数;min =@sum (links: cost*volume); !需求约束;@for (vendors(J):@sum (warehouses(I): volume(I,J))=demand(J)); !产量约束;@for (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 54 95 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3;enddataend然后点击工具条上的按钮即可。
[IT计算机]LINGO教程
LINGO 是用来求解线性和非线性优化问题的简易工具。
LINGO 内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO 高效的求解器可快速求解并分析结果。
§1 LINGO 快速入门当你在windows 下开始运行LINGO 系统时,会得到类似下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。
在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO 的默认模型窗口,建立的模型都都要在该窗口内编码实现。
下面举两个例子。
例1.1 如何在LINGO 中求解如下的LP 问题:,6002100350..32min 212112121≥≤+≥≥++x x x x x x x t s x x在模型窗口中输入如下代码: min =2*x1+3*x2; x1+x2>=350; x1>=100;2*x1+x2<=600;然后点击工具条上的按钮 即可。
例1.2 使用LINGO 软件计算6个发点8个收点的最小费用运输问题。
产销单位运价如A3 5 2 1 9 7 4 3 3 51A4 7 6 7 3 9 2 7 1 43A5 2 3 9 5 7 2 6 5 41A6 5 5 2 2 8 1 4 3 52销量 35 37 22 32 41 32 43 38使用LINGO软件,编制程序如下:model:!6发点8收点运输问题;sets:warehouses/wh1..wh6/: capacity;vendors/v1..v8/: demand;links(warehouses,vendors): cost, volume;endsets!目标函数;min=@sum(links: cost*volume);!需求约束;@for(vendors(J):@sum(warehouses(I): volume(I,J))=demand(J));!产量约束;@for(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 54 95 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3;enddataend然后点击工具条上的按钮 即可。
LINGO快速入门
概率函数
• 7.@phg(pop,g,n,x) • 超几何(Hypergeometric)分布的累积分布函数。pop表示产品总数,g是正
品数。从所有产品中任意取出n(n≤pop)件。pop,g,n和x都可以是非整数, 这时采用线性插值进行计算。
变量界定函数
• 变量界定函数实现对变量取值范围的附加限制,共4种: • @bin(x) 限制x为0或1 • @bnd(L,x,U) 限制L≤x≤U • @free(x) 取消对变量x的默认下界为0的限制,即x可
以取任意实数 • @gin(x) 限制x为整数 • 在默认情况下,LINGO规定变量是非负的,也就是说下界
• @smax(x1,x2,...,xn)返回 x1 , x2 , … , xn 中的 最大值
• @smin(x1,x2,...,xn)返回 x1 , x2 , … , xn 中的最 小值
例 给定一个直角三角形,求包含该三角形的最小正方形。
解:如图所示。ABCDDAEabx
求最小的正方形就相当于求如下的最优化问题:
• data:
• sex,age = 1 16
•
0 14
•
0 17
•
0 13;
• friend = 0.3 0.5 0.6;
• enddata
基本运算符
• ^ 乘方 •﹡ 乘 •/ 除 •﹢ 加 •﹣ 减
: LINGO具有9种逻辑运算符
• #not# 否定该操作数的逻辑值,# not #是一个一元运算符 • #eq# 若两个运算数相等,则为 true ;否则为 flase • #ne# 若两个运算符不相等,则为 true ;否则为 flase • #gt# 若左边的运算符严格大于右边的运算符,则为 true ;否则
LINGO教程(PDF)
例 2.3
sets: product/A B/; machine/M N/; week/1..2/; allowed(product,machine,week):x; endsets
LINGO 生成了三个父集的所有组合共八组作为 allowed 集的成员。列表如下: 编号 成员 1 (A,M,1)
共 53 页 4
注意:用“[]”表示该部分内容可选。下同,不再赘述。
Setname 是你选择的来标记集的名字,最好具有较强的可读性。集名字必须严格符合标 准命名规则:以拉丁字母或下划线(_)为首字符,其后由拉丁字母(A—Z) 、下划线、阿拉 伯数字(0,1,…,9)组成的总长度不超过 32 个字符的字符串,且不区分大小写。
LINGO 教程
LINGO 是用来求解线性和非线性优化问题的简易工具。LINGO 内置了一种建立最优化模型 的语言,可以简便地表达大规模问题,利用 LINGO 高效的求解器可快速求解并分析结果。
§1 LINGO 快速入门
当你在 windows 下开始运行 LINGO 系统时,会得到类似下面的一个窗口:
共 53 页 3
LINGO 教程
MonthM..MonthN MonthYearM..MonthYearN
Oct..Jan Oct2001..Jan2002
Oct,Nov,Dec,Jan Oct2001,Nov2001,Dec2001,Jan2002
③ 集成员不放在集定义中,而在随后的数据部分 数据部分来定义。 数据部分 例 2.2
共 53 页 1
LINGO 教程
A3 A4 A5 A6 销量
5 7 2 5 35
2 6 3 5 37
1 7 9 2 22
9 3 5 2 32
LINGO教程-1
LINGO 使用教程LINGO 是用来求解线性和非线性优化问题的简易工具。
LINGO 内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO 高效的求解器可快速求解并分析结果。
§1 LINGO 快速入门当你在windows 下开始运行LINGO 系统时,会得到类似下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。
在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO 的默认模型窗口,建立的模型都都要在该窗口内编码实现。
下面举两个例子。
例1.1 如何在LINGO 中求解如下的LP 问题:,6002100350..32min 212112121≥≤+≥≥++x x x x x x x t s x x在模型窗口中输入如下代码: min=2*x1+3*x2; x1+x2>=350; x1>=100;2*x1+x2<=600;然后点击工具条上的按钮 即可。
例1.2 使用LINGO软件计算6个发点8个收点的最小费用运输问题。
产销单位运价如下表。
model:!6发点8收点运输问题;sets:warehouses/wh1..wh6/: capacity;vendors/v1..v8/: demand;links(warehouses,vendors): cost, volume;endsets!目标函数;min=@sum(links: cost*volume);!需求约束;@for(vendors(J):@sum(warehouses(I): volume(I,J))=demand(J));!产量约束;@for(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 54 95 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3;enddataend然后点击工具条上的按钮即可。
Lingo教程
LINGO教程之欧侯瑞魂创作LINGO是用来求解线性和非线性优化问题的简易工具。
LINGO内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO高效的求解器可快速求解并分析结果。
§1 LINGO快速入门●装置:实验室的所有电脑都已经事先装置好了Lingo 8(或者9, 10,11)。
如果要在自己的电脑上装置这个软件,建议从网上下载一个破解版的,依照提示一步一步地装置完毕。
●简单例子:当你在windows系统下开始运行LINGO时,会得到类似于下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。
在主窗口内的题目为LINGO Model – LINGO1的窗口是LINGO 的默认模型窗口,建立的模型都要在该窗口内编码实现。
下面举两个例子。
例 1某工厂在计划期内要安插生产I、II两种产品,已知生产单位产品所需的设备台时及A、B两种原资料的消耗,如表所示。
该工厂每生产一件产品I可获利2元,每生产一件产品II可获利3元,问应该如何安插生产计划使该厂获利最多?我们用下面的数学模型来描述这个问题。
设x_1、x_2分别暗示在计划期内产品I、II的产量。
因为设备的有效台时是8,这是一个限制产量的条件,所以在确定产品I、II的产量时,要考虑不超出设备的有效台时数,即可用不等式暗示为x_1 + 2x_2 <=8同理,因原资料A、B的限量,可以得到以下不等式4x_1 <=164x_2 <=12该工厂的目标是在不超出所有资源限量的条件下,如何确定产量x_1、x_2以得到最大的利润。
若用z暗示利润,这时z=2x_1+3x_2.综合上述,该计划问题可用数学模型暗示为:目标函数 max z=2x_1+3x_2约束条件 x_1+2x_2 <=84x_1 <=164x_2 <=12x_1、x_2 >=0一般来说,一个优化模型将由以下三部分组成:1.目标函数(Objective Function):要达到的目标。
lingo基本用法(精华版)20分钟学会
lingo基本⽤法(精华版)20分钟学会Lingo基本⽤法总结(除集函数部分)LINGO是⽤来求解线性和⾮线性优化问题的简易⼯具。
Lingo免费版可以⽀持30个未知数,lingo破解版可以⽀持⼏万个未知数、⼏万个约束条件。
当你在windows下开始运⾏LINGO系统时,会得到类似下⾯的⼀个窗⼝:外层是主框架窗⼝,包含了所有菜单命令和⼯具条,其它所有的窗⼝将被包含在主窗⼝之下。
在主窗⼝内的标题为LINGO Model – LINGO1的窗⼝是LINGO的默认模型窗⼝,建⽴的模型都都要在该窗⼝内编码实现。
下⾯举两个例⼦。
例1.1 如何在LINGO中求解如下的LP问题:在模型窗⼝中输⼊如下代码:min=2*x1+3*x2;x1+x2>=350;x1>=100;2*x1+x2<=600;然后点击⼯具条上的按钮即可。
得到如下结果:所以当x1为250,x2为100时⽬标函数得到最⼤值。
算术运算符Lingo 中变量不区分⼤⼩写,以字母开头不超过32个字符算术运算符是针对数值进⾏操作的。
LINGO 提供了5种⼆元运算符:^乘⽅﹡乘/除﹢加﹣减LINGO 唯⼀的⼀元算术运算符是取反函数“﹣”。
这些运算符的优先级由⾼到底为:⾼﹣(取反)^﹡/低﹢﹣运算符的运算次序为从左到右按优先级⾼低来执⾏。
运算的次序可以⽤圆括号“()”来改变。
例:在x1+x2>=350,x1>=100,2*x1+x2<=600的条件下求2*x1+3*x2的最⼩值在代码窗⼝中编写min=2*x1+3*x2;x1+x2>=350;x1>=100;2*x1+x2<=600;然后单击上⾯菜单lingo菜单下solve键即可。
数学函数标准数学函数:@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的整数部分。
资料:lingo新手入门共4章
1.LINGO入门2.在LINGO中使用集合3. 运算符和函数4. LINGO的主要菜单命令5. LINGO命令窗口•.LG4:LINGO格式的模型文件,保存了模型窗口中所能够看到的所有文本和其他对象及其格式信息;•.LNG:文本格式的模型文件,不保存模型中的格式信息(如字体、颜色、嵌入对象等);•.LDT:LINGO数据文件;•.LTF:LINGO命令脚本文件;•.LGR:LINGO报告文件;•.LTX:LINDO格式的模型文件;•.MPS:示MPS(数学规划系统)格式的模型文件。
除“LG4”文件外,另外几种格式的文件都是普通的文本文件,可以用任何文本编辑器打开和编辑。
注:凡是可以从一个约束直接解出变量取值时,这个变量就不认为是决策变量而是固定变量,不列入统计中;只含有固定变量的约束也不列入约束统计中。
一个简单的LINGO 程序例 直接用LINGO 来解如下二次规划问题:程序语句输入的备注:LINGO 总是根据“MAX=”或“MIN=”寻找目标函数,而除注释语句和TITLE()()()()22121122121212982770.321..100223,04Max x x x x x x s t x x x x x x +---+≤≤≥为整数语句外的其他语句都是约束条件,因此语句的顺序并不重要。
限定变量取整数值的语句为“@GIN(X1)”和“@GIN(X2)”,不可以写成“@GIN(2)”,否则LINGO将把这个模型看成没有整数变量。
LINGO中函数一律需要以“@”开头,其中整型变量函数(@BIN、@GIN)和上下界限定函数(@FREE、@SUB、@SLB)与LINDO中的命令类似。
而且0/1变量函数是@BIN函数。
输出结果:•运行菜单命令“LINGO|Solve”•输出结果备注:LINGO是将它作为PINLP(纯整数非线性规划)来求解,因此找到的是局部最优解。
通过菜单“WINDOW| Status Window”看到状态窗口,可看到最佳目标值“Best Obj”与问题的上界“Obj Bound”已经是一样的,当前解的最大利润与这两个值非常接近,是计算误差引起的。
Lingo教程详解
外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在 主窗口之下。在主窗口内的标题为 LINGO Model – LINGO1 的窗口是 LINGO 的默 认模型窗口,建立的模型都要在该窗口内编码实现。下面举两个例子。 例 1 某工厂在计划期内要安排生产 I、 II 两种产品, 已知生产单位产品所需的 设备台时及 A、B 两种原材料的消耗,如表所示。 产品 I 设备 原材料 A 原材料 B 1 4 0 产品 II 2 0 4 8 台时 16kg 12kg
目标函数 约束条件
max z=2x_1+3x_2 x_1 + 2x_2 <=8 4x_1 <=16 4x_2 <=12 x_1、x_2 >=0
一般来说,一个优化模型将由以下三部分组成: 1. 目标函数(Objective Function) :要达到的目标。 2. 决策变量(Decision variables) :每组决策变量的值代表一种方案。在优化模 型中需要确定决策变量的最优值,优化的目标就是找到决策变量的最优值使 得目标函数取得最优。 3. 约束条件(Constraints) :对于决策变量的一些约束,它限定决策变量可以取 的值。 在写数学模型时,一般第一行是目标函数,接下来是约束条件,再接着是一些非 负限制等。
设 VOLUME_i_j 为从仓库 i 运送到销售地 j 那里的货物量, 那么我们的目 标函数可以表示为: MIN = 6 * VOLUME_1_1 + 2 * VOLUME_1_2 + 6 * VOLUME_1_3 + 7 * VOLUME_1_4 + 4 * VOLUME_1_5 + . . . 8 * VOLUME_6_5 + VOLUME_6_6 + 4 * VOLUME_6_7 + 3 * VOLUME_6_8; 这里我们只列出了 48 个项中的 9 项,输入这么多的数据非常麻烦,而且容易出 错。而运用 Lingo 提供的模型语言则可以很容易的来描述这个目标函数,而且很 容易扩充模型。
lingo教程_和matlab入门教程
lingo教程_和matlab入门教程lingo 使用教程LINGO 是用来求解线性和非线性优化问题的简易工具。
LINGO 内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO 高效的求解器可快速求解并分析结果。
§1 LINGO 快速入门当你在windows 下开始运行LINGO 系统时,会得到类似下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。
在主窗口内的标题为LINGO Model –LINGO1的窗口是LINGO 的默认模型窗口,建立的模型都都要在该窗口内编码实现。
下面举两个例子。
例1.1 如何在LINGO 中求解如下的LP 问题:,6002100350..32min 212112121≥≤+≥≥++x x x x x x x t s x x在模型窗口中输入如下代码:min =2*x1+3*x2; x1+x2>=350; x1>=100;2*x1+x2<=600;然后点击工具条上的按钮即可。
model:!6发点8收点运输问题;sets:warehouses/wh1..wh6/: capacity;vendors/v1..v8/: demand;links(warehouses,vendors): cost, volume; endsets!目标函数;min=@sum(links: cost*volume);!需求约束;@for(vendors(J):@sum(warehouses(I): volume(I,J))=demand(J)); !产量约束;@for(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 54 95 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3;enddataend然后点击工具条上的按钮即可。
lingo教程
LINGO 是用来求解线性和非线性优化问题的简易工具。
LINGO 内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO 高效的求解器可快速求解并分析结果。
§1 LINGO 快速入门当你在windows 下开始运行LINGO 系统时,会得到类似下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。
在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO 的默认模型窗口,建立的模型都都要在该窗口内编码实现。
下面举两个例子。
例1.1 如何在LINGO 中求解如下的LP 问题:0,6002100350..32min 212112121≥≤+≥≥++x x x x x x x t s x x在模型窗口中输入如下代码: min =2*x1+3*x2; x1+x2>=350; x1>=100;2*x1+x2<=600;然后点击工具条上的按钮 即可。
例1.2 使用LINGO 软件计算6个发点8个收点的最小费用运输问题。
产销model :!6发点8收点运输问题; sets :warehouses/wh1..wh6/: capacity; vendors/v1..v8/: demand;links(warehouses,vendors): cost, volume; endsets !目标函数;min =@sum (links: cost*volume); !需求约束;@for (vendors(J):@sum (warehouses(I): volume(I,J))=demand(J)); !产量约束;@for (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然后点击工具条上的按钮 即可。
lingo11入门到精通
LINGO11 入门到精通 LINGO 是用来求解线性和非线性优化问题的简易工具。 LINGO 内置了一种建立 最优化模型的语言,可以简便地表达大规模问题,利用 LINGO 高效的求解器可快 速求解并分析结果。 一般来说 LINGO 多用于解决大规模数学规划。 用时要注意以下几点: (1) 每条语句后必须使用分号“; ”结束。问题模型必须由 MODEL 命令 开始,END 结束。 (2) 用 MODEL 命令来作为输入问题模型的开始,格式为 MODEL : statement (语句) 。 (3) 目标函数必须由“min =”或“max =”开头。 §1 LINGO 快速入门 当你在 windows 下开始运行 LINGO 系统时,会得到类似下面的一个窗口:
共 53 页 4
LINGO 教程
Rose 0 17 Mike 1 13; enddata
注意:开头用感叹号(!) ,末尾用分号(;)表示注释,可跨多行。
在集部分只定义了一个集 students,并未指定成员。在数据部分罗列了集 成员 John、Jill、Rose 和 Mike,并对属性 sex 和 age 分别给出了值。 集成员无论用何种字符标记,它的索引都是从 1 开始连续计数。在 attribute_ list 可以指定一个或多个集成员的属性, 属性之间必须用逗号隔开。 可以把集、集成员和集属性同 C 语言中的结构体作个类比。如下图: 集 ←→ 结构体 集成员 ←→ 结构体的域 集属性 ←→ 结构体实例 LINGO 内置的建模语言是一种描述性语言,用它可以描述现实世界中的一些 问题, 然后再借助于 LINGO 求解器求解。 因此, 集属性的值一旦在模型中被确定, 就不可能再更改。在 LINGO 中, 只有在初始部分中给出的集属性值在以后的求解 中可更改。这与前面并不矛盾,初始部分是 LINGO 求解器的需要,并不是描述问 题所必须的。 2.3.2 定义派生集 为了定义一个派生集,必须详细声明: ·集的名字 ·父集的名字 ·可选,集成员 ·可选,集成员的属性 可用下面的语法定义一个派生集: setname(parent_set_list)[/member_list/][:attribute_list]; setname 是集的名字。parent_set_list 是已定义的集的列表,多个时必须 用逗号隔开。如果没有指定成员列表,那么 LINGO 会自动创建父集成员的所有组 合作为派生集的成员。派生集的父集既可以是原始集,也可以是其它的派生集。
lingo教程 和MATLAB入门教程
LINGO 使用教程LINGO 是用来求解线性和非线性优化问题的简易工具。
LINGO 内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO 高效的求解器可快速求解并分析结果。
§1 LINGO 快速入门当你在windows 下开始运行LINGO 系统时,会得到类似下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。
在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO 的默认模型窗口,建立的模型都都要在该窗口内编码实现。
下面举两个例子。
例1.1 如何在LINGO 中求解如下的LP 问题:,6002100350..32min 212112121≥≤+≥≥++x x x x x x x t s x x在模型窗口中输入如下代码: min =2*x1+3*x2; x1+x2>=350; x1>=100;2*x1+x2<=600;然后点击工具条上的按钮 即可。
例1.2 使用LINGO 软件计算6个发点8个收点的最小费用运输问题。
产销单位运价如model:!6发点8收点运输问题;sets:warehouses/wh1..wh6/: capacity;vendors/v1..v8/: demand;links(warehouses,vendors): cost, volume;endsets!目标函数;min=@sum(links: cost*volume);!需求约束;@for(vendors(J):@sum(warehouses(I): volume(I,J))=demand(J));!产量约束;@for(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 54 95 3 8 5 8 25 2 1 9 7 4 3 37 6 7 3 9 2 7 12 3 9 5 7 2 6 55 5 2 2 8 1 4 3;enddataend然后点击工具条上的按钮即可。
Lingo软件简单教程
派生集是由其它的集来创建。这些集被称为该派生集的父集(原始 集或其它的派生集)。一个派生集既可以是稀疏的,也可以是稠密 的。稠密集包含了父集成员的所有组合(有时也称为父集的笛卡尔 乘积)。稀疏集仅包含了父集的笛卡尔乘积的一个子集,可通过显 式罗列和成员资格过滤器这两种方式来定义。显式罗列方法就是逐 个罗列稀疏集的成员。成员资格过滤器方法通过使用稀疏集成员必 须满足的逻辑条件从稠密集成员中过滤出稀疏集的成员。
4
LP问题在lindo和lingo中不同的输入形式:
Lindo: min 2x1+3x2 st x1+y2>=250 x1>=100 end
Lingo: min=2*x1+3*x2; x1+x2>=350; x1>=100; 2*x1+x2<=600; 这是LINGO 模型的最基本特征
(1)将目标函数的表示方式从“min”变成 了“min=” (2)“ST”在LINGO 模型中不再需要,所 以被删除了 (3)每个系数与变量间增加了运算符“*” (即乘号不能省略) (4)每行(目标、约束和说明语句)后面 均增加了一个分号“;” (5)模型结束标志“END”也被删除了 (LINGO 中只有当模型以“MODEL:”开 始时才能以“END”结束)。
3
例1 在LINGO中求解如下的LP问题:
min 2 x1 3x 2 s.t. x1 x 2 350 x1 100 2 x1 x 2 600 x1 , x 2 0
然后点击工具条上的按钮 即可。
在模型窗口中输入如下代码: min=2*x1+3*x2; x1+x2>=350; x1>=100; 2*x1+x2<=600;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 1 (1 I ) k I k 1 (1 I )
n
n
@ fpa( I , n) @ fpl( I , k )
k 1
n
概率函数 • 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不是整数时,采用线性插值进行计 算。
基本运算符
• • • • • ^ ﹡ / ﹢ ﹣ 乘方 乘 除 加 减
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
• • • • • • • • • • • • • •
例4.5 model: data: M=4; N=2; seed=1234567; enddata sets: rows/1..M/; cols/1..N/; table(rows,cols): x; endsets data: X=@qrand(seed);产生服从(0,1)区间的拟随机数 enddata end
模型的集部分
• 例2.2 • !集部分; • sets: • students:sex,age; • endsets • !数据部分; • data: students,sex,age= John 1 16 • Jill 0 14 • Rose 0 17 • Mike 1 13; • enddata
Variable SEX( JOHN) SEX( JILL) SEX( ROSE) SEX( MIKE) AGE( JOHN) AGE( JILL) AGE( ROSE) AGE( MIKE)
Value 1.000000 0.000000 0.000000 1.000000 16.00000 14.00000 17.00000 13.00000
概率函数 • 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表示每次实验所需的随机数的个数。在行内,随机数是独立分布的; 在行间,随机数是非常均匀的。这些随机数是用“分层取样”的方法产生的。
LINGO有三种关系运算符:“=”、 “<=”和“>=”
• • • • • • 下面给出以上三类操作符的优先级: 高#not# ﹣(取反) ^ ﹡/ ﹢﹣ #eq# #ne# #gt# #ge# #lt# #le# #and# #or# • 低<= = >=
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 ;=0返回0; x<0 返回 -1 • @floor(x) 返回 x 的整数部分。当 x>=0 时,返回不超 过 x 的最大整数;当 x<0 时,返回不低于 x 的最大整 数。 • @smax(x1,x2,...,xn)返回 x1 , x2 , … , xn 中的 最大值 • @smin(x1,x2,...,xn)返回 x1 , x2 , … , xn 中的最 小值
产销单位运价如下表
。
6个发点8个收点的最小费用运输问题共有48个变量,14个约束条 件。
使用LINGO软件,编制程序如下:
• • • • • • • • • • • • • • • • • • • • model: !6发点8收点运输问题; sets: warehouses/wh1..wh6/: capacity; vendors/v1..v8/: demand; links(warehouses,vendors): cost, volume; Endsets min=@sum(links: cost*volume); !目标函数; @for(vendors(J):@sum(warehouses(I): volume(I,J))=demand(J)); !需求约束; @for(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 49538582 52197433 76739271 23957265 5 5 2 2 8 1 4 3; enddata end
成员 (A,M,1) (A,M,2) (A,N,1) (A,N,2) (B,M,1) (B,M,2) (B,N,1) (B,N,2)
如果限制派生集的成员,使它成为父集成员所有组合构成的集合
的一个子集,这样的派生集成为稀疏集
• • • • • • • • • • • • • • • • 例2.4 sets: !学生集:性别属性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; endsets data: sex,age = 1 16 0 14 0 17 0 13; friend = 0.3 0.5 0.6; enddata
LINGO快速入门
例1.1 如何在LINGO中求解如下的LP问题:
在模型窗口中输入如下代码: Model: min=2*x1+3*x2; x1+x2>=350; x1>=100; 2*x1+x2<=600;计算:6个发点8个收点的最小费用运输问题。
LINGO会自动创建父集成员的所有组合作为派生集的成员
• 例2.3 • sets: • product/A B/; • machine/M N/; • week/1..2/; allowed(product,machine, week):x; • endsets
• • • • • • • • •
编号 1 2 3 4 5 6 7 8
B
b A D DA
金融函数
1.@fpa(I,n)
2.@fpl(I,n)
• 例4.4 贷款买房问题 贷款金额50000元,贷款年利率 5.31%,采取分期付款方式(每年年末还固定金额, 直至还清)。问拟贷款10年,每年需偿还多少元?
• • • •
LINGO代码如下: 50000 = x * @fpa(.0531,10); 答案是x=6573.069元。 如果返回如下情形的净现值:单位时段利率为I,第n 个时段支付单位费用。@fpl(I,n)的计算公式为 n ( 1 I ) • 且:
如果没有为函数指定种子,那么LINGO将用系统时间构造种子
14.@rand(seed) 返回0和1间的伪随机数,依赖于指 定的种子。典型用法是U(I+1)=@rand(U(I))。注意如果 seed不变,那么产生的随机数也不变