您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > Lingo超经典案例大全
Lingo超经典案例大全LINGO是LinearInteractiveandGeneralOptimizer的缩写,即“交互式的线性和通用优化求解器”。Lingo超强的优化计算能力在很多方面(线性规划、非线性规划、线性整数规划、非线性整数规划、非线性混合规划、二次规划等)比matlab、maple等强得多,Lingo编程简洁明了,数学模型不用做大的改动(或者不用改动)便可以直接采用Lingo语言编程,十分直观。Lingo模型由4个段构成:(1)集合段(setsendsets);(2)数据段(dataenddata);(3)初始段(initendinit);(4)目标与约束段。Lingo的五大优点:1.对大规模数学规划,LINGO语言所建模型较简洁,语句不多;2.模型易于扩展,因为@FOR、@SUM等语句并没有指定循环或求和的上下限,如果在集合定义部分增加集合成员的个数,则循环或求和自然扩展,不需要改动目标函数和约束条件;3.数据初始化部分与其它部分语句分开,对同一模型用不同数据来计算时,只需改动数据部分即可,其它语句不变;4.“集合”是LINGO有特色的概念,它把实际问题中的事物与数学变量及常量联系起来,是实际问题到数学量的抽象,它比C语言中的数组用途更为广泛。5.使用了集合以及@FOR、@SUM等集合操作函数以后可以用简洁的语句表达出常见的规划模型中的目标函数和约束条件,即使模型有大量决策变量和大量数据,组成模型的语句并不随之增加.一、求解线性整数规划、非线性整数规划问题:1.线性整数规划:model:max=x1+x2;x1+9/14*x2=51/14;-2*x1+x2=1/3;@gin(x1);@gin(x2);end求得x1=3,x2=1,最大值为4.运用matlab求时可以发现有两组解:x1=3,x2=1和x1=2,x2=2。通过验证也可知这两组解均满足。Lingo的一个缺陷是:每次只能输出最优解中的一个(有时不只一个)。那么,怎样求得其他解呢?一个办法是将求得的解作为约束条件,约束x1不等于3,x2不等于1,再求解。如下:model:max=x1+x2;x1+9/14*x2=51/14;-2*x1+x2=1/3;@gin(x1);@gin(x2);@abs(x1-3)0.001;@abs(x2-1)0.001;end求得x1=2,x2=2.若再次排除这组解,发现Lingo解不出第三组解了,这时我们可以断定:此优化模型有两组解:x1=3,x2=1和x1=2,x2=2.求解模型时需注意:Lingo中,默认变量均为非负;输出的解可能是最优解中的一组,要判断、检验是否还有其他解(根据具体问题的解的情况或用排除已知最优解的约束条件法)。2、非线性整数规划:model:sets:row/1..4/:b;col/1..5/:c1,c2,x;link(row,col):a;endsetsdata:c1=1,1,3,4,2;c2=-8,-2,-3,-1,-2;a=11111122162160000115;b=400,800,200,200;enddatamax=@sum(col:c1*x^2+c2*x);@for(row(i):@sum(col(j):a(i,j)*x(j))b(i));@for(col:@gin(x));@for(col:@bnd(0,x,99));End求得:x1=50,x2=99,x3=0,x4=99,x5=20.最大值为51568。这里,我们看不出是否还有其他解,需要将已知的最优解排除掉。利用1的方法分别可得到其他解:x1=48,x2=98,x3=1,x4=98,x5=19.最大值为50330。x1=45,x2=97,x3=2,x4=97,x5=18.最大值为49037。x1=43,x2=96,x3=3,x4=96,x5=17.最大值为47859。x1=40,x2=95,x3=4,x4=95,x5=16.最大值为46636。......发现x1,x2,x4,x5均单调减少,x3单调增加。最大值越来越小。可以简单判断第一组为最优的。当然,能够一一检验最好。二、最优选择问题某钻井队要从10个可供选择的井位中确定5个钻井探油,使总的钻探费用为最小。若10个井位的代号为s1,s2,...,s10,相应的钻探费用c1,c2,...,c10为5,8,10,6,9,5,7,6,10,8.并且井位选择上要满足下列限制条件:(1)或选择s1和s7,或选择钻探s9;(2)选择了s3或s4就不能选s5,或反过来也一样;(3)在s5,s6,s7,s8中最多只能选两个.试建立这个问题的整数规划模型,确定选择的井位。取0-1变量s_i,若s_i=1,则表示选取第i个井,若s_i=0,则表示不选取第i个井。建立数学模型如下:model:sets:variables/1..10/:s,cost;endsetsdata:cost=581069576108;enddatamin=@sum(variables:cost*s);(s(1)+s(7)-2)*(s(9)-1)=0;s(3)*s(5)+s(4)*s(5)=0;@sum(variables(i)|i#ge#5#and#i#le#8:s(i))=2;@sum(variables:s)=5;@for(variables:@bin(s));end求得:Totalsolveriterations:26VariableValueReducedCostS(1)1.000000-4.000000S(2)1.0000000.000000S(3)0.0000002.000000S(4)1.000000-2.000000S(5)0.0000000.000000S(6)1.000000-1.000000S(7)1.0000000.000000S(8)0.0000000.000000S(9)0.0000002.000000S(10)0.0000000.000000Objectivevalue:31.00000即选择井S1,S2,S4,S6,S7以达到最小费用31.三、路径和最短问题:设平面上有N个点,求一点,使得这个点到所有点距离之和最小。这里,取N=8。数据点是1~5的随机数。Lingo:model:sets:position/1..8/:x,y;ab/1/:a,b;endsetsdata:@text('E:\matlab7.0\work\data.txt')=x,y;!读入到matlab的工作空间中;@text('E:\matlab7.0\work\data1.txt')=a,b;enddatax(1)=1+4*@rand(0.12345);y(1)=1+4*@rand(0.25);@for(position(i)|i#ge#2:x(i)=1+4*@rand(x(i-1)));!随机产生1~5中的8个点;@for(position(i)|i#ge#2:y(i)=1+4*@rand(y(i-1)));[obj]min=@sum(position(i):@sqrt((x(i)-a(1))^2+(y(i)-b(1))^2));!目标函数;@bnd(1,a(1),5);@bnd(1,b(1),5);endmatlab:clear;clc;closeall;load('data.txt');load('data1.txt');holdon;plot(data1(1),data1(2),'o','MarkerSize',15,'MarkerFaceColor','r');plot(data(:,1),data(:,2),'or','MarkerSize',15,'MarkerFaceColor','b');set(gcf,'Color','w');set(gca,'FontSize',16)gridoff;data1=repmat(data1,8,1);P=[data1(:,1)';data(:,1)'];Q=[data1(:,2)';data(:,2)'];plot(P,Q,'g','LineWidth',2);xlabel('x');ylabel('y');title('Solvingtheproblemoftheminimundistanceoftnesumofallthebluepointstowardsthebeingknownredpoint.');gtext(['Theminimundistanceis',num2str(10.2685),'.'],'FontSize',16,'Color','r');三、运输+选址问题:某公司有6个建筑工地,位置坐标为(ai,bi)(单位:公里),水泥日用量di(单位:吨)i123456a1.258.750.55.7537.25b1.250.754.7556.57.75d3547611(1)现有2料场,位于A(5,1),B(2,7),记(xj,yj),j=1,2,日储量ej各有20吨。假设料场和工地之间有直线道路,制定每天的供应计划,即从A,B两料场分别向各工地运送多少吨水泥,使总的吨公里数最小。取决策变量c_ij表示i工地从j料场运来的水泥量。模型(线性模型)为:model:sets:demand/1..6/:a,b,d;supply/1..2/:x,y,e;link(demand,supply):c;endsetsdata:a=1.258.750.55.7537.25;b=1.250.754.7556.57.75;d=3547611;x=52;y=17;e=2020;enddata[obj]min=@sum(link(i,j):c(i,j)*@sqrt((a(i)-x(j))^2+(b(i)-y(j))^2));!目标函数;@for(demand(i):@sum(supply(j):c(i,j))=d(i));@for(supply(j):@sum(demand(i):c(i,j))=e(j));end求得:C(1,1)3.000000C(1,2)0.000000C(2,1)5.000000C(2,2)0.000000C(3,1)0.000000C(3,2)4.000000C(4,1)7.000000C(4,2)0.000000C(5,1)0.000000C(5,2)6.000000C(6,1)1.000000C(6,2)10.00000Objectivevalue:136.2275(2)改建两个新料场,需要确定新料场位置(xj,yj)和运量cij,在其它条件不变下使总吨公里数最小。模型一样,未知量变为料场位置(xj,yj)和运量cij,变为非线性优化问题。model:sets:demand/1..6/:a,b,d;supply/1..2/:x,y,e;link(demand,supply):c;endsetsdata:a=1.258.750.55.7537.25;b=1.250.754.7556.57.75;d=3547611;e=2020;enddatainit:x=52;y=17;endinit[obj]min=@sum(link(i,j):c(i,j)*@sqrt((a(i)-x(j))^2+(b(i)-y(j))^2));!目标函数;@for(demand(i):@sum(supply(j):c(i,j))=d(i));@for(supply(j):@sum(demand(i):c(i,j))=e(j));@for(supply:@free(x);@free(y));end求得:C(1,1)3.000000C(1,2)0.000000C(2,1)0.000000C(2,2)5.000000C(3,1)4.000000C(3,2)0.000000C(4,1)7.000000C(4,2)0.000000C(5,1)6.000000C(5,2)0.000000C(6,1)0.000000C(6,2)11.00000(x1,y1
本文标题:Lingo超经典案例大全
链接地址:https://www.777doc.com/doc-1388580 .html