Lingo超经典案例大全.docx
《Lingo超经典案例大全.docx》由会员分享,可在线阅读,更多相关《Lingo超经典案例大全.docx(21页珍藏版)》请在冰豆网上搜索。
Lingo超经典案例大全
Lingo超经典案例大全
LINGO是LinearInteractiveandGeneralOptimizer的缩写,即“交互式的线性和通用优化求解器”。
Lingo超强的优化计算能力在很多方面(线性规划、非线性规划、线性整数规划、非线性整数规划、非线性混合规划、二次规划等)比matlab、maple等强得多,Lingo编程简洁明了,数学模型不用做大的改动(或者不用改动)便可以直接采用Lingo语言编程,十分直观。
Lingo模型由4个段构成:
(1)集合段(sets endsets);
(2)数据段(data enddata);
(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;
endsets
data:
c1=1,1,3,4,2;
c2=-8,-2,-3,-1,-2;
a=11111
12216
21600
00115;
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))
@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;
endsets
data:
cost=581069576108;
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
求得:
Totalsolveriterations:
26
Variable Value ReducedCost
S
(1) 1.000000 -4.000000
S
(2) 1.000000 0.000000
S(3) 0.000000 2.000000
S(4) 1.000000 -2.000000
S(5) 0.000000 0.000000
S(6) 1.000000 -1.000000
S(7) 1.000000 0.000000
S(8) 0.000000 0.000000
S(9) 0.000000 2.000000
S(10) 0.000000 0.000000
Objectivevalue:
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;
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;
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(单位:
吨)
i 1 2 3 4 5 6
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
(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;
endsets
data:
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.000000
C(1,2) 0.000000
C(2,1) 5.000000
C(2,2) 0.000000
C(3,1) 0.000000
C(3,2) 4.000000
C(4,1) 7.000000
C(4,2) 0.000000
C(5,1) 0.000000
C(5,2) 6.000000
C(6,1) 1.000000
C(6,2) 10.00000
Objectivevalue:
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;
endsets
data:
a=1.258.750.55.7537.25;
b=1.250.754.7556.57.75;
d=3547611;
e=2020;
enddata
init:
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.000000
C(1,2) 0.000000
C(2,1) 0.000000
C(2,2) 5.000000
C(3,1) 4.000000
C(3,2) 0.000000
C(4,1) 7.000000
C(4,2) 0.000000
C(5,1) 6.000000
C(5,2) 0.000000
C(6,1) 0.000000
C(6,2) 11.00000
(x1,y1)=(3.254884,5.652331)
(x2,y2)=(7.250000,7.750000)
Objectivevalue:
85.26604
四、路径最短问题:
如上图,求从S到T的最短路径。
设d(x,y):
城市x与城市y之间的直线距离;L(x):
城市S到城市x的最优行驶路线的路长。
模型为:
min{L(x)+d(x,y)}
L(S)=0
model:
sets:
city/S,A1,A2,A3,B1,B2,C1,C2,T/:
L;
road(city,city)/S,A1S,A2S,A3A1,B1A1,B2A2,B1A2,B2A3,B1A3,B2B1,C1B1,C2B2,C1B2,C2C1,TC2,T/:
d;
endsets
data:
d=633
658674
6789
56;
L=0,6,3,3,,,,,;
enddata
@for(city(j)|j#gt#@index(city,S):
L(j)=@min(road(i,j):
L(i)+d(i,j)));
end
求得最短路径为20.
五、指派问题(0-1规划问题):
四个人完成4项任务所用的时间如下,问如何指派任务使得完成所有任务的时间最短?
任务 t1 t2 t3 t4
人员
m1 2 15 13 4
m2 10 4 14 15
m3 9 14 16 13
m4 7 8 11 9
c_ij:
表示第i个人完成第j项任务所用的时间;
决策变量x_ij:
若第i个人选择第j项任务则x_ij=1;否则,x_ij=0;
模型为:
model:
sets:
task/1..4/:
t;
man/1..4/:
m;
link(man,task):
c,x;
endsets
data:
c=215134
1041415
9141613
78119;
enddata
[obj]min=@sum(link:
c*x);
@for(task(j):
@sum(man(i):
x(i,j))=1);
@for(man(i):
@sum(task(j):
x(i,j))=1);
@for(link:
@bin(x));
end
求得:
最优指派为:
m1--t4,m2--t2,m3--t1,m4--t3
最优值为:
28。
六、装配线平衡模型(0-1规划问题)
11件任务(A—K)分配到4个工作站(1—4),任务的优先次序如下图,每件任务所花费的时间如下表。
目标是为每个工作站分配加工任务,尽可能使每个工作站执行相同的任务量,其最终装配线周期最短。
任务A B C D E F G H I J K
时间 45 11 9 5015121212 12 8 9
T(i):
为完成第i项任务需要的时间。
SETS:
TASK/ A B C D E F G H I J K/:
T; !
任务集合,有一个完成时间属性 T;
PRED( TASK, TASK)/ A,B B,C C,F C,G F,J G,J
J,K D,E E,H E,I H,J I,J /; !
任务之间的优先关系集合(A 必须完成才能开始 B,等等);
STATION/1..4/; !
工作站集合;
TXS( TASK, STATION):
X;!
X 是派生集合 TXS 的一个属性。
如果 X(I,K)=1,则表
示第 I 个任务指派给第 K 个工作站完成;
ENDSETS
DATA:
T = 45 11 9 50 15 12 12 12 12 8 9; !
任务 A B C D E F G H I J K 的完成时间;
ENDDATA
@FOR( TASK( I):
@SUM( STATION( K):
X( I, K)) = 1); !
每一个作业必须指派到一个工
作站;
@FOR( PRED( I, J):
@SUM( STATION( K):
X(I, K))-@SUM( STATION( K):
X(J,
K) )>=0) ; !
对于每一个存在优先关系的作业对(I,J)来说,I先J后安排;
@FOR( STATION( K):
@SUM( TXS( I, K):
T( I) * X( I, K)) <= CYCTIME); !
对于每一个
工作站来说,其花费时间必须不大于装配线周期;
MIN = CYCTIME; !
目标函数是最小化转配线周期;
@FOR( TXS:
@BIN( X)); !
指定 X(I,J) 为 0/1 变量;
END
解得最短周期为50.
分配情况为:
A-1,B-3,C-4,D-2,E-3,F-4,G-4,H-3,I-3,J-4,K-4.
七、选址问题
某海岛上有12个主要的居民点,每个居民点的位置(用平面坐标x,y表示,距离单位:
km)和居住的人数(r)如下表所示。
现在准备在海岛上建一个服务中心为居民提供各种服务,那么服务中心应该建在何处?
x08.200.505.700.772.874.432.580.729.763.195.55
y00.504.905.006.498.763.269.329.963.167.207.88
r6001000800140012007006008001000120010001100
设建在(a,b)处最合理。
建立模型:
MODEL:
SETS:
VAR/1..12/:
X,Y,R;
ENDSETS
DATA:
X=08.200.505.700.772.874.432.580.729.763.195.55;
Y=00.504.905.006.498.763.269.329.963.167.207.88;
R=6001000800140012007006008001000120010001100;
ENDDATA
MIN=@SUM(VAR:
@SQRT((X-A)^2+(Y-B)^2)