lingo教程
- 格式:docx
- 大小:571.14 KB
- 文档页数:16
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;然后点击工具条上的按钮 即可。
设从第i 个产地(A i )运往第j 个销地(B j )的单位运价为cost (i,j );从第i 个产地(A i )运往第j 个销地(B j )的运送量为valume (i ,j );i=1,...,6;j=1, (8)第j 个销地(B j )的销量为demand (j ); 第i 个产地(A i )的产量为capacity (i );目标函数(object function ) 6811mincos ()()i j t ij volume ij ==∑∑需求约束 61()()i volume ij demand j =<=∑ j=1,…,8产量约束 81()()j volume ij capacity i =<=∑ i=1,…,6(注:14个约束条件,48个变量,采用集合的概念)使用LINGO 软件,编制程序如下:model :!6发点8收点运输问题; sets : !集合定义warehouses/wh1..wh6/: capacity; !capacity 为集合属性 vendors/v1..v8/: demand;links(warehouses,vendors): cost, volume;!由两个集合构成新的集合 endsets !集合定义结束!目标函数; min =@sum (links: cost*volume); !或min =@sum (links (i,j ): cost(i)*volume(j));在数组links 上去求和!需求约束; @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 高效的求解器可快速求解并分析结果。
§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 高效的求解器可快速求解并分析结果。
§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 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 高效的求解器可快速求解并分析结果。
§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 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中运行程序时出现的页面(在工具栏点击类似靶子一样的图标便可运行)Solver status:求解器(求解程序)状态框Model Class:当前模型的类型:LP,QP,ILP,IQP,PILP,PIQP,NLP,INLP,PINLP(以I开头表示IP,以PI开头表示PIP)State:当前解的状态: "Global Optimum", "LocalOptimum", "Feasible", "Infeasible“(不可行), "Unbounded“(无界), "Interrupted“(中断), "Undetermined“(未确定)Object:解的目标函数值Infeasibility:当前约束不满足的总量(不是不满足的约束的个数):实数(即使该值=0,当前解也可能不可行,因为这个量中没有考虑用上下界命令形式给出的约束)Iteration:目前为止的迭代次数Extend solverstatus:扩展的求解器(求解程序)状态框Solver type:使用的特殊求解程序:Bestobj :目前为止找到的可行解的最佳目标函数值Objbound:目标函数值的界Steps:特殊求解程序当前运行步数:Active:有效步数Variables(变量数量):变量总数(Total)、非线性变量数(Nonlinear)、整数变量数(Integer)。
Constraints(约束数量):约束总数(Total)、非线性约束个数(Nonlinear)。
Nonzeros(非零系数数量):总数(Total)、非线性项系数个数(Nonlinear)。
GeneratorMemory Used (K) (内存使用量)ElapsedRuntime (hh:mm:ss)(求解花费的时间)运行之后页面介绍(这里的运行界面并不是与上面的运行过程中出现界面一致,即并非来自于同一个程序运行出现)第一行表示在经过457次迭代后得到局部最优解第二行给出该局部最优解的具体值下面给出取局部最优值时,x1 x2的具体取值这里求解的是局部最优解,如果想求出全局最优解,可以进行页面设置:lingo --> option --> global solver --> 勾选use global solver对于运行结果也可以另存为,格式一般为ldt,因为有时候对于求解一个问题,或许需要运行很久才可以得出结果,所以没必要每次为了看结果都运行,而是运行成功一次后便把结果保存下来注意事项LINGO总是根据“MAX=”或“MIN=”寻找目标函数;程序语句的顺序一般不重要,既可以随意调换;程序运用函数时都是以@开头;程序中的变量默认为非负数,想要改变变量类型必须有相应函数调整程序中变量不区分大小写;语句必须以分号结尾;注释以!开始,且注释语句后面必须也有分号,注释默认注释到第一个分号处,意思是分号前面会全部被注释掉。
例题:max=98*x1+277*x2-x1^2-0.3*x1*x2-2*x2^2; !目标函数;!约束条件;x1<=2*x2;x1+x2<100;@gin(x1);@gin(x2); !x1 x2非负整数lingo入门教程之二--- 集合运用lingo中的集合用法很多,这里主要通过几个例题来进行讲解对于每一个问题,都要先找到对应的目标函数,然后对相应值进行初始化,然后找到约束条件等进行求解例1:SAILCO公司需要决定下四个季度的帆船生产量。
下四个季度的帆船需求量分别是40条,60条,75条,25条,这些需求必须按时满足。
每个季度正常的生产能力是40条帆船,每条船的生产费用为400美元。
如果加班生产,每条船的生产费用为450美元。
每个季度末,每条船的库存费用为20美元。
假定生产提前期为0,初始库存为10条船。
如何安排生产可使总费用最小?分析:用DEM,RP,OP,INV分别表示需求量、正常生产的产量、加班生产的产量、库存量,则DEM,RP,OP,INV对每个季度都应该有一个对应的值,也就说他们都应该是一个由4个元素组成的数组,其中DEM是已知的,而RP,OP,INV是未知数。
MODEL: !模型开始;SETS: !集合定义开始;QUARTERS/1,2,3,4/:DEM,RP,OP,INV;!集合QUARTERS类似于数组,DEM等表示该集合包含的元素,这里一共有四个元素。
/1,2,3,4/表示该集合的大小,对应着实际问题的每一个季度/1,2,3,4/等价于/1..4/,当集合大小比较大时,建议写后者;ENDSETS !集合定义结束;MIN=@SUM(QUARTERS:400*RP+450*OP+20*INV);!@sum(),求和函数,表示对该集合所有依次进行求和,由于这里是对所有,所以省去了循环变量,这里等价于@SUM(QUARTERS(i): 400*RP(i) +450*OP(i) +20*INV(i) );@FOR(QUARTERS(I):RP(I)<40);!@for类似于c/c++中的for循环,对其中操作循环进行;@FOR(QUARTERS(I)|I#GT#1: !|表示对于循环的限制,#GT#表示大于,这里具体含义:I大于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 !模型结束;接下里这里例子会讲到关于集合的派生问题,这个跟c++里面的继承与派生比较相像例2:建筑工地的位置(用平面坐标a,b表示,距离单位:公里)及水泥日用量d(吨)下表给出。
有两个临时料场位于P (5,1), Q (2, 7),日储量各有20吨。
从A, B两料场分别向各工地运送多少吨水泥,使总的吨公里数最小。
两个新的料场应建在何处,节省的吨公里数有多大?MODEL:Title Location Problem;sets:demand/1..6/:a,b,d; !该集合对应着建筑工地,每一个建筑工地有两个坐标还有一个需求量,所以元素有三个;supply/1..2/:x,y,e; !该集合对应着料场,元素是坐标与储存量;link(demand,supply):c; !由上面的demand supply派生而成,可以认为现在link是一个6行(demand)2列(supply)的矩阵,矩阵中元素的值代表着每一个建筑工地接受各个料场的具体水泥量;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;enddatainit:!initial locations for the supply(初始点);x,y=5,1,2,7;endinit!Objective function(目标);min=@sum(link(i,j): c(i,j)*((x(j)-a(i))^2+(y(j)-b(i))^2)^(1/2) ); !表示对link中所有元素即六行二列都进行此求和操作;!demand constraints(需求约束);@for(demand(i):@sum(supply(j):c(i,j)) =d(i);); !@sum里面表示对j进行循环用supply,@for表示对i进行循环用demand(i),这里表示对所有的建筑工地,工地对应的的需求量等于各个草料场供给量的和;!supply constraints(供应约束);@for(supply(i):@sum(demand(j):c(j,i)) <=e(i); );@for(supply: @bnd(0.5,X,8.75); @bnd(0.75,Y,7.75); ); !表示x, y的范围,@bnd(a, x, b): a <= x <= b;END例3:(最短路问题) 在纵横交错的公路网中,货车司机希望找到一条从一个城市到另一个城市的最短路.下图表示的是公路网,节点表示货车可以停靠的城市,弧上的权表示两个城市之间的距离(百公里).那么,货车从城市S出发到达城市T,如何选择行驶路线,使所经过的路程最短?分析:假设从S到T的最优行驶路线P 经过城市C1, 则P中从S到C1的子路也一定是从S到C1的最优行驶路线;假设P 经过城市C2, 则P中从S到C2的子路也一定是从S到C2的最优行驶路线.因此, 为得到从S到T的最优行驶路线, 只需要先求出从S到C k(k=1,2)的最优行驶路线,就可以方便地得到从S到T的最优行驶路线. 同样,为了求出从S到Ck(k=1,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=1,2或3),Ai→Bj(j=1或2),Bj→Ck(k=1或2),Ck→ T.记d(Y,X)为城市Y与城市X之间的直接距离(若这两个城市之间没有道路直接相连,则可以认为直接距离为∞),用L(X)表示城市S到城市X的最优行驶路线的路长: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,B2B1,C1B1,C2B2,C1B2,C2C1,T C2,T/:D;!属性D(i,j)是城市i到j的直接距离(已知);ENDSETSDATA:D=633658674678956;L=0,,,,,,,,;!因为L(S)=0,这里的,不能省略,表示虽然对应值还未确定,但是必须为他们预留位置,不然会出错;ENDDATA@FOR(CITIES(i)|i#GT#@index(S):!这行中“@index(S):表示S在CITIES中的下标”可以直接写成“1”;L(i)=@MIN(ROADS(j,i):L(j)+D(j,i)););!这就是前面写出的最短路关系式,ROAD(j,i)表示对所以从j到i的边循环一遍;end例4:篮球队需要选择5名队员组成出场阵容参加比赛.8名队员的身高及擅长位置见下表:出场阵容应满足以下条件:(1)只能有一名中锋上场;(2)至少有一名后卫;(3)如1号和4号均上场,则6号不出场;(4)2号和8号至少有一个不出场.问应当选择哪5名队员上场,才能使出场队员平均身高最高?分析:典型0/1问题,这个时候是一维的情况,可以设置一个一维的集合,取值只能是0或者1,为1时代表选取对应运动员,否则不选目标函数:该集合与对应身高相乘求和,即为1时表示选取侧求和相加,为0时侧不选取,不做任何处理限制条件:必须选取五名,其他条件题目中应该满足的条件已经给的比较清楚了,具体见下面代码model:!集合段;sets:player/1..8/:high, match;endsets!目标与约束段;max = @sum(player: high * match) / 5;@for(player: @bin(match)); !限制match必须值必须为0或者1,@bin(x):x为0或1;@sum(player: match) = 5; !必须选取五名;match(1) + match(2) = 1; !只能有一名中锋上场;match(6) + match(7) + match(8) >= 1; !至少有一名后卫;match(1) + match(4) + match(6) <= 2; !如1号和4号均上场,则6号不出场;match(2) + match(8) >= 1; !2号和8号至少有一个不出场;!数据段;data:high = 1.92 1.90 1.88 1.86 1.85 1.83 1.80 1.78;enddataend显示结果中的matchMATCH( 1) 0.000000 -0.3840000MATCH( 2) 1.000000 -0.3800000MATCH( 3) 1.000000 -0.3760000MATCH( 4) 1.000000 -0.3720000MATCH( 5) 1.000000 -0.3700000MATCH( 6) 1.000000 -0.3660000MATCH( 7) 0.000000 -0.3600000MATCH( 8) 0.000000 -0.3560000有时候会觉得match过多难以找到被选中的即match为1的具体哪些值,这个时候可以lingo -->solution然后match显示如下Variable Value Reduced CostMATCH( 2) 1.000000 -0.3800000MATCH( 3) 1.000000 -0.3760000MATCH( 4) 1.000000 -0.3720000MATCH( 5) 1.000000 -0.3700000MATCH( 6) 1.000000 -0.3660000例5:某商业公司计划开办5家新商店.为了尽早建成营业,商业公司决定由5家建筑公司分别承建.已知建筑公司Ai(i=1,2,3,4,5)对新商店Bj(j=1,2,3,4,5)的建造费用的报价(万元)为cij(i,j=1,2,3,4,5),见下表.商业公司应当对5家建筑公司怎样分配建造任务,才能使总的建造费用最少?分析:典型的01问题,设置一个五行(对应集合中的建筑公司)五列(对应着集合中的建筑物) 的矩阵,当其中元素为1时表示该建筑公司建筑该建筑物,为0时侧相反。