LINGO 软件的基本使用方法_第1页
LINGO 软件的基本使用方法_第2页
LINGO 软件的基本使用方法_第3页
LINGO 软件的基本使用方法_第4页
LINGO 软件的基本使用方法_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——LINGO软件的基本使用方法这是61/pub/1.éú???2ò?/2023′o_êy?§êμ?é_D??eD?/8_??ê?ó??ˉ/LINGO-howto.pdf的HTML档。Google在网路漫游时会自动将档案转换成HTML网页来储存。Page1第3章LINGO软件的基本使用方法

§3.1LINGO的基本特点

LINGO8.0forWindows软件比以前的版本有了很大的改进,功能大大加强,性能更加稳定,解答结果更加可靠。

LINGO8.0forWindows软件安装程序的文件大小寻常20M多一点,安装过程与LINDO6.1forWindows的安装过程完全类似,我们下面假设LINGO8.0forWindows软件已经安装完毕。

同样,LINGO8.0也有两种命令模式:一种是常用的Windows模式,通过下拉式菜单命令驱动LINGO运行(多数的菜单命令寻常有快捷键,常用的菜单命令在工具栏中有图标表示的快捷按

钮),界面是图形式的,使用起来也比较便利;另一种是命令行(Command-Line)模式,仅在命令窗口(CommandWindow)下操作,通过输入行命令驱动LINGO运行,其使用界面不是图形式的,

而是字符式的,初学者往往不太简单把握。与上一章一样,我们依旧主要在Windows菜单驱动模

式下介绍LINGO的使用方法,最终再简单介绍一下命令行模式下的主要行命令。我们前面说过,从基本功能上看,与LINDO相比,LINGO软件主要具有两大优点:1、除具有LINDO的全部功能外,还可用于求解非线性规划问题,包括非线性整数规划问题。2、LINGO包含了内置的建模语言,允许以简练、直观的方式描述较大规模的优化问题,模型中所需的数据可以以一定格式保存在独立的文件中。

前一条是很简单理解的。那么后一条呢?从前一章的介绍中可以看到,虽然LINDO输入模型的格式与我们数学上对数学规划的表达式十分接近,但是假使我们希望在LINDO模型窗口下输入

一个比较大规模的模型,那将是一件十分费时吃力的事情。例如,假使决策变量有1000个,由于

LINDO不提供数组或类似的数据结构,我们除了用x1,x2,…,x1000或类似方法表示决策变量外,

完全没有其他方法。而对实际企业中的优化问题,决策变量达到几十万个也是常有的事,显然用前

面那种在LINDO模型窗口下输入模型的方法几乎是不可能的。而LINGO则在这方面通过引入建模

语言有了很大改进.也就是说,即使你只对解线性规划感兴趣,你也应当学习使用LINGO。

§3.2初识LINGO

在Windows操作系统下双击LINGO图标,启动LINGO软件,屏幕上首先显示如图1所示的

窗口。图1

1

Page2图1中最外层的窗口使LINGO软件的主窗口,所有其他窗口都在这个窗口之内。当前光标所在的窗口上标有―LINGOMODEL–LING01‖,这就是模型窗口,也就是用于输入优化模型的窗口。

初步观测可以看到,图1这个界面与LINDO软件的界面十分类似,只是在LINGO软件的主窗口中,

最下面增加了一个状态行(细心观测,可以发现菜单和工具栏也略有区别)。目前,状态行最左边

显示的是―Ready‖,表示―准备就绪‖;右下角现实的是当前时间,时间前面是当前光标的位置(1行1列)。将来,用户可以用选项命令(LINGO|Options菜单命令)决定是否需要显示工

具栏和状态行。

作为一个最简单的例子,我们看看上一章2.2节中输入的那个简单例子在LINGO下应当如何输

入.当时我们把它存入了一个名为EXAM0202.LTX的模型文件中,为了对比LINDO和LINGO输入

的区别,我们现在重新用LINDO把它开启,看到该例子是如图2所示的线性规划。图2图3

2

Page3在LINGO中,有一个命令可以直接把LINDO的模型文件转化成LINGO模型。我们选择菜单

命令FILE|IMPORTLINDOFILE(F12),其意思是―导入LINDO文件‖,则屏幕上会显示一个标准

