資源簡介
利用Ford--Fulkerson 標號法求最大流算法的MATLAB 程序代碼

代碼片段和文件信息
function?[fwfNo]=MaxFlowMinCut_Me(nC)?
%?利用Ford--Fulkerson?標號法求最大流算法的MATLAB?程序代碼?
%?f?%顯示最大流?
%?wf?%顯示最大流量?
%?No?%顯示標號?由此可得最小割?
%?n?節點個數?
%?C?%弧容量?
%?Example:?
%?????n=8;?
????C=[0?5?4?3?0?0?0?0?
???????0?0?0?0?5?3?0?0?
???????0?0?0?0?0?3?2?0?
???????0?0?0?0?0?0?2?0?
???????0?0?0?0?0?0?0?4?
???????0?0?0?0?0?0?0?3?
???????0?0?0?0?0?0?0?5?
???????0?0?0?0?0?0?0?0];??
%??????[fwfNo]=MaxFlowMinCut_Me(nC)?
??????
for(i=1:n)for(j=1:n)f(ij)=0;
????end;
end?%取初始可行流f?為零流?
for(i=1:n)No(i)=0;
????d(i)=0;
end?%Nod?記錄標號?
while(1)?
No(1)=n+1;
d(1)=Inf;?%給發點vs?標號?
while(1)pd=1;?%標號過程?
for(i=1:n)if(No(i))?%選擇一個已標號的點vi?
for(j=1:n)
????if(No(j)==0&f(ij) No(j)=i;
d(j)=C(ij)-f(ij);
pd=0;?
if(d(j)>d(i))d(j)=d(i);
end?
elseif(No(j)==0&f(ji)>0)?%對于未給標號的點vj?當vjvi?為非零流弧時?
No(j)=-i;
d(j)=f(ji);
pd=0;?
if(d(j)>d(i))d(j)=d(i);
end;
???end;
end;
????end;
end?
if(No(n)|pd)
????break;
end;
end?%若收點vt?得到標號或者無法標號?終止標號過程?
if(pd)
????break;
end?%vt?未得到標號?f?已是最大流?算法終止?
dvt=d(n);
t=n;?%進入調整過程?dvt?表示調整量?
while(1)?
if(No(t)>0)f(No(t)t)=f(No(t)t)+dvt;?%前向弧調整?
elseif(No(t)<0)f(No(t)t)=f(No(t)t)-dvt;end?%后向弧調整?
if(No(t)==1)
????for(i=1:n)No(i)=0;
????????d(i)=0;?
????end;
????break;
end?%當t?的標號為vs?時?終止調整過程?
t=No(t);
end;
end;?%繼續調整前一段弧上的流f?
wf=0;
for(j=1:n)wf=wf+f(1j);
end??
?
end
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????1573??2013-08-01?10:46??MaxFlowMinCut_Me.m
- 上一篇:hdb3編譯碼 matlab
- 下一篇:梯度校正參數辨識程序
評論
共有 條評論