logo资料库

Lingo超经典案例大全.doc

第1页 / 共21页
第2页 / 共21页
第3页 / 共21页
第4页 / 共21页
第5页 / 共21页
第6页 / 共21页
第7页 / 共21页
第8页 / 共21页
资料共21页,剩余部分请下载后查看
Lingo 超经典案例大全 LINGO 是 Linear Interactive and General Optimizer 的缩写,即“交互式的线性和通用优化 求解器”。Lingo 超强的优化计算能力在很多方面(线性规划、非线性规划、线性整数规划、 非线性整数规划、非线性混合规划、二次规划等)比 matlab、maple 等强得多,Lingo 编程 简洁明了,数学模型不用做大的改动(或者不用改动)便可以直接采用 Lingo 语言编程,十 分直观。 Lingo 模型由 4 个段构成: (1)集合段(sets endsets);(2)数据段(data enddata); (3)初始段(init endinit);(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; endsets data: c1=1,1,3,4,2;
c2=-8,-2,-3,-1,-2; a=1 1 1 1 1 1 2 2 1 6 2 1 6 0 0 0 0 1 1 5; b=400,800,200,200; enddata max=@sum(col:c1*x^2+c2*x); @for(row(i):@sum(col(j):a(i,j)*x(j))
model: sets: variables/1..10/:s,cost; endsets data: cost=5 8 10 6 9 5 7 6 10 8; enddata min=@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 求得: iterations: 26 ue Reduced Cost Total solver Variable S( 1) Val 1.0000
00 00 00 00 00 00 00 00 00 0 -4.000000 0.000000 2.000000 -2.000000 0.000000 -1.000000 0.000000 0.000000 2.000000 0.000000 S( 2) S( 3) S( 4) S( 5) S( 6) S( 7) S( 8) S( 9) 1.0000 0.0000 1.0000 0.0000 1.0000 1.0000 0.0000 0.0000 S( 10) 0.00000 value: 31.00000 即选择井 S1,S2,S4,S6,S7 以达到最小费用 31. Objective 三、路径和最短问题: 设平面上有 N 个点,求一点,使得这个点到所有点距离之和最小。这里,取 N=8。数据点是 1~5 的随机数。 Lingo: model: sets: position/1..8/:x,y; ab/1/:a,b; endsets data: @text('E:\matlab7.0\work\data.txt')=x,y;!读入到 matlab 的工作空间中; @text('E:\matlab7.0\work\data1.txt')=a,b; enddata x(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); end matlab: clear; clc; close all; load('data.txt'); load('data1.txt'); hold on; 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) grid off; 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('Solving the problem of the minimun distance of tne sum of all the blue points towards the being known red point.'); gtext(['The minimun distance is ',num2str(10.2685),'.'],'FontSize',16,'Color','r');
三、运输+选址问题: 某公司有 6 个建筑工地,位置坐标为(ai, bi) (单位:公里),水泥日用量 di (单位:吨) i a b d 1 5 1.25 1.25 3 6.5 3 2 6 8.75 7.25 0.75 7.75 5 0.5 4.75 3 4 5.75 5 4 7 6 11 (5, (1)现有 2 料场,位于 A 假设料场和工地之间有直线道路,制定每天的供应计划,即从 A, B 两料场分别 向各工地运送多少吨水泥,使总的吨公里数最小。 取决策变量 c_ij 表示 i 工地从 j 料场运来的水泥量。模型(线性模型)为: 7),记(xj,yj),j=1,2, 日储量 ej 各有 20 吨。 1), B (2,
model: sets: demand/1..6/:a,b,d; supply/1..2/:x,y,e; link(demand,supply):c; endsets data: a=1.25 8.75 0.5 5.75 3 7.25; b=1.25 0.75 4.75 5 6.5 7.75; d=3 5 4 7 6 11; x=5 2; y=1 7; e=20 20; 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) C( 1, 2) C( 2, 1) C( 2, 2) C( 3, 1) C( 3, 2) C( 4, 1) 3.000000 0.000000 5.000000 0.000000 0.000000 4.000000 7.000000
分享到:
收藏