您好,欢迎访问三七文档
LINGO软件简介LINGO软件是一个处理优化问题的专门软件,它尤其擅长求解线性规划、非线性规划、整数规划等问题。一个简单示例有如下一个混合非线性规划问题:为整数2132121321322212121,;0,,210022..15023.027798maxxxxxxxxxxxtsxxxxxxx。LINGO程序(模型):max=98*x1+277*x2-x1^2-0.3*x1*x2-2*x2^2+150*x3;x1+2*x2+2*x3=100;x1=2*x2;@gin(x1);@gin(x2);!Lingo默认变量非负(注意:@bin(x)表示x是0-1变量;@gin(x)表示x是整数变量;@bnd(L,x,U)表示限制LxU;@free(x)表示取消对x的符号限制,即可正、可负。)结果:Globaloptimalsolutionfound.Objectivevalue:9561.200Extendedsolversteps:0Totalsolveriterations:45VariableValueReducedCostX16.000000-76.70000X231.00000-151.2000X316.00000-150.0000RowSlackorSurplusDualPrice19561.2001.00000020.0000000.000000356.000000.000000————————非常简单!在LINGO中使用集合为了方便地表示大规模的规划问题,减少模型、数据表示的复杂程度,LINGO引进了“集合”的用法,实现了变量、系数的数组化(下标)表示。例如:对.,,;10)0(;4,3,2,1),()())()1()(;4,3,2,1,20)(..)}(20)(450)(400{min4,3,2,1均非负INVOPRPINVIIDEMIOPIRPIINVIINVIIRPtsIINVIOPIRPI求解程序:model:sets:mark/1,2,3,4/:dem,rp,op,inv;!也可以vmark/1..4/:dem,rp,op,inv;endsetsmin=@sum(mark:400*rp+450*op+20*inv);!也可以mark(I):400*rp(I)+450*op(I)+20*inv(I);@for(mark(I):rp(I)40);@for(mark(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,35;enddataend上面程序在model…end之间有(1)集合定义、(2)数据输入和(3)其他三部分内容。集合定义部分(从sets:到endsets):定义了一个指标集合mark(可以理解为数组下标及其范围)和其4个属性dem、rp、op、inv(用此向量的数组变量)。数据输入部分(从data:到enddata)依次给出常量(dem)的值。其他部分:给出优化目标及约束。一般而言,LINGO中建立优化模型的程序可以由五部分组成,或称为五段(section):(1)集合段(SETS):这部分以“SETS:”开始,以“ENDSETS”结束,作用在于定义必要的集合变量(SET)及其元素(member,含义类似于数组的下标)和属性(attribute,含义类似于数组)。(2)目标与约束段:这部分实际上定义了目标函数、约束条件等,但这部分没有段的开始和结束标记;该段一般常用到LINGO内部函数,尤其是和集合相关的求和函数@SUM和循环函数@FOR等。(3)数据段(DATA):这部分以“DATA:”开始,以“ENDDATA”结束,作用在于对集合的属性(数组)输入必要的常数数据。格式为:attribute(属性)=value_list(常数列表);常数列表中的数据之间可以用逗号、空格或回车符分隔。如果想要在运行时才对参数赋值,可以在数据段使用输入语句,其格式为“变量名=?;”,但仅限对单个变量赋值,而不能用于属性变量(数组)的单个元素。(4)初始段(INIT):这部分以“INIT:”开始,以“ENDINIT”结束,作用在于对集合的属性(数组)定义初值(因为求解算法一般是迭代算法,提供一个较好的初值,能提高计算效果)。定义初值的语句格式为:attribute(属性)=value_list(常数列表);这与数据段中的用法类似。(5)计算段(CALC):这部分以“CALC:”开始,以“ENDCALC”结束,作用在于对一些原始数据进行预处理加工,使其成为模型直接需要的数据。该段中通常是计算赋值语句。基本集合与派生集合为了处理二维数组变量等有多个下标的问题,LINGO引入了“派生集”的概念。我们把直接列出元素的指标集合叫“基本集合”,而基于其他集合派生出来的二维或多维指标集合称为“派生集”。派生集的定义格式为:派生集名(原始集合1,原始集合2,…,原始集合n):属性变量列表;实际上就是笛卡儿积的意思,即:派生集={(i1,i2,…in)|i1集合1,i2集合2,…,in集合n}。1)一个应用例子(布局问题):某些建筑工地的位置(用平面坐标a,b表示)及水泥日用量d已知。现有A、B两临时料场位于P(5,1)、Q(2,7),日储量20。问A、B两料场分别向各工地运输多少吨水泥,使总吨公里数最小?若重新安排两料场的位置,应怎样安排才能使总吨公里数最小?这样安排可节省多少吨公里?123456a1.258.750.55.7537.25b1.250.754.7556.57.75d3547611设工地位置(ai,bi),水泥日用量为di(i=1,2,…,6);料场位置(xi,yi),日储量ej,j=1,2;从料场j向工地i运送量为cij。该问题的数学模型为:.2,1,6,...,1,..)()(min6121216122jecidctsbyaxcfjiijjiijjiijijijLINGO求解程序为:MODEL:sets:Imark/1..6/:a,b,d;Jmark/1,2/:x,y,e;IJmark(Imark,Jmark):c;endsetsdata:!Locationfordemand(需求点位置);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;enddatainit:!Initiallocationforthesupply(初始点);x,y=5,1,2,7;endinit!Objectivefunction(目标);[OBJ]min=@sum(IJmark(i,j):c(i,j)*((x(j)-a(i))^2+(y(j)-b(i))^2)^(1/2));!demandcontraints(需求约束);@for(Imark(i):[DEMAND_CON]@SUM(Jmark(j):c(i,j))=d(i););!supplyconstrains(供给约束);@for(Jmark(j):[SUPPLY_CON]@SUM(Imark(i):c(i,j))=e(j););@for(Jmark:@free(x);@free(y););END2)一个动态规划的例子:(最短路问题)从S城市到T城市之间找一条最短路径,道路情况如下:数学模型为:SXXYdYLXLSLXY)},,()({min)(;0)(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,b2b1,c1b1,c2b2,c1b2,c2!属性D(i,j)是城市i到城市j的直接距离(已知);c1,tc2,t/:D;endsetsdata:D=633658674678956;685665787496363SA1A2A3B1B2C1C2TL=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)););!这就是最短路关系式;endVariableValueL(S)0.000000L(A1)6.000000L(A2)3.000000L(A3)3.000000L(B1)10.00000L(B2)7.000000L(C1)15.00000L(C2)16.00000L(T)20.00000最短路径为:S-〉A3-〉B2-〉C1-〉T3)(指派问题)设有6个人做6件事。其中cij表示第i人做第j事的收益;设第i人做第j事时xij=1,否则xij=0。该问题的规划模型:njixxnjxnixtsxcijijniijnjijninjijij,...2,1,10)(,...2,11)(,...2,11..max1111或每事一人做每人做一事人事1事2事3事4事5事61201516547217153312863912181630134128112719145-7102110326---61113说明:其中“-”表示某人无法做该事。可令其为-(表示绝对不行)或0(领薪不用干活)LINGO求解程序:MODEL:sets:Imark/1..6/:i;Jmark/1..6/:j;IJmark(Imark,Jmark):c,x;endsetsdata:!第i人做第j事的收益;c=20,15,16,5,4,717,15,33,12,8,69,12,18,16,30,1312,8,11,27,19,14-99,7,10,21,10,32-99,-99,-99,6,11,13;enddata[OBJ]max=@sum(IJmark(i,j):c*x);!每人做一项工作;@for(Imark(i):@SUM(Jmark(j):x(i,j))=1;);!每事一人做;@for(Jmark(j):@SUM(Imark(i):x(i,j))=1;);@for(IJmark:@bin(x));!本约束可以不要,因为有解时必为0或1;END4)(生产与销售计划问题)某公司用两种原油(A和B)混合加工成两种汽油(甲和乙)。甲、乙两种汽油含原油A的最低比例分别为50%和60%,每吨售价分别是4800元和5600元。该公司现有原油A和B的库存量分别为500吨和1000吨,还可以从市场上买到不超过1500吨的原油A。原油A的市场价为:购买量不超500吨时单价为10000元/吨;购买量超过500吨但不超1000吨时,超过500吨部分单价为8000元/吨;购买量超过1000吨部分的单价是6000元/吨。该公司应如何安排原油的采购和加工以获得最大利润?数学模型:设原油A用于生产甲、乙两种汽油的数量分别是x11和x12,原油B用于生产甲、乙两种汽油的数量分别是x21和x22;购买原油A的数量是x吨,采购支出为c(x)千元/吨。150010006300010005008100500010)(0,,,,6.05.015001000500..)()(6.5)(8.4max222112112212122111112221121122122111xxxxx
本文标题:LINGO软件简介
链接地址:https://www.777doc.com/doc-2884596 .html