




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、LINGO应用基础教程1 LINGO软件的主要特色LINGO8.0 for Windows软件比以前的版本有了很大的改进,功能大大增强,性能更加稳定,解 答结果更加可靠。LINGO软件主要有两大优点:1、除具有LINDO的全部功能外,还可用于求解非线性规划问题,包括非线性整数规划问题。2、LINGO包含了内置的建模语言,允许以简练、直观的方式描述较大规模的优化问题,模型 中所需的数据可以以一定格式保存在独立的文件中。2 初识 LINGO在Windows操作系统下双击LINGO图标,启动LINGO软件,屏幕上首先显示的就是模型窗口, 也就是用于输入优化模型的窗口。例1 作为一个最简单的例子,我们
2、输入:MAX f=2*x+3*Y;s.t. 4*x+3*y10;3*x+5*y12;把它存入了一个名为ex_1.lg4的模型文件中(后缀名为lg4)。然后选择菜单命令“LINGO|Solve” 对该模型进行求解。求解时,LINGO先对模型进行编译,模型编译没有发现语法错误才开始求解, 求解结果在报告窗口中显示。我们还可以把结果报告保存在文件中(后缀名为lgr)。下面对报告窗口中显示的内容给出相应的解释。右边的5个框分别给出变量数量(其中包括变量 总数、非线性变量数、整数变量数)、约束数量(约束总数、非线性约束个数)、非零系数数量(总数、 非线性项的个数)、内存使用量、求解花费的时间。需要注意的
3、是,凡是可以从一个约束直接解出变 量取值时,这个变量就不认为是决策变量而是固定变量,不列入统计中;只含有固定变量的约束也 不列入约束统计中。左边的两个框中内容,左上角是求解器状态框(SolverStatus),含义见表1域名含义可能的显示ModelClass当前模型的类型LP, QP, ILP, IQP, PILP, PIQP, NLP, INLP,PINLP(以I开头表示IP,以PI开 头表示PIP)State当前解的状态Global Optimum, LocalOptimum”, Feasible”,Infeasible”(不可彳丁), Unbounded、无界),Interrupted(
4、中 断),Undetermined(未确定)Objective当前解的目标函数值实数Infeasibility当前约束不满足的总量 (不是不满足的约束的 个数)实数(即使该值=0,当前解也可能不可行, 因为这个量中没有考虑用上下界形式给 出的约束)Iterations目前为止的迭代次数非负整数左下角是扩展的求解器状态框(ExtendedSolverStatus),含义见表2。表2域名含义可能的显示SolverType使用的特殊求解程序B-and-B(分枝定界算法)Global (全局最优求解程序)Multistart用多个初始点求解的程序)Best Obj目前为止找到的可行解的最佳目标 函数值
5、实数Obj Bound目标函数值的界实数Steps特殊求解程序当前运行步数: 分枝数(对B-and-B程序); 子问题数(对Global程序); 初始点数(对Multistart程序)非负整数Active有效步数非负整数例2作为一个例子,我们再来解一个二次规划问题:Mas 98加-277 x? 一 一 0.3 x x? 一 2a ?s.i. JC - jt; 0为整数该模型输入模型窗口后的形式如下:xl+x2100;max=98*xl+277*x2-xlA2-0.3*xl*x2-2*x2A2;x1=2*x2;gin (xl); gin(x2);现在运行菜单命令“LINGOISolve”,则可以
6、得到解答报告,最优整数解X=(35, 65),最大利润 =11077.5。此外,LINGO是将它作为PINLP(纯整数非线性规划)来求解,因此只告诉我们找到的是 局部最优解。你还可以选择运行菜单命令“WINDOWIStatus Window”看到状态窗口(这时我们已经 把该规划模型保存到了文件ex_2. lg4中,所以这个名字现在也出现在状态窗口中),从中可以看到 目前为止找到的最佳目标值“BestObj”与问题的上界“Obj Bound”已经是一样的,当前解的最大 利润与这两个值非常接近,估计是计算误差引起的差异。最后,我们对LINGO的基本用法指出几点注意事项:1)变量和行名不能超过32个
7、字符,且必须以字母开头。2)LINGO解规划时已假定各变量非负(除非用限定变量取值范围的函数free 或sub或slb 另行说明)。3)变量可以放在约束条件的右端,数字也可放在约束条件的左端。4)为了提高LINGO求解时的效率,应尽可能采用线性表达式定义目标和约束(如果可能)。3在LINGO中使用集合3. 1集合的基本用法LINGO是优化问题的一种建模语言,使用者可以只用键入一行文字就建立起含有大规模变量的 目标函数和成千上万条约束,可使输入问题的过程得到简化。理解LINGO建模语言最重要的是理解“集合”(SET)及其“属性”(Attribore)的概念。什么是集 合呢?我们通过下面的一个简单
8、例子开始来进行介绍。例3 SAILCO公司需要决定下四个季度的帆船生产量。下四个季度的帆船需求量分别是40 条,60条,75条,25条,这些需求必须按时满足。每个季度正常的生产能力是40条帆船,每条船 的生产费用为400美元。如果加班生产,每条船的生产费用为450美元。每个季度末,每条船的库 存费用为20美元。假定生产提前期为0,初始库存为10条船。如何安排生产可使总费用最小?我们用DEM,RP,OP,INV分别表示需求、正常生产的产量、加班生产的产量、库存量,则 DEM,RP,OP,INV对每个季度都应该有一个对应的值,也就说他们都应该是一个由4个元素组 成的数组,其中DEM是已知的,而RP
9、,OP,INV是未知数。现在我们可以写出这个问题的模型。 首先,目标函数是所有费用的和:min Z 400RP(I) + 450OP(I) + 20INV(I)I-1,2,3,4 约束条件主要有两个:能力限制:RP(I)40, I=l, 2, 3, 4;产品数量的平衡方程: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
10、也是一样。这样,写起来就非常麻烦,尤其变量 个数更多的时候。而利用数组的概念,这个模型就比较容易建立了。记四个季度组成的集合QUARTERS=l,2, 3, 4,它们就是上面数组的下标集合,而数组DEM, RP,OP,INV对集合QUARTERS中的每个元素1,2,3,4分别对应于一个值。LINGO正是充分 利用了这种数组及其下标的关系,弓1入了 “集合”及其“属性”的概念,把QUARTERS=1,2, 3, 4称为集合,把DEM,RP,OP,INV称为该集合的属性。该LP模型在LINGO中的一个典型输入 方式如下:MODEL:SETS:QUARTERS/1, 2,3,4/: DEM, RP,
11、 OP, INV;ENDSETSMIN=SUM (QUARTERS: 400* RP+450* OP+20* INV);FOR (QUARTERS (I): RP (I) l; (#GT#”是逻辑运算符 号,意思是“大于”,其他逻辑运算符将在后面介绍)。现在运行菜单命令“LINGO|Solve”,则可以得到解答报告,全局最优解RP=(40,40,40,25), OP=(0,10,35,0),最小成本=78450。这就是我们模型的计算结果。一般来说,LINGO中建立的优化模型由四个部分组成,或称为四“段” (SECTION):(1)集合段(SETS):这部分要以SETS:开始,以ENDSETS结
12、束,作用是定义必要的集合变量(SET) 及其元素(MEMBER,含义类似于数组的下标)和属性(ATTRIBUTE,含义类似于数组)。如上例中定 义了集合quarters(含义是季节),这里它包含四个元素即四个季节指标(1,2, 3, 4),每个季节都有 需求(DEM)、正常生产量(RP)、加班生产量(OP)、库存量(1NV)等属性(相当于数组,数组下标由quarters 元素决定)。一旦这样的定义建立起来,如果quarters的数量不是4而是1000,只需扩展其元素为1, 2,.,1000,每个季节仍然都有DEM,RP,OP,INV这样的属性(这些量的具体数值如果是常量, 则可在数据段输入:如
13、果是未知数,则可在初始段输入初血。自然,当quarters的数量不是4而是 1000时,我们也没有必要枚举,而是可以如下定义quarters集合:quarters / 1.1000 / :DEN,RP,OP,INV:“1. 1000”的意识就是从1到1000的所有整数。目标与约束段:这部分实际上定义了目标函数,约束条件等。一般要用到LINGO的内部函 数,可在具体使用中体会其功能和用法(详见.5节)。上例中定义的目标函数与quarters的元素数目 是4或1000并无具体的关系。约束的表示也类似。数据段(DATA)这部分要以DATA:开始,以ENDDATA结束,作用是对集合的属性(数组) 输入
14、必要的常数数据。格式为:attribute=value_list。常数值列表(vatue_list)中数据之间可以用逗号“,”分开,也可以用空格分开(回车的作用也等价于一个空格),如上面对DEM的赋值也可以写成 “DEM: 40 60 75 25”。在LINGO模型中,如果想在运行时才对参数赋值,可以在数据段使用输入语句。但这仅用于对 单个变量赋值,而不能用于属性变量(数组),输入语句格式为: “变量名:?;”。例如,上面的例 子中如果需要在求解模型时才给出初始库存量(记为A),则可以在模型中数据段写上“A=?;”语句, 在求解时,LINDO系统会给出提示界面,等待用户输入变量A的数值。初始段
15、(INIT):这部分要以INIT:开始,以ENDINIT结束,作用是对集合的属性(数组)定义 迭代初值,如果有一个接近最优解的初值,对LINGO求解模型是有帮助的。格式为: attribute=value_1ist;上例中没有初始化部分,我们将在下一个例子中举例说明。3. 2基本集合与派生集合我们用LINGO来解如下料场选址问题,并由此说明基本集合与派生集合。例4某公司有6个建筑工地要开工,每个工地的位置(用平面坐标系a,b表示,距离单位: 千米)及水泥日用量d(吨)由下表给出。工地位置(a,b)及水泥日用量d123456a1.258.750.55.7537.25b1.250.754.7556
16、.57.25d3547611目前有两个临时料场位于A(5,1),B(2,7),日储量各有20吨。假设从料场到工地之间均有直线道路相连。试制定每天的供应计划,即从A,B两料场分别向各工地运送多少吨水泥,使总的吨千米 数最小。为了进一步减少吨千米数,打算舍弃两个临时料场,改建两个新的,日储量各为20吨,问 应建在何处,节省的吨千米数有多大?可建立数学模型如下:min/ 言/ 寸侦二)+3由,)s,t.粒 2,&沁广1当使用现有临时料场时,决策变量只有cij,是LP模型;当为新建料场选址时决策变量为cij 和xj,yj,由于目标函数f对xj,yj是非线性的,所以在新建料场时是NLP模型。我们现在先解
17、NLP 模型,而把现有临时料场的位置作为初始解告诉LINGO。程序输入如下:MODEL:Title Location Problem;sets :demand/1.6/:a,b,d;supply/1.2/:x,y,e;link(demand,supply):c;endsetsdata:!locations for the demand(需求点的位置);a=1.25,8.75,0.5,5.75,3,7.25;b=1.25,0.75,4.75,5,6.5,7.75;!quantities of the demand and supply (供需量);d=3,5,4,7,6,11; e=20,20;
18、x,y=5,1,2,7;enddatainit:!initial locations for the supply (初始点);!x,y=4,5,7,5;endinitObjective function (目标);OBJ min=sum(link(i,j):c(i,j)大(x(j)-a(i)八2+(y(j)-b(i)八2)八(1/2);!demand constraints (需求约束);for(demand(i):DEMAND_CON sum(supply(j):c(i,j) =d(i););!supply constraints (供应约束);for(supply(i):SUPPLY_C
19、ON 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)l SeDEMAND,TeSUPPLY因此,其属性C也就是一个6*2的矩阵(或数组)。正是由于这种表示方式,LINGO建模语言也 称
20、为矩阵生成器(MATRIX GENERATOR)。DEMAND和SUPPLY这种直接把元素列举出来的集合, 称为基本集合(primary set,也可译为“原始集合”),而把LINK这种基于基本集合构造的集合称为 派生集合(derived set,也可译为“导出集合”)。本模型中包括了初始段,请特别注意其中“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的赋值语句
21、也可以写成:A,B=1.25 1.25 8.75 0.75 0.5 4.75 5.75 5 3 6.5 7.25 7.75;请注意我们前面说过,这时空格与逗号“,”或“回车”的作用是等价的。由于新建料场的位置可以是任意的,所以我们在约束的最后用free函数取消了变量X、Y非 负限制。此外,我们用TITLE语句对这个模型取了一个标题“LOCATION PROBLEM”;并且对目 标行(OBJ)和两类约束(DEMAND CON、SUPPLY CON)分别进行了命名(请特别注意这里约束命名 的特点)。我们还指出:如果要把料厂P(5, 1),Q(2, 7)的位置看成是已知并且固定的,这时是LP模型。
22、只需要在程序中把初始段的“X,Y=5, 1,2, 7;”语句移到数据段就可以了。此时,运行结果告诉 我们得到全局最优解(变量C的取值这里略去),最小运量136. 275(吨公里)。3. 3稠密集合与稀疏集合前面的例子中我们把派生集合MATCH的元素定义为DEMAND和SUPPLY的笛卡儿积,这种 派生集合称为稠密集合(简称稠集)。其实在LINGO中,派生集合的元素可以只是这个笛卡儿积的一 个真子集合,这种派生集合称为稀疏集合(简称疏集)。下面我们通过一个例子来说明。例5 最短路问题:在复杂的公路网中,货车司机希望找到一条从一个城市到另一个城市的 最短路.假设下图表示的是该公路网,节点表示货车可
23、以停靠的城市,弧上的权表示两个城市之间 的距离(单位:百公里)。货车从城市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)的最优行驶路线
24、,只需要先 求出从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的 最优行驶路线的路长,则:L(S) = 0, L(X) = minL(K) + d(Y,X), X。SY # X
25、对本例的具体问题,可以直接计算如下:(A.4)=3;瓦 A林山心+4卜 7 = A J同;(C|户珍尸&= 15 =(B尸&Z(电)-9片 16 Bj汁L(C 尸20 - L(C所以,从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
26、)/!派生集台ROADS表示的是网络中的道路(弧);S,A1 S,A2 S,A3!由于并非所有城市间都有道路直接连接,所以将弧具体列出;A1,B1 A1,B2 A2,B1 A2,B2 A3,B1 A3,B2B1,C1 B1,C2 B2,C1 B2,C2C1,T C2,T/: D;嘱性D(i,j)是城市谨而的直接距离(已知);ENDSETSDATA:D= 633658674678956;L=0,;!因为 L(S)=0;ENDDATAFOR(CITIES(i)|i#GT#index(S): !这行中index(S)可以直接写成1;L(i)=MIN(ROADS(j,i): L(j) + D(j,i)
27、;);END集合段定义的CITIES是一个基本集合(元素通过枚举给出),L是其对应的属性变量(我们要求 的最短路长),ROADS是由CITIES导出的一个派生集合(请特别注意其用法),由于只有一部分城市 之间有道路相连,所以我们进一步将其元素通过枚举给出,这就是一个稀疏集合。D是ROADS对 应的属性变量(给定的距离)。从模型中还可以看出,LINGO程序可以没有目标函数。这可以用来找可行解(解方程组和不等式 组)。此外,在数据段我们对L进行了赋值,但只有L(S)=0是已知的,所以后面的值为空,但位置 必须留出来,即逗号“,”一个也不能少,否则会出错。如果这个语句直接写成“L=0;”,语法上看
28、也是对的,但其含义是L所有元素的取值全部为0,与题意不符。从这个例子还可以看出,虽然集合CITIES中的元素不是数字,但当它以CITIES(I)的形式出现 在循环中时,引用下标I却实际上是正整数,也就是说I指的正是元素在集合中的位置(顺序),一般 称为元素的索弓l(1NDEX)0我们在for循环中特意用了一个函数“index,其作用是返回一个元 素在集合中的索引值,这里index(S)=1,所以逻辑关系式“I#GT#index(S)”可以直接等价地写成 “I#GT#1”。这里index(S)实际上还是(index(CITtES,S)的简写,即返回S在集合CITIES中的索 引值。运行以上程序得
29、到结果,可以看出,从S到T的最优行驶路线的路长为20。进一步分析,可以 得到从S到T的最优行驶路线为S A3 B2 C1 T.。学生S1S2S3S4S5S6S7S8S109342156S2017352IS3044292S401552S50876S6023S704S80上面这个例子中定义稀疏集合ROADS的方法是将其元素通过枚举给出,有时会很麻烦,用起 来不方便。LINGO提供了另一种定义稀疏集合的方法,这就是“元素过滤”法,能够从构成派生集 合的父集合的笛卡儿积中系统地过滤下来 一些真正的元素。请看下面的例子。例6 某班8名同学准备分成4个 调查队(每队两人)前往4个地区进行社会 调查。假设这
30、8名同学两两之间组队的效 率如表所示(由于对称性,只需列出上三角 部分),问如何组队,可以使总效率最高?这是一个典型的匹配(MATCHING)问 题。把上面的效率矩阵记为BENEFIT,用 MATCH(Si,Sj)=1表示同学Si与Sj组成一队,而0表示不组队。由于对称性,只需考ij共32个0-1 变量。显然,目标函数为BENEFIT(Si,Sj)*MATCH(Si,Sj之和;约束条件是每个同学只能(而且必须 在)某一组,即对于任意i有:只要MATCH属性的某个下标为i就加起来,此和=1。显然,这是 个0-1线性规划。模型输入如下:MODEL:SETS:STUDENTS /S1.S8/;PAI
31、RS(STUDENTS,STUDENTS)I &2#GT#&1:BENEFIT,MATCH;ENDSETSDATA:BENEFIT=9342156173521442921552876234;ENDDATAobjective MAX= SUM(PAIRS(I,J): BENEFIT(I,J)*MATCH(I,J);FOR(STUDENTS(I):constraintsSUM(PAIRS(J,K) | J # EQ # I # OR # K # EQ # I: MATCH( J, K)=1);FOR(PAIRS( I, J): BIN(MATCH( I, J);END其中STUDENTS集合的元素
32、列表“S1. S8”等价于写成“S1 S2 S3 S4 S5 S6 S7 S8”,它没有 相关的属性列表,主要用于表示下标集合。我们看到在派生集合PAIRS的定义中,增加了过滤条件, 即逻辑关系式&2#GT#&1”,意思是第2个父集合的元素的索引值(用“&2”表示)大于第1个父集 合的元素的索引值(用“&1”表示)。选择菜单命令“LINGO|SOLVE”运行这个程序,可以得到全局最优值 =30。由于MATCH变量 中多数为0,我们这里练习一下如何更清晰地浏览最优解。选择菜单命令LINGOISOLUTION”,在 弹出的对话框中选择MATCH属性(变量)和Nonzeros Only(只显示非零值
33、)选项,点击“OK”按钮, 得到的正是我们想看的关于最优解的报告。3. 4集合的使用小结我们把前面介绍的关于集合的不同类型及其关系小结一下,如下图所示。再归纳一下基本集合和派生集合的定义语法(以下语法中凡是在方括号“”中的内容,表示是 可选的项,即该项可以有也可以没有)。基本集合的定义格式为:setname/member_list/ : attribute_list;其中setname为定义的集合名,member_list为元素列表,attribute_list为属性列表。元素列表可 以采用显式列举法,即直接将所有元素全部列出,元素之间用逗号或空格分开;也可以采用隐式列举法。隐式列举法可以有几
34、种不同格式,如下表:类型隐式列举格式示例示例集合表示的元素数字型1.n1.51. 2, 3, 4, 5字符-数字型stringM.stringNcarl01. car208Carl01,carl02,.,car208星期型dayM.dayNMON. FRIMON,TUE,WED,THU,FRI月份型monthM.monthNOCT.JANOCT,NOV,DEC,JAN年份-月份型monthYearM.monthYearNOCT2001.JAN2002OCT2001,NOV2001,DEC2001,JAN2002上面的语法还告诉我们,元素列表和属性列表都是可选的。当属性列表不在集合定义中出现时,
35、 这样的集合往往只是为了将来在程序中作为一个循环变量来使用,而当元素列表不在集合定义中出 现时,则必须在程序的数据段以赋值语句的方式直接给出元素列表。例如,例3的模型的集合段和 数据段可以分别改为:SETS:QUARTERS: DEM, RP, OP, INV;ENDSETSDATA:QUARTERS: DEM=1 40260375425;ENDDATA派生集合的一般定义格式为:setname(parent_set_list) /member_list/ : attribute_list;其中与基本集合的定义相比较只是多了一个parent_set_list (父集合列表)。父集合列表中的集合
36、(如set1,set2,等)称为派生集合setname的父集合,它们本身也可以是派生集合。若元素列表 (member_tlst)不在集合定义中出现,则可以在程序的数据段以赋值语句的方式给出元素列表;若在程 序的数据段也不以赋值语句的方式给出元素列表,则认为父集合中所有元素的组合(笛卡儿积)都是 setname的元素。当元素列表在集合定义中出现时,又有“元素列表法”和“元素过滤法”两种不同 方式,请参看本节前面的介绍。4运算符及其优先级在前面的很多例子里,我们陆续用到了一些运算符,现在归纳一下LINGO中的三类运算符:算 术运算符、逻辑运算符和关系运算符。算术运算符有5种:+(加法),一(减法或
37、负号),*(乘法),/ (除法),人(求幕)。逻辑运算符有9种:#AND#(与),#OR# (或),#NOT#(非),#EQ# (等于),#NE# (不等于),#GT#(大于),#GE#(大于等于),#LT#(小于),#LE#(小于等于)。逻辑运算的结果只有“真”(TRUE)和“假”(FALSE)两个值,LINGO中用数字1代表TRUE, 其他值(典型的值是0)都是FALSEo关系运算符有3种: (即=,小于等于),=(等于), (即=,大于等于)。注意在数学规划中 约束一般没有严格小于、严格大于关系。这些运算符的优先级如表优先级运算符最高#NOT#(负号)A*/最低+(减法)#EQ# #NE
38、# #GT# #GE# #LT# #LE#AND# #OR#同一优先级按从左到右的顺序执行;如果有括号“()”,则括号内的表达式优先进行计算。5 LINGO函数一览LINGO中包括相当丰富的数学函数和控制语句。在LINGO中建立优化模型时可以引用大量的 内部函数,这些函数以“ ”符号打头。5. 1常用的数学函数ABS(X) 返回变量X的绝对值。COS(X) 返回变量X的余弦值(X的单位是弧度)。EXP(X) 返回eX的值(其中e为自然对数的底,即2. 718281)。FLOOR(X)返回X的整数部分(向最靠近0的方向取整)。LGM(X)返回变量X的gamma(伽玛)函数的自然对数值(当X为整数
39、时,LGM(X)= LOG(X - 1)!,当X不为整数时,采用线性插值得到结果)。LOG(X) 返回变量X的自然对数值。SIGN(X) 返回变量X的符号值(X=0时返回+1)。SIN(X) 返回变量X的正弦值(X的单位是弧度)。SMAX( list )返回一列数(list )的最大值。SMIN(1ist ) 返回一列数(list )的最小值。TAN(X)返回变量X的正切值(X的单位是弧度)。5. 2集合循环函数集合循环函数的用法如下:function( setname ( set_index_list) 1 condition : expression_list);其中 function 是
40、集合函数名,有 FOR、MAX、MIN、SUM 四种;setname 是集合名;set_index_list 是集合索引列表(不需使用索引时可以省略);condition是用逻辑表达式描述的条件(通常含有索引, 无条件时可以省略);expression_list是一个表达式(对FOR函数,可以是一组表达式)。集合函数 名的含义如下:FOR对集合setname的每个元素独立地生成约束,约束由expression_list描述。MAX返回集合setname上的表达式的最大值。MIN返回集合setname上的表达式的最小值。SUM返回集合setname上的表达式的和。5. 3集合处理函数IN( se
41、tname, primitive_index_l , primitive_index_2, .)如果集合setname中包含本集合的元素索引primitive_index_1 , primitive_index_2,所对应的 元素,则返回1,否则返回0。元素索引用“&1”、&2”或“index”函数等形式给出,这里“&1” 表示对应于第1个父集合的元素的索引值,“&2”表示对应于第2个父集合的元素的索引值.例如,如果我们想定义一个学生集合STUDENTS(基本集合),然后由它派生一个及格学生的集 合PASSED和一个不及格学生的集合FAILED,可以如下定义:SETS:STUDENTS / Z
42、HAO, QIAN, SUN, LI/ ;PASSED(STUDENTS) /QIAN, SUN/ ;FAILED(STUDENTS) | #NOT# IN ( PASSED, &1);ENDSETS又如,如果集合C是由集合A, B派生的,例如:SETS:A / 1.3/ ;B / X Y Z / ;C ( A, B) / 1,X 1,Z 2,Y 3,X / ;ENDSETS现在假设我们想判断C中是否包含元素(2, Y),则可以利用以下语句(对本例,C中确实包含元 素(2, Y),所以 X=1):X = IN( C, INDEX( A, 2), INDEX( B, Y);INDEX( set_
43、name, primitive_set_element)给出元素primitive_set_element在集合set_name中的索引值(即顺序位置的编号)。如果省略 set_name,LINGO按模型中定义的集合顺序找到第一个含有元素primitive_set_element的集合,并 返回索引值。如果在所有集合中均没有找到该元素,会给出出错信息。 WRAP( I , N )当I位于区间1,N内时直接返回I; 一般地,返回J = I - K*N,其中J位于区间1,N,K 为整数。可见这个函数相当于数学上的I对N取模函数的值加1,即WRAP( I,N) = I(modeN)+1。 此函数对N
44、1无定义。可以想到,此函数的目的之一是可以用来防止集合的索引越界。SIZE(set_name)返回数据集set_name中包含元素的个数。5. 4变量界定函数变量函数对变量的取值范围附加限制。共四种:BND(L,X,U) 限制 L = X NEED( I);SHIPPED(I) SUPPLY( I);DATA:COST = FILE( myfile.txt);NEED =FILE(myfile.txt);SUPPLY =FILE( myfile.txt);ENDDATAENDmyfile. txt文件的内容可以是如下格式:Seattl e, Detroit, Chicago, Deriver
45、COST, NEED, SUPPLY, SHIPPED 12,28,15,20 1600,1800,1200,1000 1700,1900,1300,1100ODBC、OLE分别提供LINGO与ODBC和OLE的接口,这里不详细介绍了POINTER(N)在Windows下使用LINGO的动态连接库(Dynamic Link Library,简写为DLL),直接从共享的 内存中传送数据。这里不详细介绍了。RANGED(variable_or_row_name)为了保持最优基不变,变量的费用系数或约束行的右端项允许减少的量。RANGEU(variable_or_row_name)为了保持最优基不变
46、,变量的费用系数或约束行的右端项允许增加的量。STATUS() 返回LINGO求解模型结束后的最后状态;0 Global Optimum (全局最优)Infeasible (不可行)Unbounded (无界)Undetermined (不确定)(无)5 Infeasible or Unbounded (通常需要关闭“预处理”选项后重新求解模型,以确定究竟是不可行还是无界)Local Optimum (局部最优)Locally Infeasible (局部不可行)Cutoff (目标函数达到了 Cutoff水平)Numeric Error (约束中遇到了无定义的数学操作)TEXT ( file
47、name,)用于数据段中将解答结果送到文本文件filename中。当省略filename时,结果送到标准的输出 设备(通常就是屏幕)。8其他函数If (logical_conditlon,true_result,false_result)当逻辑表达式logical_condition的结果为真时,返回true_result,否则返回false_result。例如 IF( X # LT # 100, 20,15)语句,当 x 1.3)*10000站l i号铲1位的铁矿石储量万吨叫 (号铲位的岩石储量万吨ft -描述第,号铲位是否使用 g 开美变量*取1为使用;取0为关闭“建立模型如下: TOC
48、o 1-5 h z min 丈 154玲 x %6I IE X产 t, 凹,_/= I一 .5I)860/5, / = !,- ,10事 Sx20. J - ,.5工+XL必左 xNOg lW工,fwgimm3 lj = 1.点Xyx(p -30 5)0 -f GE_fr=D.i.灰 为整数,f Q.J = LJ0其中* 7, 5到/距鹿x如平均速度+3十5分钟,,=Ttl .5jf 玖寸8 300.-盼矛7;【近似)LINGO程序如下:model:title CUMCM-2003B-01;sets:cai / 1.10 /:crate, cnum, cy, ck, flag;xie / 1
49、. 5 /:xsubject,xnum;link( xie, cai ):distance, lsubject, number, che,b;endsetsdata:crate=30 28 29 32 31 33 32 31 33 31;xsubject= 1.2 1.3 1.3 1.9 1.3 ;distance= 5.26 5.19 4.21 4.00 2.95 2.74 2.46 1.90 0.64 1.271.90 0.99 1.90 1.13 1.27 2.25 1.48 2.04 3.09 3.515.89 5.61 5.61 4.56 3.51 3.65 2.46 2.46 1.
50、06 0.570.64 1.76 1.27 1.83 2.74 2.60 4.21 3.72 5.05 6.104.42 3.86 3.72 3.16 2.25 2.81 0.78 1.62 1.27 0.50;cy = 1.25 1.10 1.35 1.05 1.15 1.35 1.05 1.15 1.35 1.25;ck = 0.95 1.05 1.00 1.05 1.10 1.25 1.05 1.30 1.35 1.25;enddata!目标函数;min=sum( cai (i): sum ( xie (j): number(j,i)*154*distance(j,i);!卡车每一条路线
51、上最多可以运行的次数;for (link (i,j): b(i,j)=floor(8*60-(floor(distance(i,j)/28*60*2+3+5)/5)-1)*5)/ (distance(i,j)/28*60*2+3+5);!每一条路线上的最大总车次数;for( link (i,j): lsubject(i,j)=(floor(distance(i,j)/28*60*2+3+5)/5)*b(i,j);!各个铲位的总产量;for (cai(j): cnum(j)=sum(xie(i): number(i,j);!各个卸点的总产量;for (xie(i): xnum (i)=sum(c
52、ai (j) : number (i, j );!道路能力约束;for (link (i,j): number(i,j)=lsubject(i,j);!电铲能力约束;for (cai (j): cnum(j) = flag(j)*8*60/5 );!电铲数量约束;sum(cai(j): flag(j) ) =7;!卸点能力约束;for (xie (i): xnum (i) =8*20);!铲位产量约束;for (cai (i): number(1, i)+number(2, i)+number(5, i)=ck(i)*l0000/154);for (cai (i): number(3,i)+n
53、umber(4,i)= xsubject (i)*10000/154);!铁含量约束;sum(cai (j): number(1,j)*(crate(j)-30.5) )=0;sum(cai (j): number (2,j)*(crate(j) -30.5) )=0;sum(cai (j): number(5,j)*(crate(j) -30.5) )=0;sum(cai (j): number(2,j)*(crate(j)-28.5) )=0;sum(cai (j): number (5, j) * (crate (j) -28.5) =0;!关于车辆的具体分配;for (link (i,
54、j): che (i,j)=number (i,j)/b(i,j);!各个路线所需卡车数简单加和;hehe=sum (link (i,j): che (i,j);!整数约束;for (link (i,j): gin(number (i,j);for (cai (j): bin(flag (j);!车辆能力约束;hehe=20;ccnum= sum(cai (j): cnum(j);end计算结果:目标值84938.70吨公里;最佳物流相对应的各个路线上的最佳运输车次铲位1铲位2铲位3铲位4铲位5铲位6铲位7铲位8铲位9铲位10矿石漏135015倒装场l7015岩场7411岩石漏8143倒装场ll132706. 2钢管订购和运输(CUMCM2000B题)赛题叙述略。本题第一问求运输量的模型如下:血 0 + 1)% +- (1 +y. )y. + (1+勺)rj :,r- g500/M 应夕yft-】- 1,一一.,7一文孔5七广 /二L5 Mlyj+/ j j = iT.,+i4x3i f Qft =1,*7一决策变量符号的含义:f.表示是否使用钢厂i的钢管;X表示从钢厂i运到节点j的钢管量;J是 iijj从节点j向左铺设的钢管量;Z.是从节点j向右铺设的钢管量.程序如下:jMODEL:TITLE CUMCM-20
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 玩具产品品牌故事塑造考核试卷
- 煤气化技术的能源市场竞争力评估考核试卷
- 橡胶制品在电子电器行业的应用考核试卷
- 拖拉机行业法律法规更新解读考核试卷
- 2025年重型方轨悬挂线项目可行性研究报告
- 2025年通窍鼻炎胶囊项目可行性研究报告
- 2025年轴承润滑油项目可行性研究报告
- 2025年螺柱焊接机项目可行性研究报告
- 2025-2030中国自动贴装机行业发展分析及发展前景与投资研究报告
- 2025-2030中国脊柱内窥镜行业市场发展趋势与前景展望战略研究报告
- 建筑公司劳动防护用品管理制度
- 医院药品采购制度及流程
- 宿舍管理考试试题及答案
- 2025年郑州铁路职业技术学院单招职业适应性考试题库附答案
- 《审计风险防范与控制的案例分析-以康得新为例》10000字
- 2025福建德化闽投抽水蓄能有限公司招聘15人笔试参考题库附带答案详解
- 【参考】2016扣字排行榜
- 2025年二级注册计量师专业实务真题
- 基于改进YOLOv5的交通标志检测与识别
- 16J914-1 公用建筑卫生间
- 机械加工PFMEA案例
评论
0/150
提交评论