LING0软件的使用方法.docx
- 文档编号:7518369
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:27
- 大小:701.95KB
LING0软件的使用方法.docx
《LING0软件的使用方法.docx》由会员分享,可在线阅读,更多相关《LING0软件的使用方法.docx(27页珍藏版)》请在冰豆网上搜索。
LING0软件的使用方法
LINGO应用基础教程
§1LINGO软件的主要特色
LINGO8.0forWindows软件比以前的版本有了很大的改进,功能大大增强,性能更加稳定,解答结果更加可靠。
LINGO软件主要有两大优点:
1、除具有LINDO的全部功能外,还可用于求解非线性规划问题,包括非线性整数规划问题。
2、LINGO包含了内置的建模语言,允许以简练、直观的方式描述较大规模的优化问题,模型中所需的数据可以以一定格式保存在独立的文件中。
§2初识LINGO
在Windows操作系统下双击LINGO图标,启动LINGO软件,屏幕上首先显示的就是模型窗口,也就是用于输入优化模型的窗口。
[例1]作为一个最简单的例子,我们输入:
MAXf=2*x+3*Y;
s.t.4*x+3*y<10;
3*x+5*y<12;
把它存入了一个名为ex_1.lg4的模型文件中(后缀名为lg4)。
然后选择菜单命令“LINGO|Solve”对该模型进行求解。
求解时,LINGO先对模型进行编译,模型编译没有发现语法错误才开始求解,求解结果在报告窗口中显示。
我们还可以把结果报告保存在文件中(后缀名为lgr)。
下面对报告窗口中显示的内容给出相应的解释。
右边的5个框分别给出变量数量(其中包括变量总数、非线性变量数、整数变量数)、约束数量(约束总数、非线性约束个数)、非零系数数量(总数、非线性项的个数)、内存使用量、求解花费的时间。
需要注意的是,凡是可以从一个约束直接解出变量取值时,这个变量就不认为是决策变量而是固定变量,不列入统计中;只含有固定变量的约束也不列入约束统计中。
左边的两个框中内容,左上角是求解器状态框(SolverStatus),含义见表1
表1
域名
含义
可能的显示
ModelClass
当前模型的类型
LP,QP,ILP,IQP,PILP,PIQP,NLP,INLP,PINLP(以I开头表示IP,以PI开头表示PIP)
State
当前解的状态
"GlobalOptimum","LocalOptimum","Feasible","Infeasible"(不可行),"Unbounded"(无界),"Interrupted"(中断),"Undetermined"(未确定)
Objective
当前解的目标函数值
实数
Infeasibility
当前约束不满足的总量(不是不满足的约束的个数)
实数(即使该值=0,当前解也可能不可行,因为这个量中没有考虑用上下界形式给出的约束)
Iterations
目前为止的迭代次数
非负整数
左下角是扩展的求解器状态框(ExtendedSolverStatus),含义见表2。
表2
域名
含义
可能的显示
SolverType
使用的特殊求解程序
B-and-B(分枝定界算法)
Global(全局最优求解程序)
Multistart{用多个初始点求解的程序)
BestObj
目前为止找到的可行解的最佳目标函数值
实数
ObjBound
目标函数值的界
实数
Steps
特殊求解程序当前运行步数:
分枝数(对B-and-B程序);
子问题数(对Global程序);
初始点数(对Multistart程序)
非负整数
Active
有效步数
非负整数
[例2]作为一个例子,我们再来解一个二次规划问题:
该模型输入模型窗口后的形式如下:
xl+x2<100;
max=98*xl+277*x2-xl^2-0.3*xl*x2-2*x2^2;
x1<=2*x2;
@gin(xl);@gin(x2);
现在运行菜单命令“LINGO|Solve”,则可以得到解答报告,最优整数解X=(35,65),最大利润=11077.5。
此外,LINGO是将它作为PINLP(纯整数非线性规划)来求解,因此只告诉我们找到的是局部最优解。
你还可以选择运行菜单命令“WINDOW|StatusWindow”看到状态窗口(这时我们已经把该规划模型保存到了文件ex_2.lg4中,所以这个名字现在也出现在状态窗口中),从中可以看到目前为止找到的最佳目标值“BestObj”与问题的上界“ObjBound”已经是一样的,当前解的最大利润与这两个值非常接近,估计是计算误差引起的差异。
最后,我们对LINGO的基本用法指出几点注意事项:
1)变量和行名不能超过32个字符,且必须以字母开头。
2)LINGO解规划时已假定各变量非负(除非用限定变量取值范围的函数@free或@sub或@slb另行说明)。
3)变量可以放在约束条件的右端,数字也可放在约束条件的左端。
4)为了提高LINGO求解时的效率,应尽可能采用线性表达式定义目标和约束(如果可能)。
§3在LINGO中使用集合
3.1集合的基本用法
LINGO是优化问题的一种建模语言,使用者可以只用键入一行文字就建立起含有大规模变量的目标函数和成千上万条约束,可使输入问题的过程得到简化。
理解LINGO建模语言最重要的是理解“集合”(SET)及其“属性”(Attribore)的概念。
什么是集合呢?
我们通过下面的一个简单例子开始来进行介绍。
[例3]SAILCO公司需要决定下四个季度的帆船生产量。
下四个季度的帆船需求量分别是40条,60条,75条,25条,这些需求必须按时满足。
每个季度正常的生产能力是40条帆船,每条船的生产费用为400美元。
如果加班生产,每条船的生产费用为450美元。
每个季度末,每条船的库存费用为20美元。
假定生产提前期为0,初始库存为10条船。
如何安排生产可使总费用最小?
我们用DEM,RP,OP,INV分别表示需求、正常生产的产量、加班生产的产量、库存量,则DEM,RP,OP,INV对每个季度都应该有一个对应的值,也就说他们都应该是一个由4个元素组成的数组,其中DEM是已知的,而RP,OP,INV是未知数。
现在我们可以写出这个问题的模型。
首先,目标函数是所有费用的和:
约束条件主要有两个:
1)能力限制:
RP(I)<40,I=l,2,3,4;
2)产品数量的平衡方程:
INV(I)=INV(I-1)+RP(I)+OP(I)-DEM(I),I=l,2,3,4;
INV(0)=10;
当然,还要加上变量的非负约束,构成了这个问题的模型(可以看出是LP模型)。
如果没有数组这样的数据结构,我们只能对每个季度分别定义变量,如正常产量就要有4个变量RPl,RP2,RP3,RP4等;对未知数OP,INV也是一样。
这样,写起来就非常麻烦,尤其变量个数更多的时候。
而利用数组的概念,这个模型就比较容易建立了。
记四个季度组成的集合QUARTERS={l,2,3,4},它们就是上面数组的下标集合,而数组DEM,RP,OP,INV对集合QUARTERS中的每个元素1,2,3,4分别对应于一个值。
LINGO正是充分利用了这种数组及其下标的关系,引入了“集合”及其“属性”的概念,把QUARTERS={1,2,3,4}称为集合,把DEM,RP,OP,INV称为该集合的属性。
该LP模型在LINGO中的一个典型输入方式如下:
MODEL:
SETS:
QUARTERS/1,2,3,4/:
DEM,RP,OP,INV;
ENDSETS
MIN=@SUM(QUARTERS:
400*RP+450*OP+20*INV);
@FOR(QUARTERS(I):
RP(I)<40);
@FOR(QUARTERS(I)|I#GT#1:
INV(I)=INV(I-1)+RP(I)+OP(I)-DEM(I););
INV
(1)=10+RP
(1)+OP
(1)-DEM
(1);
DATA:
DEM=40,60,75,25;
ENDDATA
END
我们可以看到这个输入以“MODEL:
”开始,以“END”结束,它们之间由语句组成,可以分成三个部分:
前一部分(从“SETS:
”到“ENDSETS”)是定义集合及其属性,后一部分(从“DATA:
”到“ENDDATA”)是给出常量DEM的值,中间部分给出优化目标和约束。
目标函数是用求和函数“@SUM(集合:
表达式)”的方式定义的,这个函数的功能是对冒号“:
”后面的表达式,按照冒号“:
”前面的下标集合指定的下标进行求和。
由于本例中目标函数对所有下标都要求和,所以我们连下标i也省去了;如果不省略,目标函数也可以等价地写成:
@SUN(QUARTERS(i):
400*RP(i)+450*OP(i)+20*INV(i)
约束是用循环函数“@FOR(集合:
约束关系式)”的方式定义的,意思是对冒号“:
”前面的集合的每个元素(下标),冒号“:
”后面的约束关系式都要成立。
由于下标i=l时的约束关系式与i=2,3,4时有所区别,所以对下标集合的元素(下标)加了一个“i#GT#1”的限制条件,而把i=l时的约束关系式单独写出。
限制条件“i#GT#1”是一个逻辑表达式,意思就是i>l;(“#GT#”是逻辑运算符号,意思是“大于”,其他逻辑运算符将在后面介绍)。
现在运行菜单命令“LINGO|Solve”,则可以得到解答报告,全局最优解RP=(40,40,40,25),OP=(0,10,35,0),最小成本=78450。
这就是我们模型的计算结果。
一般来说,LINGO中建立的优化模型由四个部分组成,或称为四“段”(SECTION):
(1)集合段(SETS):
这部分要以SETS:
开始,以ENDSETS结束,作用是定义必要的集合变量(SET)及其元素(MEMBER,含义类似于数组的下标)和属性(ATTRIBUTE,含义类似于数组)。
如上例中定义了集合quarters(含义是季节),这里它包含四个元素即四个季节指标(1,2,3,4),每个季节都有需求(DEM)、正常生产量(RP)、加班生产量(OP)、库存量(1NV)等属性(相当于数组,数组下标由quarters元素决定)。
一旦这样的定义建立起来,如果quarters的数量不是4而是1000,只需扩展其元素为1,2,….,1000,每个季节仍然都有DEM,RP,OP,INV这样的属性(这些量的具体数值如果是常量,则可在数据段输入:
如果是未知数,则可在初始段输入初值)。
自然,当quarters的数量不是4而是1000时,我们也没有必要枚举,而是可以如下定义quarters集合:
quarters/1..1000/:
DEN,RP,OP,INV:
:
“1..1000”的意识就是从1到1000的所有整数。
(2)目标与约束段:
这部分实际上定义了目标函数,约束条件等。
一般要用到LINGO的内部函数,可在具体使用中体会其功能和用法(详见.§5节)。
上例中定义的目标函数与quarters的元素数目是4或1000并无具体的关系。
约束的表示也类似。
(3)数据段(DATA):
这部分要以DATA:
开始,以ENDDATA结束,作用是对集合的属性(数组)输入必要的常数数据。
格式为:
attribute=value_list。
常数值列表(vatue_list)中数据之间可以用逗号“,”分开,也可以用空格分开(回车的作用也等价于一个空格),如上面对DEM的赋值也可以写成“DEM:
40607525”。
在LINGO模型中,如果想在运行时才对参数赋值,可以在数据段使用输入语句。
但这仅用于对单个变量赋值,而不能用于属性变量(数组),输入语句格式为:
“变量名:
?
;”。
例如,上面的例子中如果需要在求解模型时才给出初始库存量(记为A),则可以在模型中数据段写上“A=?
;”语句,在求解时,LINDO系统会给出提示界面,等待用户输入变量A的数值。
(4)初始段(INIT):
这部分要以INIT:
开始,以ENDINIT结束,作用是对集合的属性(数组)定义迭代初值,如果有一个接近最优解的初值,对LINGO求解模型是有帮助的。
格式为:
attribute=value_1ist;上例中没有初始化部分,我们将在下一个例子中举例说明。
3.2基本集合与派生集合
我们用LINGO来解如下料场选址问题,并由此说明基本集合与派生集合。
[例4]某公司有6个建筑工地要开工,每个工地的位置(用平面坐标系a,b表示,距离单位:
千米)及水泥日用量d(吨)由下表给出。
工地位置(a,b)及水泥日用量d
1
2
3
4
5
6
a
1.25
8.75
0.5
5.75
3
7.25
b
1.25
0.75
4.75
5
6.5
7.25
d
3
5
4
7
6
11
目前有两个临时料场位于A(5,1),B(2,7),日储量各有20吨。
假设从料场到工地之间均有直线道路相连。
(1)试制定每天的供应计划,即从A,B两料场分别向各工地运送多少吨水泥,使总的吨千米数最小。
(2)为了进一步减少吨千米数,打算舍弃两个临时料场,改建两个新的,日储量各为20吨,问应建在何处,节省的吨千米数有多大?
可建立数学模型如下:
当使用现有临时料场时,决策变量只有cij,是LP模型;当为新建料场选址时决策变量为cij和xj,yj,由于目标函数f对xj,yj是非线性的,所以在新建料场时是NLP模型。
我们现在先解NLP模型,而把现有临时料场的位置作为初始解告诉LINGO。
程序输入如下:
MODEL:
TitleLocationProblem;
sets:
demand/1..6/:
a,b,d;
supply/1..2/:
x,y,e;
link(demand,supply):
c;
endsets
data:
!
locationsforthedemand(需求点的位置);
a=1.25,8.75,0.5,5.75,3,7.25;
b=1.25,0.75,4.75,5,6.5,7.75;
!
quantitiesofthedemandandsupply(供需量);
d=3,5,4,7,6,11;e=20,20;
x,y=5,1,2,7;
enddata
init:
!
initiallocationsforthesupply(初始点);
!
x,y=4,5,7,5;
endinit
!
Objectivefunction(目标);
[OBJ]min=@sum(link(i,j):
c(i,j)*((x(j)-a(i))^2+(y(j)-b(i))^2)^(1/2));
!
demandconstraints(需求约束);
@for(demand(i):
[DEMAND_CON]
@sum(supply(j):
c(i,j))=d(i););
!
supplyconstraints(供应约束);
@for(supply(i):
[SUPPLY_CON]
@sum(demand(j):
c(j,i))<=e(i););
!
@for(supply:
@free(X);@free(Y););
@for(supply:
@bnd(0.5,X,8.75);
@bnd(0.75,Y,7.75);
!
);
END
我们在集合段定义了三个集合,其中DEMAND和SUPPLY集合的及其属性的含义与上一个例子类似,而LINK则是在前两个集合的基础上定义的一个集合。
LINK中的元素就是DEMAND和SUPPLY的笛卡儿积,也就是
LINK={(S,T)|S
DEMAND,T
SUPPLY}
因此,其属性C也就是一个6*2的矩阵(或数组)。
正是由于这种表示方式,LINGO建模语言也称为矩阵生成器(MATRIXGENERATOR)。
DEMAND和SUPPLY这种直接把元素列举出来的集合,称为基本集合(primaryset,也可译为“原始集合”),而把LINK这种基于基本集合构造的集合称为派生集合(derivedset,也可译为“导出集合”)。
本模型中包括了初始段,请特别注意其中“X,Y=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;
请注意我们前面说过,这时空格与逗号“,”或“回车”的作用是等价的。
由于新建料场的位置可以是任意的,所以我们在约束的最后用@free函数取消了变量X、Y非负限制。
此外,我们用TITLE语句对这个模型取了一个标题“LOCATIONPROBLEM”;并且对目标行([OBJ])和两类约束(DEMANDCON、SUPPLYCON)分别进行了命名(请特别注意这里约束命名的特点)。
我们还指出:
如果要把料厂P(5,1),Q(2,7)的位置看成是已知并且固定的,这时是LP模型。
只需要在程序中把初始段的“X,Y=5,1,2,7;”语句移到数据段就可以了。
此时,运行结果告诉我们得到全局最优解(变量C的取值这里略去),最小运量136.275(吨公里)。
3.3稠密集合与稀疏集合
前面的例子中我们把派生集合MATCH的元素定义为DEMAND和SUPPLY的笛卡儿积,这种派生集合称为稠密集合(简称稠集)。
其实在LINGO中,派生集合的元素可以只是这个笛卡儿积的一个真子集合,这种派生集合称为稀疏集合(简称疏集)。
下面我们通过一个例子来说明。
[例5]最短路问题:
在复杂的公路网中,货车司机希望找到一条从一个城市到另一个城市的最短路.假设下图表示的是该公路网,节点表示货车可以停靠的城市,弧上的权表示两个城市之间的距离(单位:
百公里)。
货车从城市S出发到达城市T,如何选择行驶路线,使所经过的路程最短?
假设从S到T的最优行驶路线P经过城市C1,则P中从S到C1的子路也一定是从S到C1的最优行驶路线;假设P经过城市C2,则P中从S到C2的子路也一定是从S到C2的最优行驶路线.因此,为了得到从S到T的最优行驶路线,我们只需要先求出从S到Ck(k=l,2)的最优行驶路线,就可以方便地得到从S到T的最优行驶路线.同样,为了求出从S到Ck(k=l,2)的最优行驶路线,只需要先求出从S到Bj(j=1,2)的最优行驶路线;为了求出从S到Bj(j=1,2)的最优行驶路线,只需要先求出从S到Ai(i=1,2,3)的最优行驶路线.而S到Ai(i=1,2,3)的最优行驶路线是很容易得到的(实际上,此例中S到Ai(i=1,2,3)只有唯一的道路).
也就是说,此例中我们可以把从S到T的行驶过程分成4个阶段,即S
Ai(i=l,2或3),Ai
Bj(j=l或2),Bj
Ck(k=l或2),Ck
T.记d(Y,X)为城市Y与城市X之间的直接距离(若这两个城市之间没有道路直接相连,则可以认为直接距离为无穷大),用L(X)表示城市S到城市X的最优行驶路线的路长,则:
,
,
对本例的具体问题,可以直接计算如下:
所以,从S到T的最优行驶路线的路长为20.进一步分析以上求解过程,可知从S到T的最优行驶路线为S
A3
B2
C1
T.,这种方法称为动态规划(DynamicProgramming)。
我们用LINGO来解这个最短路问题。
编写如程序如下:
MODEL:
SETS:
CITIES/S,A1,A2,A3,B1,B2,C1,C2,T/:
L;
!
属性L(i)表示城市S到城市i的最优行驶路线的路长;
ROADS(CITIES,CITIES)/
!
派生集台ROADS表示的是网络中的道路(弧);
S,A1S,A2S,A3!
由于并非所有城市间都有道路直接连接,所以将弧具体列出;
A1,B1A1,B2A2,B1A2,B2A3,B1A3,B2
B1,C1B1,C2B2,C1B2,C2
C1,TC2,T/:
D;!
属性D(i,j)是城市i到j的直接距离(已知);
ENDSETS
DATA:
D=633
658674
6789
56;
L=0,,,,,,,,;!
因为L(S)=0;
ENDDATA
@FOR(CITIES(i)|i#GT#@index(S):
!
这行中"@index(S)"可以直接写成"1";
L(i)=@MIN(ROADS(j,i):
L(j)+D(j,i)););
END
集合段定义的CITIES是一个基本集合(元素通过枚举给出),L是其对应的属性变量(我们要求的最短路长),ROADS是由CITIES导出的一个派生集合(请特别注意其用法),由于只有一部分城市之间有道路相连,所以我们进一步将其元素通过枚举给出,这就是一个稀疏集合。
D是ROADS对应的属性变量(给定的距离)。
从模型中还可以看出,LINGO程序可以没有目标函数。
这可以用来找可行解(解方程组和不等式组)。
此外,在数据段我们对L进行了赋值,但只有L(S)=0是已知的,所以后面的值为空,但位置必须留出来,即逗号“,”一个也不能少,否则会出错。
如果这个语句直接写成“L=0;”,语法上看也是对的,但其含义是L所有元素的取值全部为0,与题意不符。
从这个例子还可以看出,虽然集合CITIES中的元素不是数字,但当它以CITIES(I)的形式出现在循环中时,引用下标I却实际上是正整数,也就是说I指的正是元素在集合中的位置(顺序),一般称为元素的索引(1NDEX)。
我们在@for循环中特意用了一个函数“@index",其作用是返回一个元素在集合中的索引值,这里@index(S)=1,所以逻辑关系式“I#GT#@index(S)”可以直接等价地写成“I#GT#1”。
这里@index(S)实际上还是(@index(CITtES,S)的简写,即返回S在集合CITIES中的索引值。
运行以上程序得到结果,可以看出,从S到T的最优行驶路线的路长为20。
进一步分析,可以得到从S到T的最优行驶路线为S
A3
B2
C1
T.。
上面这个例子中定义稀疏集合ROADS的方法是将其元素通过枚举给出,有时会很麻烦,用起来不方便。
LINGO提供了另一种定义稀疏集合的方法,这就是“元素过滤”法,能够从构成派生集合的父集合的笛卡儿积中系统地过滤下来一些真正的元素。
请看下面的例子。
[例6]某班8名同学准备分成4个调查队(每队两人)前往4个地区进行社会调查。
假设这8名同学两两之间组队的效率如表所示(由于对称性,只需列出上三角部分),问如何组队,可以使总效率最高?
这是一个典型的匹配(MATCHING)问题。
把上面的效率矩阵记为BENEFIT,用MATCH(Si,Sj)=1表示同学Si与Sj组成一队,而0表示不组队。
由于对称性,只需考i 显然,目标函数为BENEFIT(Si,Sj)*MATCH(Si,Sj)之和;约束条件是每个同学只能(而且必须在)某一组,即对于任意i有: 只要MATCH属性的某个下标为i就加起来,此和=1。 显然,这是一个0-1线性规划。 模型输入如下: MODEL: SETS: STUDENTS/S1..S8/; PAIRS(STUDENTS,STUDENTS)|&2#GT#&1: BENEFIT,MATCH; END
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LING0 软件 使用方法
![提示](https://static.bdocx.com/images/bang_tan.gif)