天天看点

数学建模 Lingo 基本算法模板

详细请看代码

旅行商问题

!旅行商问题;
sets:
city/1..6/:u;
link(city,city):x,d;
endsets

data:
d=
0 3 7 4 6 4
4 0 3 7 8 5
6 9 0 3 2 1
8 6 3 0 9 8
4 7 4 6 0 4
4 5 8 7 2 0;
enddata
n = @size(city);
min = @sum(link(i,j):d(i,j)*x(i,j));
@for(city(j):@sum(link(i,j)|i#ne#j:x(i,j))=1);
@for(city(i):@sum(link(i,j)|i#ne#j:x(i,j))=1);
@for(link(i,j)|i#ne#j#and#i#gt#1:u(i)-u(j)+n*x(i,j)<=n-1); !防止内循环;
@for(link(i,j):@bin(x(i,j)));
           

两点最短路径问题

!两点最短路径问题;
sets:
points/A B1 B2 B3 C1 C2 D1 D2 D3 E/;
roads(points,points)/
A,B1 A,B2 A,B3
B1,C1 B1,C2
B2,C1 B2,C2
B3,C1 B3,C2
C1,D1 C1,D2 C1,D3
C2,D1 C2,D2 C2,D3
D1,E
D2,E
D3,E/:w,x;
endsets
data:
w = 3 2 1
4 3
1 3
3 5
2 5 1
1 4 2
3
1
5;
enddata
n = @size(points);
min = @sum(roads(i,j):x(i,j)*w(i,j));
@for(points(i)|i#ne#1#and#i#ne#n:@sum(roads(i,j):x(i,j))
=@sum(roads(j,i):x(j,i)));
@sum(roads(i,j)|i#eq#1:x(i,j))=1;
@sum(roads(i,j)|j#eq#n:x(i,j))=1;
@for(roads(i,j):@bin(x(i,j)));
           

最小生成树问题

!最小生成数问题;
sets:
city/1..8/:u;
link(city,city):x,r;
endsets
data:
r= 
0 200 500 600 99999 99999 99999 99999
200 0 99999 300 800 99999 900 99999
600 99999 0 100 99999 400 99999 99999
500 300 100 0 500 200 99999 99999
99999 800 99999 500 0 200 300 99999
99999 99999 400 200 200 0 400 100
99999 900 99999 99999 300 400 0 500
99999 99999 99999 99999 99999 100 500 0;
enddata

n = @size(city);
min = @sum(link(i,j):x(i,j)*r(i,j));
@sum(city(i)|i#gt#1:x(1,i))>=1;!可能出现1~3的情况;
@for(city(j)|j#ne#1:@sum(link(i,j)|i#ne#j:x(i,j))=1);
@for(link(i,j)|j#ne#1#and#i#ne#j:u(j)>=u(i)+x(i,j)-(n-2)*(1-x(i,j))
+(n-3)*x(j,i));!消除回路;
@for(city(i):@bnd(1,u(i),99999));
@for(link(i,j):@bin(x(i,j)));
           

指派问题

!指派问题;
model:
sets:
num_i/1..5/:;
link(num_i,num_i):x,c;
endsets

data:
c=12 7 9 7 9
8 9 6 6 6
7 17 12 14 9
15 14 6 6 10
4 10 7 10 9;
enddata

min = @sum(link(i,j):x(i,j)*c(i,j));
@for(num_i(i):@sum(link(i,j):x(i,j))=1);
@for(num_i(j):@sum(link(i,j):x(i,j))=1);
@for(link(i,j):@bin(x(i,j)));
end
           

最大流问题

!最大流问题;
model:
sets:
 nodes/s,1,2,3,4,5,6,7,8,9,t/;
 arcs(nodes,nodes)/s,1 s,7 1,2 1,4 2,3 3,t 4,5 5,2 5,6 5,8 6,3 6,9 7,4 7,8 8,9 9,t/:c,f;
endsets
data:
 c=16 15 10 6 11 17 20 6 8 5 6 5 5 10 11 16;
enddata
max=flow;
@for(nodes(i)|i #ne#1 #and# i #ne# @size(nodes):
@sum(arcs(i,j):f(i,j))-@sum(arcs(j,i):f(j,i))=0);
@sum(arcs(i,j)|i #eq# 1:f(i,j))=flow;
@for(arcs:@bnd(0,f,c));
end
           

继续阅读