lingo使用教程
- 格式:doc
- 大小:698.00 KB
- 文档页数:55
LINGO使用说明比较简单
第九步,分析和优化结果。
优化模型求解完成后,你可以通过结果显
示区中的结果表格和图表来分析和优化结果。
LINGO还提供了一些分析工具,如灵敏度分析和场景分析,帮助你深入理解模型的行为和性能。
第十步,保存和导出结果。
在 LINGO 中,你可以保存整个优化模型
及其求解结果,以供将来使用。
通过点击菜单栏中的“文件”选项,选择“保存”或“导出”,就可以将模型和结果保存为不同的文件格式,如LINGO模型文件(.lng)、Excel 文件(.xls)或文本文件(.txt)。
通过上述十个步骤,你可以使用LINGO软件完成一个优化模型的建立、求解和分析。
当然,LINGO还具备其他高级功能和应用,如混合整数规划、随机规划和非线性规划等,可以根据你的具体需求进行进一步学习和应用。
LINGO使用手册和官方网站上有更多详细的说明和案例,可以帮助你更好
地使用和理解LINGO软件。
第十章 LINGOLingo 软件是求解线性规划、非线性规划的数学软件,也可用于一些线性和非线性方程组的求解等。
Lingo 实际上也是最优化问题的一种建模语言,包括许多常用的数学函数供使用者建立优化模型时调用,并可以接受与其他数据文件交换数据。
第一节 LINGO 软件的基本使用方法1.1 LINGO 使用入门在windows 操作系统下启动LINGO 后,将进入LINGO 集成环境,包括主框架窗口和模型窗口两部分。
主框架窗口集成了菜单和命令按钮,模型窗口用于输入模型。
例1 求解数学模型12121212max 23..4310351200x x s t x x x x x x ++≤+≤≥≥解:在模型窗口输入LINGO 求解模型如下:输入模型后选择菜单LINGO|Solve 或者按工具栏的,LINGO开始编译模型,如有语法错误将返回一个错误的消息并指明错误出现的位置;如果通过编译,LINGO将激活Solver运算器寻求模型的最优解,首先出现Solver Status状态窗口显示模型求解的运算状态信息:状态窗口显示的信息含义如下:“Global optimal solution found”表示得到全局最优解。
“Objective value: 7.454545”表示最优目标值为7.454545。
“Total solver iterations:2” 表示迭代2次得到结果。
“V alue”给出最优解中各变量的值:x1=1.272727,x2=1.636364。
Reduced Cost 值列出最优单纯形表中判别数所在行的变量的系数,表示当变量有微小变动时,目标函数的变化率。
其中基变量的reduced cost值应为0,对于非基变量xj,相应的reduced cost值表示当某个变量xj 增加一个单位时目标函数减少的量( max型问题)。
本例中此值均为0。
SLACK OR SURPLUS值给出约束条件的松驰变量或剩余变量的值。
LINGO 使用教程LINGO 是用来求解线性和非线性优化问题的简易工具。
LINGO 内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO 高效的求解器可快速求解并分析结果。
一般来说LINGO 多用于解决大规模数学规划。
用时要注意以下几点:(1)每条语句后必须使用分号“;”结束。
问题模型必须由MODEL 命令开始,END结束。
(2)用MODEL 命令来作为输入问题模型的开始,格式为MODEL :statement (语句)。
(3)目标函数必须由“min =”或“max =”开头。
§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 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教程LINGO是用来求解线性和非线性优化问题的简易工具。
LINGO内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO高效的求解器可快速求解并分析结果。
§1 LINGO快速入门●安装:实验室的所有电脑都已经事先安装好了Lingo 8(或者9, 10, 11)。
如果要在自己的电脑上安装这个软件,建议从网上下载一个破解版的,按照提示一步一步地安装完毕。
●简单例子:当你在windows系统下开始运行LINGO时,会得到类似下面的一个窗口:外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。
在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO的默认模型窗口,建立的模型都要在该窗口内编码实现。
下面举两个例子。
例 1 某工厂在计划期内要安排生产I、II两种产品,已知生产单位产品所需的设备台时及A、B两种原材料的消耗,如表所示。
产品I 产品II设备 1 2 8台时原材料A 4 0 16kg原材料B 0 4 12kg该工厂每生产一件产品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软件使用入门LINGO是美国LINDO系统公司开发的一套专门用于求解最优化问题的软件.它为求解最优化问题提供了一个平台,主要用于求解线性规划、非线性规划、整数规划、二次规划、线性及非线性方程组等问题.它是最优化问题的一种建模语言,包含有许多常用的函数供使用者编写程序时调用,并提供了与其他数据文件的接口,易于方便地输入,求解和分析大规模最优化问题,且执行速度快.由于它的功能较强,所以在教学、科研、工业、商业、服务等许多领域得到了广泛的应用.§3.1 LINGO操作界面简介在Windows操作系统下启动LINGO软件,屏幕上首先显示如图1.1所示的窗口.图1.1图1.1中最外层的窗口是LINGO软件的主窗口(LINGO软件的用户界面),所有其他窗口都在这个窗口之内.主窗口有:标题栏、菜单栏、工具栏和状态栏.目前,状态栏最左边显示的是“Ready”,表示准备就绪,右下角显示的是当前时间,时间前面是当前光标的位置“Ln 1,Col 1”(即1行1列).将来用户可以用选项命令(LINGO|Options|Interface菜单命令)决定是否需要显示工具栏和状态栏.LINGO有5个主菜单:●File(文件)●Edit(编辑)●LINGO(LINGO系统)●Windows(窗口)●Help(帮助)这些菜单的用法与Windows下其他应用程序的标准用法类似,下面只对主菜单中LINGO系统的主要命令进行简要介绍.LINGO系统(LINGO)的主菜单●LINGO|Solve(Ctrl-S)LINGO|Solve(Ctrl-S)(求解)命令对当前模型进行编译并求解.如果当前模型输入有错误,编译时将报告错误.求解时会显示一个求解器运行状态窗口.●LINGO|Solution(Ctrl-O)LINGO|Solution(Ctrl-O)(解答)命令显示当前解.●LINGO|Range(Ctrl-R)LINGO|Range(Ctrl-R)(灵敏度分析)命令显示当前解的灵敏度分析结果.(你必须在此之前求解过当前模型)●LINGO|Options(Ctrl-I)LINGO|Options(Ctrl-I)(选项)命令将打开一个含有7个选项卡的对话框窗口,你可以通过它修改LINGO系统的各种控制参数和选项.修改完以后,你如果单击“应用”按钮,则新的设置马上生效;如果单击“OK”按钮,则新的设置马上生效,并且同时关闭该窗口;如果单击“Save”按钮,则将当前设置变为默认设置,下次启动LINGO时这些设置仍然有效;如果单击“Default”按钮,则恢复LINGO系统定义的原始默认设置;如果单击“Cancel”按钮将废弃本次操作,退出对话框;单击“Help”按钮将显示本对话框的帮助信息.●LINGO|Generate和LINGO|PictureLINGO|Generate和LINGO|Picture命令都是在模型窗口下才能使用,他们的功能是按照LINGO模型的完整形式分别以代数表达式形式和矩阵图形形式显示目标函数和约束.●LINGO|Debug(Ctrl+D)LINGO|Debug(Ctrl+D)命令分析线性规划无解或无界的原因,建议如何修改●LINGO|Model Statistics(Ctrl+E)LINGO|Model Statistics(Ctrl+E)命令显示当前模型的统计信息.●LINGO|Look(Ctrl+L)LINGO|Look(Ctrl+L)命令显示当前模型的文本形式,显示时对所有行按顺序编号.图1.2给出了工具栏的简要功能说明.图1.2当前光标所在的窗口(窗口标题栏上标有“LINGO Model-LINGO1”),就是模型窗口(model windows),也就是用于输入LINGO优化模型(即LINGO程序)的窗口.§3.2 LINGO模型的基本特征LINGO模型(程序)从LINGO模型窗口输入,它以语句“MODEL:”开始,以语句“END”结束.它是由一系列语句组成,每个语句都是以分号“;”结束,语句是组成LINGO模型的基本单位.每行可以写多个语句,为了保持模型的可读性,最好一行只写一个语句,并且按照语句之间的嵌套关系对语句安排适当的缩进,增强层次感.以感叹号“!”开始的语句是注释语句(注释语句也需要以分号“;”结束).LINGO模型(程序)一般由5个部分(或称5段)组成:(1)集合段(SETS):这部分要以“SETS:”开始,以“ENDSETS”结束,作用在于定义必要的集合变量(SET)及其元素(member,含义类似于数组的下标)和属性(attribute,含义类似于数组).格式有基本集和派生集两种.基本集:Setname(集合变量名)[/member_list(元素列表)/][:attribute_list(属性列表)];元素列表可以全部一一列出,也可以用格式“/元素1..元素N/”列出,例如SETS:STUDENTS/1,2,3,4,5/:NAME,AGE;ENDSETSSETS:STUDENTS/1..5/:NAME,AGE;ENDSETS派生集:Setname(parent_set_list(源集列表))[/member_list/][:attribute_list];例如SETS:PRODUCT/A B/;MACHINE/M N/;WEEK/1..2/;ALLOWED( PRODUCT,MACHINE,WEEK);ENDSETS列表可以用逗号“,”分开,也可以用空格分开.(2)数据段(DATA):这部分要以“DATA:”开始,以“ENDDATA”结束,作用在于对集合的属性(数组)输入必要的常数数据.格式为:attribute_list(属性列表)=value_list(常数列表);例如SETS:SET1 /A, B, C/: X, Y;ENDSETSDATA:X = 1 2 3;Y = 4 5 6;ENDDATA(3)初始化段(INIT):这部分要以“INIT:”开始,以“ENDINIT”结束,作用在于对集合的属性(数组)给出初值.格式为:attribute_list(属性列表)=value_list(常数列表);与数据段的用法类似.(4)计算段(CALC):这部分要以“CALC:”开始,以“ENDCALC”结束,作用在于对一些原始数据进行计算处理.因为在实际问题中,输入的数据往往是原始数据,不一定能在模型中直接使用,可以在这个段对这些原始数据进行一定的“预处理”,得到模型中真正需要的数据.在计算段中语句是顺序执行的.(5)目标与约束段:这部分没有段的开始和结束标记,作用在于给定目标函数与约束条件.可见除这一段外,其他4个段都有明确的段标记.这一段是模型的主要部分,其他段是为这一段服务的.其他四段可以没有,这一段必须要有.否则不称其为模型.这一段一般要用到LINGO的运算符和各种函数.§3.3 LINGO的运算符和函数LINGO包含有大量的运算符和函数,供程序(建立优化模型)调用,其功能很强.充分利用这些函数,对解决问题将是非常方便的.下面给出部分函数及简要功能介绍,全部函数及详细功能说明可进一步参考LINGO的使用手册.一、运算符及其优先级LINGO的运算符有三类:算数运算符、逻辑运算符和关系运算符.1.算术运算符:LINGO中的算术运算符有以下5种:+(加法),-(减法或负号),*(乘法),/(除法),∧(求幂).算术运算是数与数之间的运算,运算结果仍是数.2.逻辑运算符:LINGO中的逻辑运算符有以下9种,可以分成两类:(1)#AND#(与),#OR#(或),#NOT#(非):这三个运算是逻辑值之间的运算,也就是它们操作的对象本身必须已经是逻辑值或逻辑表达式,计算结果也是逻辑值.(2)#EQ#(等于),#NE#(不等于),#GT#(大于),#GE#(大于等于),#LT#(小于),#LE#(小于等于):这6个操作实际上是“数与数之间”的比较,也就是它们操作的对象本身必须是两个数,而逻辑表达式计算的结果是逻辑值.3.关系运算符:LINGO中的关系运算符有以下3种:<(即<=,小于等于),=(等于),>(即>=,大于等于)这三个运算符虽然也是“数与数之间”的比较,但在LINGO中只用来表示优化模型的约束条件,所以不是真正意义上的运算.这些运算符的优先级如表3.1所示(同一优先级按左到右的顺序执行;如果有括号“()”,则括号内的表达式优先进行计算)表3.1二、基本的数学函数在LINGO中写程序时可以调用大量的内部函数,这些函数以“@”符号打头(类似调用命令).LINGO中数学函数的用法与其它语言中的数学函数的用法类似,主要有以下函数:@ABS(X):绝对值函数,返回X的绝对值.@COS(X):余弦函数,返回X的余弦值(X的单位是弧度).@EXP(X):指数函数,返回e x的值.@FLOOR(X):取整函数,返回X的整数部分(向最靠近0的方向取整).@LGM(X):返回X的伽马(Gamma)函数的自然对数值.@LOG(X):自然对数函数,返回X的自然对数值.@MOD(X,Y):模函数,返回X对Y取模的结果.@POW(X,Y):指数函数,返回X Y的值.@SIGN(X):符号函数,返回X的符号值(X<0时返回-1,X>=0返回1).@SIN(X):正弦函数,返回X的正弦值.@SMAX(list):最大值函数,返回列表(list)中的最大值.@SMIN(list):最小值函数,返回列表(list)中的最小值.@SQR(X):平方函数,返回X的平方值.@SQRT(X):平方根函数,返回X的正的平方根的值.@TAN(X):正切函数,返回X的正切值.三、集合循环函数集合循环函数是指对集合上的元素(下标)进行循环操作的函数,主要有@FOR,@MAX,@MIN,@SUM,@PROD五种,其用法如下:@function(setname[(set_index_list)[|conditional_qualifier]]:expression_list);其中:Function是集合函数名;Setname是集合名;set_index_list是集合索引列表(不需要使用索引时可以省略);|conditional_qualifier是用逻辑表达式给出的过滤条件(无条件时可以省略);:expression_list是一个表达式(对@FOR函数,可以是一组表达式).下面简要介绍其作用.@FOR(setname[(set_index_list)[|cond_qualifier]]:exp_list):对集合setname中的每个元素独立地生成由exp_list描述的表达式(通常是优化问题的约束).@MAX(setname[(set_index_list)[|cond_qualifier]]:exp):返回集合setname上的表达式exp的最大值.@MIN(setname[(set_index_list)[|cond_qualifier]]:exp):返回集合setname上的表达式exp的最小值.@SUM(setname[(set_index_list)[|cond_qualifier]]:exp):返回集合setname上的表达式exp的和.@PROD(setname[(set_index_list)[|cond_qualifier]]:exp):返回集合setname上的表达式exp的积.四、集合操作函数集合操作函数是指对集合进行操作的函数,主要有@INDEX,@IN,@WRAP,@SIZE四种,下面简要介绍其作用.@INDEX([set_name,]primitive_set_element):返回元素primitive_set_element在集合set_name中的索引值(即按定义集合时元素出现顺序的位置编号).如果省略集合名set_name,LINGO按程序定义的集合顺序找到第一个含有元素primitive_set_element的集合,并返回索引值.如果在所有集合中均没有找到该元素,会给出出错信息.@IN(set_name,primitive_index_1[,primitive_index_2 ...]):判断一个集合中是否含有索引值.集合set_name 中包含由索引primitive_index_1[,primitive_index_2...]所表示的对应元素,则返回1(逻辑值“真”),否则返回0(逻辑值“假”).@WRAP(INDEX,LIMIT):返回J=INDEX-K*LIMIT,其中J 位于区间[1,LIMIT],K 为整数.当INDEX 位于区间[1,LIMIT]内时直接返回INDEX .相当于数学上用INDEX 对LIMIT 取模函数的值+1,即@WRAP(INDEX,LIMIT)=@MOD(INDEX,LIMIT)+1.此函数对LIMIT <1无定义.可以想到,此函数的目得之一是防止集合的索引值越界.@SIZE(set_name):返回集合set_name 的模,即元素的个数.五、变量定界函数变量定界函数是对变量的取值范围加以限制的函数.主要有@BIN, @BND, @FREE, @GIN 四种,下面简要介绍其作用.@BIN(variable):限制变量variable 为0或1. @BND(lower_bound, variable, upper_bound):限制lower_bound <=variable <=upper_bound@FREE(variable):取消对变量variable 的符号限制(即可取负数、0或正数). @GIN(variable):限制变量variable 为整数.六、财务会计函数财务会计函数是用于计算净现值的函数.主要有@FPA, @FPL 两种,下面简要介绍其作用. @FPA(I,N):返回若干时段单位等额回收净现值.其中单位时段利率为I,时段N 个,即∑=+=Nn nI N I FPA 1)1(1),(@@FPL(I,N):返回一个时段单位回收净现值.其中单位时段利率为I,时段N ,即NI N I FPL )1(1),(@+=七、概率中的相关函数概率中的相关函数是涉及到概率论和随机过程中的一些函数.主要有以下函数: @PSN(X):返回标准正态分布的分布函数在X 点的取值.@PSL(X):标准正态的线性损失函数,即返回MAX(0,Z-X)的期望值,其中Z 为均值为A的Poisson随机变量.@PPS(A,X):返回均值为A的Poisson分布的分布函数在X点的取值.@PPL(A,X):Poisson分布的线性损失函数,即返回MAX(0,Z-X)的期望值,其中Z为标准正态随机变量.@PBN(P,N,X):返回参数为(N,P)的二项分布的分布函数在X点的取值.@PHG(POP,G,N,X):返回总共有POP个球,其中G个是白球,随机地从中取出N个球,白球不超过X的概率.@PFD(N,D,X):返回自由度为N和D的F分布的分布函数在X点的取值.@PCX(N,X):返回自由度为N的2分布的分布函数在X点的取值.@PTD(N,X):返回自由度为N的t分布的分布函数在X点的取值.@PEB(A,X):返回当到达负荷(强度)为A,服务系统有X个服务器且允许无穷排队时的Erlang繁忙概率.@PEL(A,X):返回当到达负荷(强度)为A,服务系统有X个服务器且不允许排队时的Erlang繁忙概率.@PFS(A,X,C):返回当负荷上限为A,顾客数为C,并行服务器数量为X时,有限源的Poisson服务系统得等待顾客数的期望值.@QRAND(SEED):返回0与1之间的多个拟均匀随机数,其中SEED为种子,默认时取当前计算机时间为种子.该函数只能用在数据段(DATA-ENDDATA).@RAND(SEED):返回0与1之间的一个伪均匀随机数,其中SEED为种子.八、文件输入输出函数文件输入输出函数是指通过文件输入数据和输出结果的函数.主要有以下函数:@FILE('filename'):这个函数提供LINGO与文本文件的接口,用于引用其它ASCII码或文本文件中的数据,其中filename为存放数据的文件名(包括路径,没有指定路径时表示当前目录),该文件中记录之间必须用符号“~”分开.主要用在集合段和数据段,通过文本文件输入数据.@TEXT(['filename']):用于数据段中将解答结果送到文本文件filename中.@ODBC(['data_source'[,'table_name'[,'col_1'[, 'col_2'...]]]]):这个函数提供LINGO与ODBC(open data base connection,开放式数据库连接)的接口,用于集合段和数据段中引用其它数据库数据或将解答结果送到数据库中.其中data_source是数据库名,table_name是数据表名,col_i是数据列名(数据域名).@OLE('spreadsheet_file'[,range_name_list]):这个函数提供LINGO与OLE(object linking and embedding,对象链接与嵌入)的借口,用于集合段、数据段和初始段中输入和输出数据库.其中spreadsheet_file是文件名,range_name_list是文件中包含数据的单元范围.@POINTER(N):在Windows 下使用LINGO 的动态链接库(dynamic link library ,DLL ),直接从共享的内存中传送数据.§3.4 LINGO 软件求解案例一、生产管理问题1.问题实例某厂有5种设备A 1,A 2,…,A 5,用来加工7种零部件B 1,B 2,…,B 7,每种设备的数量、每种零部件的单位成本及所需各设备的加工工时(以小时计)见表1表1在其后的半年中,工厂有设备检修计划(停工检修时间一个月)见表2 表2工厂在半年中有订单(必须按时交货)见表3 表3 每种零部件库存最多可到100件,现每种零部件有库存80件,库存费用每件每月为0.5元,,要求到六月底每种零部件有存货50件,每种零部件生产至少50件.工厂每周工作5天,每天2班,每班8小时.试回答如下问题:(1) 工厂如何安排各月份各种零部件的加工数量? (2) 单位成本有10%的变化,对计划有什么影响? (3) 设备各增加1台对计划有什么的影响. 2.模型建立设: ij a 为第j 种零部件在第i 种设备上的单位加工工时)7,,2,1,5,,2,1( ==j i ;ik b 为第i 种设备在第k 月的数量)6,,2,1,5,,2,1( ==k i ; kj d 为第k 月第j 种零部件的顶单数量)7,,2,1,6,,2,1( ==j k ; j c 为第j 种零部件的单位收益)7,,2,1( =j ;kj x 为第k 月第j 种零部件的生产数量)7,,2,1,6,,2,1( ==j k ; kj s 为第k 月末第j 种零部件的库存数量)7,,2,1,6,,2,1( ==j k ; 800=j s 为初始库存)7,,2,1( =j假设每月以20天计,有以下模型:⎪⎪⎪⎪⎪⎩⎪⎪⎪⎪⎪⎨⎧==≥≥==≥=≤====-+===≤+-=====∑∑∑∑∑)(7,,2,1,6,,2,1,0,07,,2,1,6,,2,1,50)(7,,2,1,100)(7,,2,1,50)(7,,2,1,6,,2,1,)(6,,2,1,5,,2,13205.0min6(617161617171非负约束生产要求个月末的库存第种零部件的库存月第第种设备的有效工时月第第费用目标))(,库存约束 j k s x j k x j s j s j k d x s s k i b x a sx ckj kj kj kjjkj kj j k kj ik j kj ij k k j kjj kj jj k i k3.模型求解利用LINGO 软件计算,输入model: sets:cp/1..7/:c; yf/1..6/:; sb/1..5/:;sl1(yf,cp):x,d,s; sl2(sb,cp):a;sl3(sb,yf):b; endsets data:a=0.5 0.7 0.0 0.0 0.3 0.2 0.5 0.1 0.2 0.0 0.3 0.0 0.6 0.0 0.2 0.0 0.8 0.0 0.0 0.0 0.6 0.05 0.03 0 0.07 0.1 0 0.08 0 0 0.01 0 0.05 0 0.05; b=3 4 4 4 3 4 2 2 1 1 1 2 3 1 3 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1;d=250 500 150 150 400 100 100 300 250 100 0 200 150 100 150 300 0 0 250 200 100 100 150 200 250 100 0 100 0 100 250 100 500 150 0 250 250 100 300 550 250 100; c=100 60 80 40 110 90 30; enddatamin=@sum(sl1(k,j):c(j)*x(k,j)+0.5*s(k,j));@for(yf(k):@for(sb(i):@sum(cp(j):a(i,j)*x(k,j))<=320*b(i,k))); @for(yf(k)|k#gt#1:@for(cp(j):s(k,j)=s(k-1,j)+x(k,j)-d(k,j))); @for(cp(j):s(1,j)=80+x(1,j)-d(1,j)); @for(cp(j):s(6,j)=50);@for(sl1(k,j):s(k,j)<=100); @for(sl1(k,j):x(k,j)>=50); end(1)计算结果有:目标函数:590580 z(2)目标的灵敏度分析:Objective Coefficient Ranges(目标系数的灵敏度分析)Current Allowable Allowable Variable Coefficient Increase Decrease 变量目前系数允许增加范围允许减少范围X( 1, 1) 100.0000 INFINITY 0.5000000 X( 1, 2) 60.00000 INFINITY 0.5000000X( 1, 3) 80.00000 INFINITY 0.5000000X( 1, 4) 40.00000 INFINITY 1.500000X( 1, 5) 110.0000 INFINITY 0.5000000X( 1, 6) 90.00000 INFINITY 0.5000000X( 1, 7) 30.00000 INFINITY 0.5000000X( 2, 1) 100.0000 0.5000000 0.5000000X( 2, 2) 60.00000 0.5000000 0.5000000X( 2, 3) 80.00000 0.5000000 1.000000X( 2, 4) 40.00000 INFINITY 1.000000X( 2, 5) 110.0000 0.5000000 0.5000000X( 2, 6) 90.00000 0.5000000 0.5000000X( 2, 7) 30.00000 0.5000000 0.5000000X( 3, 1) 100.0000 0.5000000 0.5000000X( 3, 2) 60.00000 0.5000000 0.5000000X( 3, 3) 80.00000 INFINITY 0.5000000X( 3, 4) 40.00000 INFINITY 0.5000000X( 3, 5) 110.0000 0.5000000 0.5000000X( 3, 6) 90.00000 0.5000000 1.000000X( 3, 7) 30.00000 0.5000000 0.5000000X( 4, 1) 100.0000 0.5000000 1.000000X( 4, 2) 60.00000 0.5000000 0.5000000X( 4, 3) 80.00000 0.5000000 0.5000000X( 4, 4) 40.00000 0.5000000 0.5000000X( 4, 5) 110.0000 0.5000000 0.5000000X( 4, 6) 90.00000 INFINITY 0.5000000X( 4, 7) 30.00000 0.5000000 1.000000X( 5, 1) 100.0000 INFINITY 0.5000000X( 5, 2) 60.00000 0.5000000 0.5000000X( 5, 3) 80.00000 0.5000000 0.5000000X( 5, 4) 40.00000 0.5000000 0.5000000X( 5, 5) 110.0000 0.5000000 0.5000000X( 5, 6) 90.00000 0.5000000 0.5000000X( 5, 7) 30.00000 INFINITY 0.5000000X( 6, 1) 100.0000 0.5000000 INFINITYX( 6, 2) 60.00000 0.5000000 INFINITYX( 6, 3) 80.00000 0.5000000 INFINITYX( 6, 4) 40.00000 0.5000000 INFINITYX( 6, 5) 110.0000 0.5000000 INFINITYX( 6, 6) 90.00000 0.5000000 INFINITYX( 6, 7) 30.00000 0.5000000 INFINITY 其中INFINITY是无穷.从以上灵敏度分析可见,提高10%,有超出允许范围的,所以对计划有影响.(3)约束条件的灵敏度分析:Righthand Side Ranges(右边常数项的灵敏度分析)Row Current Allowable AllowableRHS Increase Decrease行目前常数项允许增加范围允许减少范围2 960.0000 INFINITY 450.00003 640.0000 INFINITY 488.00004 960.0000 INFINITY 840.00005 320.0000 INFINITY 258.00006 320.0000 INFINITY 300.80007 1280.000 INFINITY 836.00008 640.0000 INFINITY 473.00009 320.0000 INFINITY 138.000010 320.0000 INFINITY 268.400011 320.0000 INFINITY 305.500012 1280.000 INFINITY 830.000013 320.0000 INFINITY 110.000014 960.0000 INFINITY 830.000015 320.0000 INFINITY 267.000016 320.0000 INFINITY 302.000017 1280.000 INFINITY 1035.00018 320.0000 INFINITY 205.000019 960.0000 INFINITY 760.000020 320.0000 INFINITY 282.000021 320.0000 INFINITY 308.500022 960.0000 INFINITY 670.000023 640.0000 INFINITY 525.000024 960.0000 INFINITY 720.000025 320.0000 INFINITY 253.500026 320.0000 INFINITY 290.000027 1280.000 INFINITY 655.000028 640.0000 INFINITY 270.000029 640.0000 INFINITY 410.000030 320.0000 INFINITY 206.000031 320.0000 INFINITY 283.5000 从以上灵敏度分析可见,提高1台,没有超出允许范围的,所以对计划没有影响.也可以将数据与模型分离,先准备数据文件exam01.ldt:!单耗;0.5 0.7 0.0 0.0 0.3 0.2 0.50.1 0.2 0.0 0.3 0.0 0.6 0.00.2 0.0 0.8 0.0 0.0 0.0 0.60.05 0.03 0 0.07 0.1 0 0.080 0 0.01 0 0.05 0 0.05~!设备数量;3 4 4 4 3 42 2 1 1 1 23 1 3 3 3 21 1 1 1 1 11 1 1 1 1 1~!需求;250 500 150 150 400 100 100300 250 100 0 200 150 100150 300 0 0 250 200 100100 150 200 250 100 0 1000 100 250 100 500 150 0250 250 100 300 550 250 100~!单位成本;100 60 80 40 110 90 30~再写程序如下:model:sets:cp/1..7/:c;yf/1..6/:;sb/1..5/:;sl1(yf,cp):x,d,s;sl2(sb,cp):a;sl3(sb,yf):b;endsetsdata:a=@file('exam01.ldt');b=@file('exam01.ldt');d=@file('exam01.ldt');c=@file('exam01.ldt');enddatamin=@sum(sl1(k,j):c(j)*x(k,j)+0.5*s(k,j));@for(yf(k):@for(sb(i):@sum(cp(j):a(i,j)*x(k,j))<=320*b(i,k)));@for (yf(k)|k#gt#1:@for (cp(j):s(k,j)=s(k-1,j)+x(k,j)-d(k,j))); @for (cp(j):s(1,j)=80+x(1,j)-d(1,j)); @for (cp(j):s(6,j)=50);@for (sl1(k,j):s(k,j)<=100); @for (sl1(k,j):x(k,j)>=50); end二、下料问题1.问题实例有某种材料一根长19米.现需用其切割4米长毛坯50根、5米长毛坯10根、6米长毛坯20根、8米长毛坯15根.如何切割使其用料最省?要求切割模式不能超过3种. 2.模型建立设:4,3,2,1=i 分别表示4米长,5米长,6米长,8米长的毛坯;i a 为第i 种毛坯的长度)4,3,2,1(=i ; i b 为第i 种毛坯的需要量)4,3,2,1(=i ;j x 为第j 种切割模式所用的材料数量)3,2,1(=j ;ij r 为第j 种切割模式切割第i 种毛坯的数量)3,2,1,4,3,2,1(==j i .一种合理的切割模式应满足:其余料长度不应该大于或等于需要切割毛坯的最小长度.于是有模型如下⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧==≥≥=≥=≤=≥=∑∑∑∑====3,2,1,4,3,2,1,0,0(3,2,1,16(3,2,1,19(4,3,2,1,(min 41413131j i r x j r a j r a i b x r xz ij ji ij i i ij i i j j ij j j且整数合理的下料模式所下毛坯的总长所下毛坯的需要量用料目标))))3.模型求解为了便于运算,我们先来缩小可行域.由于3种切割模式的排列顺序是无关紧要的,所以不妨增加以下约束:321x x x ≥≥又注意到用料的总量有明显的上界和下界.首先,无论如何,用料总量不可能少于2619158206105504=⎥⎥⎤⎢⎢⎡⨯+⨯+⨯+⨯其次,考虑一种特殊的下料计划:模式1:切割成4根4米钢管,需13根;模式2:切割成1根5米和2根6米钢管,需10根;模式3:切割成2根8米钢管,需8根.这样需要13+10+8=31于是可得到解的一个上界.所以又可增加约束:3126321≤++≤x x x利用LINGO 软件计算,输入 model: sets:needs/1..4/:a,b; cuts/1..3/:x;patterns(needs,cuts):r; endsets data: a=4 5 6 8; b=50 10 20 15; enddatamin=@sum(cuts(j):x(j));!用料目标;@for(needs(i):@sum(cuts(j):x(j)*r(i,j))>b(i));!需要量要求; @for(cuts(j):@sum(needs(i):a(i)*r(i,j))<19);!材料总长; @for(cuts(j):@sum(needs(i):a(i)*r(i,j))>16);!合理模式; @sum(cuts(j):x(j))>26;!用料下限; @sum(cuts(j):x(j))<31;!用料上限;@for(cuts(j)|j#lt#@size(cuts):x(j)>x(j+1));!人为约束; @for(cuts(j):@gin(x(j)));!整数约束;@for(patterns(i,j):@gin(r(i,j)));!整数约束; end经过LINGO 求解,得到输出如下:Objective value: 28.00000 Variable Value Reduced Cost X( 1 ) 10.00000 0.000000X( 2 ) 10.00000 2.000000X( 3 ) 8.000000 1.000000R( 1, 1) 3.000000 0.000000R( 1, 2) 2.000000 0.000000R( 1, 3) 0.000000 0.000000R( 2, 1) 0.000000 0.000000R( 2, 2) 1.000000 0.000000R( 2, 3) 0.000000 0.000000R( 3, 1) 1.000000 0.000000R( 3, 2) 1.000000 0.000000R( 3, 3) 0.000000 0.000000R( 4, 1) 0.000000 0.000000R( 4, 2) 0.000000 0.000000R( 4, 3) 2.000000 0.000000即按照模式1、2、3分别切割10、10、8根材料,使用材料总根数为28根.第一种切割模式下1根材料切割3根4米的和1根6米的;第二种切割模式下1根材料切割2根4米的、1根5米的和1根6米的;第三种切割模式下1根材料切割2根8米的.三、投资组合问题1.问题实例有三种股票A,B,C,其前12年的价值每年的增长情况如表所示表中还给出了相应年份的500种股票的价格指数的增长情况.假设目前你有一笔资金准备投资这三种股票,并期望年收益率达到15%,那么你应如何投资? 2.模型建立设:3,2,1=i 分别表示表示A,B,C 三种股票;i R 为第i 种股票的价值)3,2,1(=i ;ij R 为第i 种股票第j 年的价值)12,,2,1,3,2,1( ==j i ; M 为指数;j M 为第j 年的指数)12,,2,1( =j ;i x 为投资第i 种股票比例)3,2,1(=i .股票指数反映的是股票市场的大势信息,对每只股票的涨跌是有影响的.假设每只股票的收益与股票指数成线性关系.即i i i i e M b a R ++=或12,,2,1,3,2,1, ==++=j i e Mb a R ij jij ij ij其中ij ij b a ,是待定系数,ij e 是一个随机误差,其均值为0)(=ij e E ,方差为)(2ij ij e D s =,此外假设随机误差ij e 与其他股票和股票指数都是独立的,所以0)()(==j ij kj ij M e E e e E .先根据所给数据回归计算ij ij b a ,,即使误差的平方和最小:3,2,1,||min12121212=-+=∑∑==i R Mb aej ij jij ijj ij可用Matlab 软件做该回归计算,也可用LINGO 软件分别来做每只股票的回归计算,输入 model: sets:year/1..12/:M,R,a,b,e; endsets data:R=1.300 1.103 1.216 0.954 0.929 1.056 1.038 1.089 1.090 1.083 1.035 1.176;M=1.258997 1.197526 1.364361 0.919287 1.057080 1.055012 1.187925 1.317130 1.240164 1.183675 0.990108 1.526236; enddatacalc:mean0=@sum(year(j):M(j))/@size(year);s20=@sum(year(j):@sqr(M(j)-mean0))/(@size(year)-1); s0=@sqrt(s20); endcalc min=s2;s2=@sum(year(j):@sqr(e(j)))/(@size(year)-2); s=@sqrt(s2);@for(year(j):e(j)=R(j)-a-b*M(j)); @for(year(j):@free(e(j))); @free(a);@free(b);End对上面的程序,注意以下几点: (1)只给了一种股票的价值R ;(2)在CALC 段直接计算了M 的均值mean0和方差s20以及标准差s0(为了使这个估计是无偏估计,分母是11而不是12);(3)程序中用到平方函数@sqr 和平方根函数@sqrt ;(4)除了计算回归系数外,同时估计了回归误差s2和标准差s ,为了使这个估计是无偏估计,分母是10而不是11和12,这是因为此时已经假设保持误差的均值为0,所以自由度又少了一个;(5)@free(a),@free(b),@free(e)三个语句不能少,因为它们不一定是非负的; 运行这个LINGO 模型,结果为:Objective value: 0.5748320E-02Variable Value Reduced Cost MEAN0 1.191458 0.000000 S20 0.2873661E-01 0.000000 S0 0.1695188 0.000000 S2 0.5748320E-02 0.000000 S 0.7581767E-01 0.000000 A 0.5639761 0.000000 B 0.4407264 0.000000也就是说:M 的均值191458.10=m ,方差02873661.020=s ,标准差1695188.00=s ,对股票A ,回归系数5639761.01=a ,4407264.01=b ,误差的方差005748320.021=s ,误差的标准差07581767.01=s .同理,可以得到:对股票B ,回归系数239802.1,2635059.022=-=b a ,误差的方差01564263.022=s ,误差的标准差1250705.02=s .对股票C ,回归系数523798.1,5809590.033=-=b a ,误差的方差03025165.023=s ,误差的标准差1739300.03=s .于是,年投资收益为∑∑==++==3131)(i i i i ii i ie M b a xR xR收益的期望为∑∑==+=++=31031)()(i i i ii i i i im b a xe M b a E xER收益的方差为∑∑==+=++=3122202312])[()(i i i iii i i i is x s bx e M b a D xDR 进一步,令∑=iibx y ,则模型应该为⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧≥≥+==+=∑∑∑∑====015.1)(1 ..)(min 31031313122202ii i i i i ii ii i i i x m b a x x b x y t s s x s y z 3.模型求解利用LINGO 软件计算,输入 model: sets:stocks/1..3/:u,b,s2,x; endsets data:mean0=1.191458;s20=0.02873661;s2=0.005748320,0.01564263,0.03025165; u=0.5639761,-0.2635059,-0.5809590; b=0.4407264,1.239802,1.523798; enddatamin=s20*@sqr(y)+@sum(stocks(i):s2(i)*@sqr(x(i))); @sum(stocks(i):b(i)*x(i))=y; @sum(stocks(i):x(i))=1;@sum(stocks(i):(u(i)+b(i)*mean0)*x(i))>1.15; end运算这个LINGO 模型,输出结果如下Objective value: 0.2465621E-01 Y 0.8453449 0.000000 X( 1) 0.5266052 0.000000 X( 2) 0.3806461 0.000000 X( 3) 0.9274874E-01 0.000000根据运算结果可知:A 大约占初始时刻总资产的53%,B 占38%,C 占9%.四、最小费用最大流问题1.问题实例需要将某地s 的天然气通过管道输送到另一地t ,中间有4个中转站4321,,,v v v v .由于输气管道的长短粗细不一或地质等原因,使得每条管道上的运输量及费用不同.下图给出了这两地与中转站的连接以及管道的容量、费用:图中括号里第一个数字是管道容量,第二个数字是管道单位运费.考虑s 地到t 地如何输送天然气,使得费用最小流量最大. 2.模型建立设:V 为网络顶点集,A 为网络的弧集;ij f 为弧),(j i 上的流量;ij b 为弧),(j i 上的单位运费; ij c 为弧),(j i 上的容量;)(f v 为发点处的净流量.根据最大流的定义,我们有模型如下:⎪⎪⎪⎩⎪⎪⎪⎨⎧⎪⎪⎩⎪⎪⎨⎧∈≤≤⎪⎩⎪⎨⎧≠=-==-∑∑∑∈∈∈∈∈A j i c f t s i ti f v s i f v f f t s f v t s f bij ij A i j V j ji A j i V j ij Aj i ijij),(,0, 0 )( ),(..)(max ..min),(),(),( 3.模型求解先考虑最大流模型,LINGO 软件输入如下 model: sets:nodes/s,1,2,3,4,t/;arcs(nodes,nodes)/s,1 s,2 1,2 1,3 2,4 3,2 3,t 4,3 4,t/:c,f; endsets data:c=8 7 5 9 9 2 5 6 10; enddata max=flow;@for(nodes(i)|i#ne#1 #and# i#ne#@size(nodes):@sum(arcs(i,j):f(i,j))-@sum(arcs(j,i):f(j,i))=0);@sum(arcs(i,j)|i#eq#1:f(i,j))=flow; @for(arcs(i,j):@bnd(0,f(i,j),c(i,j))); end计算结果如下:Objective value: 14.00000Variable Value Reduced Cost FLOW 14.00000 0.000000F( S, 1) 7.000000 0.000000F( S, 2) 7.000000 0.000000F( 1, 3) 5.000000 0.000000F( 2, 4) 9.000000 -1.000000F( 3, 2) 0.000000 0.000000F( 3, T) 5.000000 -1.000000F( 4, 3) 0.000000 1.000000F( 4, T) 9.000000 0.000000 其次考虑最小费用最大流模型,LINGO软件输入如下model:sets:nodes/s,1,2,3,4,t/;arcs(nodes,nodes)/s,1 s,2 1,2 1,3 2,4 3,2 3,t 4,3 4,t/:b,c,f;endsetsdata:b=2 8 5 2 3 1 6 4 7;c=8 7 5 9 9 2 5 6 10;flow=14;enddatamin=@sum(arcs(i,j):b(i,j)*f(i,j));@for(nodes(i)|i#ne#1 #and# i#ne#@size(nodes):@sum(arcs(i,j):f(i,j))-@sum(arcs(j,i):f(j,i))=0);@sum(arcs(i,j)|i#eq#1:f(i,j))=flow;@for(arcs(i,j):@bnd(0,f(i,j),c(i,j)));end计算结果如下:Objective value: 205.0000Variable Value Reduced CostF( S, 1) 8.000000 -1.000000F( S, 2) 6.000000 0.000000F( 1, 2) 1.000000 0.000000F( 1, 3) 7.000000 0.000000F( 2, 4) 9.000000 0.000000F( 3, 2) 2.000000 -3.000000F( 3, T) 5.000000 -8.000000F( 4, 3) 0.000000 11.00000附录 LINGO出错信息在LINGO程序求解时,系统首先会对程序进行编译.系统在编译或执行其他命令时,会因程序中的错误或运行错误,弹出一个出错报告窗口,显示其错误代码,并简要指出错误的原因.这些错误报告信息能够提示用户发现程序中的错误,以便能尽快修改.下面我们给出出错信息的一个简要说明,仅供参考.LINGO错误编号及原因对照表习题1.用LINGO 软件求解线性规划问题并作灵敏度分析(1) ⎪⎩⎪⎨⎧≥≤++≤++-++-=0,,9010412203..1355max 321221321321x x x x x x x x x t s x x x(2)⎪⎩⎪⎨⎧≥≤≤+--≤+---+-=0,,,1035.0125.009825.0..65.02075.0max 3213432143214321x x x x x x x x x x x x t s x x x x z2.用LINGO 软件求解0-1规划问题⎪⎪⎩⎪⎪⎨⎧=≥+-+≥+++-≥+++-+++=10,,,11424204..4352min 43214321432143214321或x x x x x x x x x x x x x x x x t s x x x x 3.用LINGO 软件求解整数规划问题⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧≥≤≤≤≤=+=-+=-+=-++++++=且整数0,,,,,,20,45,40,3025352515..2.02.02.05.54.51.50.5min 3214321432134323212113214321y y y x x x x x x x x y x y y x y y x y x t s y y y x x x x4.用LINGO 软件求解非线性规划问题⎪⎪⎩⎪⎪⎨⎧=≤≤--=+-+=++-+-+-+-+-=5,4,3,2,1,55222223..)()()()()1(min 4232332215544433322211i x x x x x x x t s x x x x x x x x x z i5.用LINGO 软件求解⎪⎩⎪⎨⎧-∈≤+++≤-≤+≤-+=}1,1{,,,2311..21max 432143214321TTx x x x x x x x x x x x t s z Qxx x c其中T )2,4,8,6(-=c ,Q 是三对角线矩阵,主对角线上元素全为-1,两条次对角线上元素全为2.。
LINGO基本教程(完整版)pdf一、教学内容本节课我们使用的教材是《LINGO基本教程》,我们将学习第14章的内容。
第1章介绍LINGO软件的基本操作,包括界面的熟悉、模型的建立等;第2章学习线性规划模型的建立与求解;第3章讲解非线性规划模型的建立与求解;第4章介绍整数规划模型的建立与求解。
二、教学目标1. 学生能够熟练操作LINGO软件,建立和求解线性、非线性以及整数规划模型。
2. 学生能够理解线性、非线性以及整数规划的基本概念,并能够运用到实际问题中。
3. 学生通过学习LINGO基本教程,提高自己的逻辑思维能力和解决实际问题的能力。
三、教学难点与重点重点:熟练操作LINGO软件,建立和求解线性、非线性以及整数规划模型。
难点:理解线性、非线性以及整数规划的基本概念,以及如何将这些概念运用到实际问题中。
四、教具与学具准备教具:多媒体教学设备、投影仪、计算机。
学具:学生计算机、LINGO软件、教材《LINGO基本教程》。
五、教学过程1. 实践情景引入:以一个简单的线性规划问题为切入点,引导学生思考如何利用LINGO软件求解。
2. 讲解教材内容:分别讲解第14章的内容,包括LINGO软件的基本操作、线性规划模型的建立与求解、非线性规划模型的建立与求解以及整数规划模型的建立与求解。
3. 例题讲解:针对每个章节的内容,选择合适的例题进行讲解,让学生通过例题理解并掌握相关知识点。
4. 随堂练习:在每个章节讲解结束后,安排随堂练习,让学生通过练习巩固所学知识。
5. 课堂互动:鼓励学生提问,解答学生在学习过程中遇到的问题。
6. 板书设计:每个章节的重要知识点和操作步骤进行板书设计,方便学生复习。
7. 作业布置:布置与本节课内容相关的作业,巩固所学知识。
六、作业设计1. 作业题目:最大化问题:目标函数:Z = 2x1 + 3x2约束条件:x1 + x2 ≤ 62x1 + x2 ≤ 8x1, x2 ≥ 0最大化问题:目标函数:Z = x1^2 + x2^2约束条件:x1 + x2 ≤ 5x1^2 + x2^2 ≤ 10x1, x2 ≥ 0最大化问题:目标函数:Z = 3x1 + 2x2约束条件:x1 + x2 ≤ 42x1 + x2 ≤ 6x1, x2 均为整数2. 答案:(1)线性规划问题的解为:x1 = 2, x2 = 4(2)非线性规划问题的解为:x1 = 3, x2 = 2(3)整数规划问题的解为:x1 = 2, x2 = 2七、板书设计1. 第1章:LINGO软件的基本操作(1)界面的熟悉(2)模型的建立2. 第2章:线性规划模型的建立与求解(1)目标函数的定义(2)约束条件的设置(3)求解线性规划问题3. 第3章:非线性规划模型的建立与求解(1)目标函数的定义(2)约束条件的设置(3)求解非线性规划问题4. 第4章:整数规划模型的建立与求解(1)目标函数的定义(2)约束条件的设置(3)求解整数规划问题八、课后反思及拓展延伸本节课通过实践情景引入,使学生能够快速融入学习状态。
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 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中的集对实际问题建模的时候,总会遇到一群或多群相联系的对象,比如工厂、消费者群体、交通工具和雇工等等。
LINGO允许把这些相联系的对象聚合成集(sets)。
一旦把对象聚合成集,就可以利用集来最大限度的发挥LINGO建模语言的优势。
现在我们将深入介绍如何创建集,并用数据初始化集的属性。
学完本节后,你对基于建模技术的集如何引入模型会有一个基本的理解。
2.1 为什么使用集集是LINGO建模语言的基础,是程序设计最强有力的基本构件。
借助于集,能够用一个单一的、长的、简明的复合公式表示一系列相似的约束,从而可以快速方便地表达规模较大的模型。
2.2 什么是集集是一群相联系的对象,这些对象也称为集的成员。
一个集可能是一系列产品、卡车或雇员。
每个集成员可能有一个或多个与之有关联的特征,我们把这些特征称为属性。
属性值可以预先给定,也可以是未知的,有待于LINGO求解。
例如,产品集中的每个产品可以有一个价格属性;卡车集中的每辆卡车可以有一个牵引力属性;雇员集中的每位雇员可以有一个薪水属性,也可以有一个生日属性等等。
LINGO有两种类型的集:原始集(primitive set)和派生集(derived set)。
一个原始集是由一些最基本的对象组成的。
一个派生集是用一个或多个其它集来定义的,也就是说,它的成员来自于其它已存在的集。
2.3 模型的集部分集部分是LINGO模型的一个可选部分。
在LINGO模型中使用集之前,必须在集部分事先定义。
集部分以关键字“sets:”开始,以“endsets”结束。
一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分。
一个集部分可以放置于模型的任何地方,但是一个集及其属性在模型约束中被引用之前必须定义了它们。
2.3.1 定义原始集为了定义一个原始集,必须详细声明:·集的名字·可选,集的成员·可选,集成员的属性定义一个原始集,用下面的语法:setname[/member_list/][:attribute_list];注意:用“[]”表示该部分内容可选。
下同,不再赘述。
Setname是你选择的来标记集的名字,最好具有较强的可读性。
集名字必须严格符合标准命名规则:以拉丁字母或下划线(_)为首字符,其后由拉丁字母(A—Z)、下划线、阿拉伯数字(0,1,…,9)组成的总长度不超过32个字符的字符串,且不区分大小写。
注意:该命名规则同样适用于集成员名和属性名等的命名。
Member_list是集成员列表。
如果集成员放在集定义中,那么对它们可采取显式罗列和隐式罗列两种方式。
如果集成员不放在集定义中,那么可以在随后的数据部分定义它们。
①当显式罗列成员时,必须为每个成员输入一个不同的名字,中间用空格或逗号搁开,允许混合使用。
例2.1可以定义一个名为students的原始集,它具有成员John、Jill、Rose和Mike,属性有sex和age:sets:students/John Jill, Rose Mike/: sex, age;endsets②当隐式罗列成员时,不必罗列出每个集成员。
可采用如下语法:setname/member1..memberN/[: attribute_list];这里的member1是集的第一个成员名,memberN是集的最末一个成员名。
LINGO将自动产生中间的所有成员名。
LINGO也接受一些特定的首成员名和末成员名,用于创建一些特殊的集。
例2.2!集部分;;sets:students:sex,age;endsets!数据部分;data:students,sex,age= John 1 16Jill 0 14Rose 0 17Mike 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会自动创建父集成员的所有组合作为派生集的成员。
派生集的父集既可以是原始集,也可以是其它的派生集。
例2.3sets:product/A B/;machine/M N/;week/1..2/;allowed(product,machine,week):x;endsetsLINGO生成了三个父集的所有组合共八组作为allowed集的成员。
列表如下:编号成员1 (A,M,1)22(A,M,2)33(A,N,1)44(A,N,2)55(B,M,1)66(B,M,2)77(B,N,1)88(B,N,2) 成员列表被忽略时,派生集成员由父集成员所有的组合构成,这样的派生集成为稠密集。
如果限制派生集的成员,使它成为父集成员所有组合构成的集合的一个子集,这样的派生集成为稀疏集。
同原始集一样,派生集成员的声明也可以放在数据部分。
一个派生集的成员列表有两种方式生成:①显式罗列;②设置成员资格过滤器。
当采用方式①时,必须显式罗列出所有要包含在派生集中的成员,并且罗列的每个成员必须属于稠密集。
使用前面的例子,显式罗列派生集的成员:allowed(product,machine,week)/A M 1,A N 2,B N 1/;如果需要生成一个大的、稀疏的集,那么显式罗列就很讨厌。
幸运地是许多稀疏集的成员都满足一些条件以和非成员相区分。
我们可以把这些逻辑条件看作过滤器,在LINGO生成派生集的成员时把使逻辑条件为假的成员从稠密集中过滤掉。
例2.4sets:!学生集:性别属性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#是逻辑运算符,用来判断是否“相等”,可参考§4. &1可看作派生集的第1个原始父集的索引,它取遍该原始父集的所有成员;&2可看作派生集的第2 个原始父集的索引,它取遍该原始父集的所有成员;&3,&4,……,以此类推。
注意如果派生集B的父集是另外的派生集A,那么上面所说的原始父集是集A向前回溯到最终的原始集,其顺序保持不变,并且派生集A的过滤器对派生集B仍然有效。
因此,派生集的索引个数是最终原始父集的个数,索引的取值是从原始父集到当前派生集所作限制的总和。