![]() |
matlab求最大流问题
1 个附件
如下图,我的代码只能求指定两点的最大流,例如V1到V6,列出邻接矩阵C=[0 1 0 1 0 0,1 0 1 0 1 0,0 1 0 1 0 1,1 0 1 0 1 0,0 1 0 1 0 1,0 0 1 0 1 0];带入求解即可,但是若想求V2到V6的最大流,还得重新列矩阵输入很麻烦,求大神改进程序代码,可以通过一组矩阵求任意两点的最大流。
代码 ford-fulkerson标号算法 function [f,wf,No]=maxflow(n,C) % 利用Ford--Fulkerson 标号法求最大流算法的MATLAB 程序代码 % f %显示最大流 % wf %显示最大流量 % No %显示标号, 由此可得最小割 % n 节点个数 % C %弧容量 for(i=1:n) for(j=1:n) f(i,j)=0; end; end %取初始可行流f 为零流 for(i=1:n) No(i)=0; d(i)=0; end %No,d 记录标号 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(i,j)<C(i,j)) %对于未给标号的点vj, 当vivj 为非饱和弧时 No(j)=i;d(j)=C(i,j)-f(i,j); pd=0; if(d(j)>d(i)) d(j)=d(i); end elseif(No(j)==0&f(j,i)>0) %对于未给标号的点vj, 当vjvi 为非零流弧时 No(j)=-i; d(j)=f(j,i); 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(1,j); end end [IMG][IMG]http://www.labfans.com/bbs/attachment.php?attachmentid=3214&stc=1&d=1368156637[/IMG][/IMG] |
所有时间均为北京时间。现在的时间是 11:35。 |
Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.