最大流、最小费用最大流、最小生成树lingo

最小生成树

model:
sets:
city/1..7/:u;
links(city,city):dist,x;
endsets
data:
!dist是距离矩阵;
dist=0 3 4 7 100 100 100
     3 0 3 2 4 100 100
     4 3 0 100 5 7 100
     7 2 100 0 2 100 6
     100 4 5 2 0 1 4
     100 100 7 100 1 0 2
     100 100 100 6 4 2 0; 
enddata
!目标函数最小生成树;
min=@sum(links:dist*x);
@for(links:@bin(x));
n=@size(city);
@for(links(i,j)|i#eq#j:x(i,j)=0);
!生成树的必要条件;
@sum(links(i,j):x(i,j))=n-1;
!必有一条路径从根结点引出;
@sum(city(i):x(1,i))>=1;
!所有的路径只能用一次(不可能在一条路上来回走);
@for(links(i,j):x(i,j)+x(j,i)<=1);
!对于所有的非根结点必有线路通到;
@for(city(k)|k#gt#1:@sum(city(i):x(i,k))=1;
!重要条件:保证所选的边不构成圈;
         @for(city(j)|j#gt#1#and#j#ne#k:u(j)>=u(k)+x(k,j)-(n-2)*(1-x(k,j))+(n-3)*x(j,k);););
u(1)=0;
@for(city(i)|i#gt#1:u(i)>=1;
                    u(i)<=n-1-(n-2)*x(1,i););
end

最大流

model:
sets:
chsh/1..6/;
!6,1为虚拟弧 c为该弧的最大容量 f为该弧流流量;
links(chsh,chsh)/1,2 1,3 2,4 2,5 3,4 3,5 4,6 5,6 6,1/:c,f;
endsets
data:
!虚拟弧流量不受限制(很大的正数);
c=16 20 10 10 6 6 10 16 1000;
enddata
!目标函数为虚拟弧流量;
max=f(6,1);
!流量限制;
@for(links:f<=c);
!每个节点流进等于流出;
@for(chsh(i):@sum(links(i,j):f(i,j))=
             @sum(links(j,i):f(j,i)));
end

最小费用最大流

model:
sets:
chsh/1..6/;
!6,1是虚拟弧,u是流量限制,c为费用,f为实际流量;
links(chsh,chsh)/1,2 1,3 2,3 2,4 3,5 4,3 4,6 5,4 5,6 6,1/:c,u,f;
endsets
data:
u=8 7 5 9 9 2 5 6 10 15;
c=2 8 5 2 3 1 6 4 7 0;
enddata
!最小费用为目标函数;
min=@sum(links:c*f);
n=@size(chsh);
!把最大流做为约束条件;
f(6,1)=14;
!各条线路的流量限制;
@for(links:f<u);
!各节点流入等于流出;
@for(chsh(i):@sum(links(i,j):f(i,j))=
             @sum(links(j,i):f(j,i)));
end

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章