的―开启文件‖的对话框,我们在目录下找到EXAM0202.LTX,选定该文件后,屏幕显示如图3。这个命令在LINGO主窗口中又开启了两个子窗口,一个是命令窗口(CommandWindow),另一个

是名为―exam0202‖的模型窗口.。可以看出,当前光标位于命令窗口(从主窗口左上角的显示结果

也可以知道当前的活动窗口),命令窗口显示的正是从EXAM0202.LTX读出的原始文本文件;而

―exam0202‖窗口才是由EXAM0202.LTX转化而来的等价的LINGO模型。

比较图2和图3可以发现转化工作主要在于以下几个方面(这也是LINGO模型的最基本特征):

(1)将目标函数的表示方式从―MAX‖变成了―MAX=‖;(2)―ST‖在LINGO模型中不再需要,所以被删除了;

(3)在每个系数与变量之间增加了运算符―*‖(即乘号不能省略);(4)每行(目标、约束和说明语句)后面均增加了一个分号―;‖;

(5)约束的名字被放到了一对方括号―[]‖中,而不是放在右半括号―)‖之前;

(6)模型终止标志―END‖也被删除了(LINGO中只有当模型以―MODEL:‖开始时才能以―END‖终止)。

注意:在上一章的最终,我们曾经用行命令―SAVE‖把同样的LINDO模型存入了一个名为MODEL01.LTX的模型文件中。但是经过试验,笔者发现菜单命令FILE|IMPORTLINDOFILE(F12)

不能把MODEL01.LTX正确地转化成LINGO模型。即使对于在LINDO中用菜单命令保存下来的模

型,笔者也屡屡发现有时不能正确地转化(转化时出现严重错误)。因此,本人的经验是:为了保

证将来能将LINDO模型移植到LINGO中去,在LINDO模型输入时应尽量采用―规范化‖的格式

(例如:说明语句最好单独占据一行;行名(目标和约束的名字)不要以数字开头;尽量避免少出

现汉字和非标准的英文字符;二次规划(QP)模型不能被正确转化;等等)。

无论如何,幸运的是我们的LINGO模型―exam0202‖已经成功地得到了。现在把光标移动到―exam0202‖模型窗口,然后选择菜单命令―LINGO|SOLVE‖对该模型进行求解(求解时LINGO自然还是先对模型进行编译,模型编译没有发现语法错误才开始求解);求解终止得到的结果与LINDO下得到的结果一致(但不询问是否进行敏感性分析),结果依旧在报告窗口中显示(这里我

们就不给出这个报告窗口的示意图了)。图4

3

Page4现在我们可以把模型和结果报告保存在文件中。例如,当光标位于―exam0202‖模型窗口时选择菜单命令―File|SaveAs‖,则出现图4所示的对话框。后缀―LG4‖表示LINGO格式的模型文件,是一种特别的二进制格式文件,保存了我们在模型窗口中所能够看到的所有文本和其他对象

及其格式信息,只有LINGO能读出它,用其他系统开启这种文件时会出现乱码。―LNG‖表示LINGO

文本文件,以这个格式保存模型时LINGO将给出警告,由于模型中的格式信息(如字体、颜色、

嵌入对象等)将会丢失。―LDT‖表示LINGO数据文件,―LTF‖表示LINGO命令脚本文件,―LGR‖

表示LINGO报告文件。除―LG4‖文件外,这里的另外几种格式的文件其实都是普通的文本文件,可以用任何文本编辑器开启和编辑。图5

求解时也会显示状态窗口(如图5所示),包含的内容比LINDO求解时的状态窗口中的内容要多一些(注意:可能由于LINDO和LINGO对中文WINDOWS系统的兼容性不太好,所以图5

中有些显示字符和单词被截掉了)。下面我们给出相应的解释:右边的5个框分别给出变量数量(其

中包括变量总数、非线性变量数、整数变量数)、约束数量(约束总数、非线性约束个数)、非零

系数数量(总数、非线性项的个数)、内存使用量、求解花费的时间。需要注意的是,凡是可以从

一个约束直接解出变量取值时,这个变量就不认为是决策变量而是固定变量,不列入统计中;只含

有固定变量的约束也不列入约束统计中(参见第一章1.8节的说明)。总的来说,这些统计值的意

义比较明白,图5中最下面一行的含义也与LINDO状态窗口类似,我们下面主要详细介绍一下图5

左边的两个框中内容。左上角是求解器(求解程序)状态框(SolverStatus),含义见表1;左下角

