最大流、最小費用最大流、最小生成樹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

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