是扩展的求解器(求解程序)状态框(ExtendedSolverStatus),含义见表2。

4

Page5域名含义可能的显示ModelClass

当前模型的类型(请参阅本书第1章)

LP,QP,ILP,IQP,PILP,PIQP,NLP,INLP,PINLP(以I开头表示IP,以PI开头表示PIP)State当前解的状态

\LocalOptimum\\(不可行),\(无界),\(中断),\(未确定)Objective

当前解的目标函数值实数Infeasibility

当前约束不满足的总量(不是不满足的约束的个数)

实数(即使该值=0,当前解也可能不可行,由于这个量中没有考虑用上下界形式给出的约束)Iterations

目前为止的迭代次数非负整数表1域名含义可能的显示

SolverType使用的特别求解程序B-and-B(分枝定界算法)Global(全局最优求解程序)Multistart(用多个初始点求解的程序)BestObj

目前为止找到的可行解的最佳目标函数值实数ObjBound目标函数值的界实数Steps

特别求解程序当前运行步数:分枝数(对B-and-B程序);子问题数(对Global程序);初始点数(对Multistart程序)非负整数Active有效步数非负整数表2

作为一个例子,我们现在再用LINGO来解第1章1.4节给出的如下二次规划问题:Max98x

1

+277x

2

—x

12

—0.3x

1

x

2

—2x

22

s.t.x

1

+x

2

100

x

1

2x

2

x

1

,x

2

0为整数

该模型输入LINGO1模型窗口后的形式见图6。对照第2章2.6节,我们可以看出用LINGO解QP比用LINDO解要简单输入模型。注意:原来的整数限定语句―GINX1‖和―GINX2‖这里变成了―@GIN(X1)‖和―@GIN(X2)‖;但是,在LINDO下也可以写成―GIN2‖,这里却不可以写成―@GIN(2)‖,否则LINGO将把这个模型看成没有整数变量。在LINGO中,以―@‖开头的都是函数调用,我们将在后面(本章3.5节)详细介绍LINGO中能够使用的所有函数。图6

5

Page6图7

现在运行菜单命令―LINGO|Solve‖,则可以得到图7所示的解答报告,最优整数解X=(35,65),最大利润=11077.5。结果中最优整数解与第2章2.6节一致,但最优值略有不同,估计是

计算误差引起的。此外,LINGO是将它作为PINLP(纯整数非线性规划)来求解,因此只告诉我们

找到的是局部最优解(为什么LINGO不将它作为PIQP(纯整数二次规划)来求解?本人也不明白)。

你还可以选择运行菜单命令―WINDOW|StatusWindow‖看到图8所示的状态窗口(这时我们已经

把该规划模型保存到了文件IQP0302B.LG4中,所以这个名字现在也出现在了状态窗口中),从中

可以看到目前为止找到的最正确目标值―BestObj‖与问题的上界―ObjBound‖已经是一样的,当前解的最大利润与这两个值十分接近,估计是计算误差引起的差异。实际上,假使采用全局最优求解

程序(我们将在后面介绍―LINGO|Options‖菜单命令时介绍如何激活全局最优求解程序),可以验

证它就是全局最优解。图8

6

Page7在本节的最终,我们对LINGO的基本用法指出几点本卷须知:

1)变量和行名可以超过8个字符,但不能超过32个字符,且必需以字母开头。

2)与LINDO一致,用LINGO解规划时已假定各变量非负(除非用限定变量取值范围的函数@free

或@sub或@slb另行说明)。

3)与LINDO不同,变量可以放在约束条件的右端(同时数字也可放在约束条件的左端)。但为

了提高LINGO求解时的效率,应尽可能采用线性表达式定义目标和约束(假使可能)。

3.3在LINGO中使用集合

3.3.1集合的基本用法

我们前面说过,LINGO同时也是优化问题的一种建模语言。有了它,使用者可以只用键入一行文字就可以建立起含有大规模变量的目标函数和成千上万条约束。把握这种最优化模型语言是十分

重要的,与LINDO相比,这可使输入较大规模问题的过程得到简化。

理解LINGO建模语言最重要的是理解―集合‖(SET)及其―属性‖(Attribute)的概念。什么是集合呢?我们通过下面的一个简单例子开始来进行介绍。

例:SAILCO公司需要决定下四个季度的帆船生产量。下四个季度的帆船需求量分别是40条,60条,75条,25条,这些需求必需按时满足。每个季度正常的生产能力是40条帆船,每条船的

生产费用为400美元。假使加班生产,每条船的生产费用为450美元。每个季度末,每条船的库

存费用为20美元。假定生产提前期为0,初始库存为10条船。如何安排生产可使总费用最小?我们用DEM,RP,OP,INV分别表示需求、正常生产的产量、加班生产的产量、库存量,则DEM,RP,OP,INV对每个季度都应当有一个对应的值,也就说他们都应当是一个由4个元素组成的

数组,其中DEM是已知的,而RP,OP,INV是未知数。现在我们可以写出这个问题的模型。首先,

目标函数是所有费用的和:MIN

=

++

4,3,2,1

)}(20)(450

)(400{

I

IINVIOPIRP

约束条件主要有两个:1)能力限制:RP(I)1;―#GT#‖是规律运算符号,意思是―大于‖(其他规律运算符将在本章后面3.4节介绍)。

8

Page9现在运行菜单命令―LINGO|Solve‖,则可以得到图11所示的解答报告,全局最优解RP=(40,40,40,25),OP=(0,10,35,0),最小成本=78450。这就是我们模型的计算结果。图11

一般来说,LINGO中建立的优化模型由四个部分组成,或称为四―段‖(SECTION):(1)集合段(SETS):这部分要以SETS:开始,以ENDSETS终止,作用在于定义必要的集合变量(SET)及其元素(MEMBER,含义类似于数组的下标)和属性(ATTRIBUTE,含义类似

于数组)。如上例中定义了集合quarters(含义是季节),这里它包含四个元素即四个季节指标(1,2,3,4),每个季节都有需求(DEM)、正常生产量(RP)、加班生产量(OP)、库存量(INV)等属性(相当于数组,数组下标由quarters元素决定)。一旦这样的定义建立起来,假使quarters的数量不是4而是1000,只需扩展其元素为1,2,...,1000,每个季节依旧都有DEM,RP,OP,INV这样的属性(这些量的具体数值假使是常量,则可在数据段输入;假使是未知数,则可在初始段输

入初值)。自然,当quarters的数量不是4而是1000时,我们也没有必要把1,2,...,1000全部一个一个列出来,而是可以如下定义quarters集合:quarters/1..1000/:DEM,RP,OP,INV;

即―1..1000‖的意识就是从1到1000的所有整数(我们的例子中只有4个元素,所以没有写成―1..4‖而是全部列出来了)。

(2)目标与约束段:这部分实际上定义了目标函数,约束条件等。一般要用到LINGO的内部函数,可在具体使用中体会其功能和用法(详见3.5节)。上例中定义的目标函数与quarters的

9

Page10元素数目是4或1000并无具体的关系。约束的表示也类似。

(3)数据段(DATA):这部分要以DATA:开始,以ENDDATA终止,作用在于对集合的属

性(数组)输入必要的常数数据。格式为:attribute=value_list。常数值列表(value_list)中数据之间可以用逗号―,‖分开,也可以用空格分开(回车的作用也等价于一个空格),如上面对DEM的赋值也可以写成―DEM=40607525‖。

在LINGO模型中,假使想在运行时才对参数赋值,可以在数据段使用输入语句。但这仅用于对单个变量赋值,而不能用于属性变量(数组),输入语句格式为:―变量名=?;‖。例如,上面的例子中假使需要在求解模型时才给出初始库存量(记为A),则可以在模型中数据段写上―A

=?;‖语句,在求解时LINDO系统给出提醒界面,等待用户输入变量A的数值。(4)初始段(INIT):这部分要以INIT:开始,以ENDINIT终止,作用在于对集合的属性(数组)定义迭代初值,假使有一个接近最优解的初值,对LINGO求解模型是有帮助的。格式

为:attribute=value_list;上例中没有初始化部分,我们将在下一个例子中举例说明。实际上,LINGO模型在求解时也是要展开成与LINDO模型类似的形式的。选择菜单命令―LINGO|Generate|Displymodel‖(Ctrl+G),可以得到展开形式的模型如图12所示,这与我们在LINDO下的模型输入形式很类似,只是在LINDO中不允许有这种数组形式的变量。注意:

假使目标或约束中有非线性变量项,对应的非线性变量前的系数将以问号(―?‖)显示。图12

3.3.2基本集合与派生集合

我们下面再用LINGO来解在第一章1.5节中介绍的如下料场选址问题:

某公司有6个建筑工地要开工,每个工地的位置(用平面坐标a,b表示,距离单位:公里)及水泥日用量d(吨)由表3给出。目前有两个临时料场位于P(5,1),Q(2,7),日储量各有20吨。

假设从料场到工地之间均有直线道路相连,试制定每天的供应计划,即从A,B两料场分别向各工地

运输多少吨水泥,使总的吨公里数最小。为了进一步减少吨公里数,计划舍弃两个临时料场,改建

两个新的,日储量仍各为20吨,问应建在何处,节省的吨公里数有多大。123456a1.258.750.55.7537.25b

1.250.754.7556.57.75d3547611

表3工地的位置(a,b)及水泥日用量d

10

Page11记工地的位置为,水泥日用量为

),(

ii

ba6,1,L=id

i

;料场位置为,日储量为;从料场

),(

jj

yx

2,1,=je

j

j

向工地的运输量为

。这个优化问题的数学规划模型是:

i

ij

c

22

2

1

6

1

)()(min

ij

i

j

j

i

ij

byaxcf?+?=

∑∑

=

=

s.t.

6,1,

21

L==

=

idc

ij

ij

2,1,

61

=≤

=

jec

ji

ij

当使用现有临时料场时,决策变量只有

,是LP模型;当为新建料场选址时决策变量为和

,由于目标函数对

是非线性的,所以在新建料场时是NLP模型。我们现在先解NLP模型,而把现有临时料场的位置作为初始解告诉LINGO。

ij

c

ij

c

jj

y

x,f

jj

yx,

输入后的程序如图13所示。我们在集合段定义了三个集合,其中DEMAND和SUPPLY集合

的及其属性的含义与上一个例子类似,而LINK则是在前两个集合的基础上定义的一个集合。LINK

中的元素就是DEMAND和SUPPLY的笛卡儿积,也就是LINK={(S,T)|S

DEMAND,T

SUPPLY}

因此,其属性C也就是一个6*2的矩阵(或数组)。正是由于这种表示方式,LINGO建模语言也称

为矩阵生成器(MATRIXGENERATOR)。DEMAND和SUPPLY这种直接把元素列举出来的集合,

称为基本集合(primaryset,也可译为―原始集合‖),而把LINK这种基于基本集合构造的集合称

为派生集合(derivedset,也可译为―导出集合‖)。图13

11

Page12本模型中包括了初始段,请特别注意其中―XY=5,1,2,7;‖语句的实际赋值顺序是X=(5,2),Y=(1,7),而不是X=(5,1),Y=(2,7)。也就是说,LINGO对数据是按列赋值的,而不是按行。当然,

你直接写成两个语句―X=5,2;Y=1,7;‖也是等价的。同样道理,数据段中对常数数组A,B的赋

值语句也可以写成

A,B=1.251.258.750.750.54.755.75536.57.257.75;请注意我们前面说过,这时空格与逗号―,‖或―回车‖的作用是等价的。

由于新建料场的位置可以是任意的,所以我们在约束的最终(模型最终的END上面一行)用@free函数取消了变量X、Y非负限制。此外,我们用TITLE语句对这个模型取了一个标题―LOCATIONPROBLEM‖(见模型开始的―MODEL:‖下面一行);并且对目标行([OBJ])和两类约束(DEMAND_CON、SUPPLY_CON)分别进行了命名(请特别注意这里约束命名的特点)。大家细心阅读、理解了图13的程序后,现在就可以运行菜单命令―LINGO|Solve‖,很快得到解答报告(显示界面略,请特别注意结果中约束名称也是有下标的):局部最优解X(1)=7.249997,

X(2)=5.695940,Y(1)=7.749998,Y(2)=4.928524,C(略),最小运量=89.8835(吨公里)。

现在我们来看看对于这个问题的NLP模型,最小运量89.8835是不是全局最优。我们考虑用全局最优求解程序(我们将在后面介绍―LINGO|Options‖菜单命令时介绍如何激活全局最优求解程

序),解图13中的模型。全局最优求解程序花费的时间可能是很长的,所以为了减少计算工作量,

我们对X,Y的取值再做一些限制。虽然新建料场的位置可以是任意的,但我们可以很直观地想到,

最正确的料场位置不应当离工地太远,无论如何至少不应当超出现在6个工地所决定的坐标的最大、

最小值决定的矩形之外,即:0.52016

图16

从图14可以看出,此时目标函数值的下界(ObjBound=85.2638)与目前得到的最好的可行解的目标函数值(BestObj=85.2661)相差已经十分小,可以认为已经得到了全局最优解。部分结果

见图15,这就可以认为是我们模型的最终结果。在图16中,我们可以画出料场和工地的位置示意

图,其中标有―*‖号的是料场,标有―+‖号的是工地。

我们还可以指出:假使要把料厂P(5,1),Q(2,7)的位置看成是已知并且固定的,这时是LP模型。只需要在图13中把初始段的―XY=5,1,2,7;‖语句移到数据段就可以了。此时,运行结果告

诉我们得到全局最优解(变量C的取值这里略去),最小运量136.2275(吨公里)。

13

Page143.3.3稠密集合与稀疏集合

上节我们介绍了在LINGO中可以定义和使用两类集合:基本集合和派生集合。前面的例子中我们把派生集合MATCH的元素定义为DEMAND和SUPPLY的笛卡儿积,这种派生集合称为稠密

集合(简称稠集)。其实在LINGO中,派生集合的元素可以只是这个笛卡儿积的一个真子集合,

这种派生集合称为稀疏集合(简称疏集)。下面我们通过一个例子来说明。

最短路问题在纵横交织的马路网中,货车司机希望找到一条从一个城市到另一个城市的最短路.假设图17表示的是该马路网,节点表示货车可以停靠的城市,弧上的权表示两个城市之间的距

离(百公里).那么,货车从城市S出发到达城市T,如何选择行驶路线,使所经过的路程最短?A

1

6665B

1

C

1

587S3A

2

T6837B

2

C

2

6A

3

49

图17最短路问题的例子

假设从S到T的最优行驶路线P经过城市C

1

,则P中从S到C

1

的子路也一定是从S到C

1

的最优行

驶路线;假设P经过城市C

2

,则P中从S到C

2

的子路也一定是从S到C

2

的最优行驶路线.因此,为了

得到从S到T的最优行驶路线,我们只需要先求出从S到C

k

(k=1,2)的最优行驶路线,就可以便利地得

到从S到T的最优行驶路线.同样,为了求出从S到C

k

(k=1,2)的最优行驶路线,只需要先求出从S到B

j

(j=1,2)的最优行驶路线;为了求出从S到B

j

(j=1,2)的最优行驶路线,只需要先求出从S到A

i

(i=1,2,3)

的最优行驶路线.而S到A

i

(i=1,2,3)的最优行驶路线是很简单得到的(实际上,此例中S到A

i

(i=1,2,3)只有唯一的道路).

也就是说,此例中我们可以把从S到T的行驶过程分成4个阶段,即S→A

i

(i=1,2或3),A

i

→B

j

(j=1或2),B

j

→C

k

(k=1或2),C

k

→T.记d(Y,X)为城市Y与城市X之间的直接距离(若这两个城市之间没

有道路直接相连,则可以认为直接距离为无穷大),用L(X)表示城市S到城市X的最优行驶路线的路长,则:L(S)=0;

SXXYdYLXL

XY

≠+=

)},,()({min

)(

对本例的具体问题,可以直接计算如下:L(A

1

)=6,L(A

2

)=3,L(A

3

)=3;L(B

1

)=min{L(A

1

)+6,L(A

2

)+8,L(A

3

)+7}=10=L(A

3

)+7,L(B

2

)=min{L(A

1

)+5,L(A

2

)+6,L(A

3

)+4}=7=L(A

3

)+4;L(C

1

)=min{L(B

1

)+6,L(B

2

)+8}=15=L(B

2

)+8,L(C

2

)=min{L(B

1

)+7,L(B

2

)+9}=16=L(B

2

)+9;

L(T)=min{L(C

1

)+5,L(C

2

)+6}=20=L(C

1

)+5.

所以,从S到T的最优行驶路线的路长为20.进一步分析以上求解过程,可以得到从S到T的最优

行驶路线为S→A

3

→B

2

→C

1

→T.

上面这种计算方法在数学上称为动态规划(DynamicProgramming).动态规划也是最优化的一个分之。

作为一个例子,我们用LINGO来解这个最短路问题。我们可以编写如图18的LINGO程序。集合段定义的CITIES是一个基本集合(元素通过枚举给出),L是其对应的属性变量(我们要求的

最短路长);ROADS是由CITIES导出的一个派生集合(请特别注意其用法),由于只有一部分城市

之间有道路相连,所以我们进一步将其元素通过枚举给出,这就是一个稀疏集合。D是ROADS对

应的属性变量(给定的距离)。

14

Page15图18

从模型中还可以看出:这个LINGO程序可以没有目标函数,这在LINGO中是允许的,可以用

来找可行解(解方程组和不等式组)。此外,在数据段我们对L进行了赋值,但只有L(S)=0是已

知的,所以后面的值为空(但位置必需留出来,即逗号―,‖一个也不能少,否则会出错)。假使这

个语句直接写成―L=0;‖,语法上看也是对的,但其含义是L所有元素的取值全部为0,所以也会

与题意不符。

运行时间(秒)

求解一个模型时,允许的最大运行时间(缺省值为无限)DualComputations(对偶计算)

求解时控制对偶计算的级别,有三种可能的设置:None:不计算任何对偶信息;Prices:计算对偶价格(缺省设置);

PricesandRanges:计算对偶价格并分析敏感性。

28

Page29ModelRegeneration(模型的重新生成)

控制重新生成模型的频率,有三种可能的设置:Onlywhentextchanges:只有当模型的文本修改后才再生成模型;

Whentextchangesorwithexternal

references:当模型的文本修改或模型含有外部引用时(缺省设置);Always:每当有需要时。Linearization(线性化)Degree(线性化程度)

决定求解模型时线性化的程度,有四种可能的设置:SolverDecides:若变量数小于等于12个,则尽可能全部线性化;否则不做任何线性化(缺省设置)None:不做任何线性化

Low:对函数@ABS(),@MAX(),@MIN(),@SMAX(),@SMIN(),以及二进制变量与连续变量的乘积项做线性化

High:同上,此外对规律运算符#LE#,#EQ#,#GE#,#NE#做线性化BigM(线性化的大M系数)

设置线性化的大M系数(缺省值为10

6

)。

Delta(线性化的误差限)

设置线性化的误差限(缺省值为10

-6

)。

AllowUnrestrictedUseof

PrimitiveSetMemberNames(允许无限制地使用基本集合的成员名)

选择该选项可以保持与LINGO4.0以前的版本兼容:即允许使用基本集合的成员名称直接作为该成员在该集合的索引值(LINGO4.0以后的版本要求使用@INDEX函数)。CheckforDuplicateNamesinDataandModel(检查数据和模型中的名称是否重复使用)

选择该选项,LINGO将检查数据和模型中的名称是否重复使用,如基本集合的成员名是否与决策变量名重复。UseR/CformatnamesforMPSI/O(在MPS文件格式的输入输出中使用R/C格式的名称)

在MPS文件格式的输入输出中,将变量和行名转换为R/C格式表??

3)LinearSolver(线性求解程序)选项卡

界面见图??。可以控制的参数和选项的含义见表??。

29

Page30图??选项组选项含义Method求解方法

求解时的算法,有四种可能的设置:

SolverDecides:LINGO自动选择算法(缺省设置)PrimalSimplex:原始单纯形法DualSimplex:对偶单纯形法Barrier:障碍法(即内点法)InitialLinearFeasibilityTol.初始线性可行性误差限

控制线性模型中约束满足的初始误差限(缺省值为3*10

-6

).

FinalLinearFeasibilityTol.最终线性可行性误差限

控制线性模型中约束满足的最终误差限(缺省值为10

-7

).

ModelReduction

模型降维

控制是否检查模型中的无关变量,从而降低模型的规模:Off:不检查On:检查

SolverDecides:LINGO自动决定(缺省设置)PricingStrategies价格策略(决定出基变量的策略)PrimalSolver原始单纯形法有三种可能的设置:

SolverDecides:LINGO自动决定(缺省设置)Partial:LINGO对一部分可能的出基变量进行尝试Devex:用Steepest-Edge(最陡边)近似算法对所有可能的变量进行尝试,找到使目标值下降最多的出基变量DualSolver

有三种可能的设置:

SolverDecides:LINGO自动决定(缺省设置)

30

Page31对偶单纯形法

Dantzig:按最大下降

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论