Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 工程数学软件 > MATLAB论坛
MATLAB论坛 一切MATLAB相关问题在此讨论。
 
 
主题工具 显示模式
旧 2013-05-10, 11:32   #1
jady
初级会员
 
注册日期: 2013-05-10
年龄: 36
帖子: 1
声望力: 0
jady 正向着好的方向发展
默认 matlab求最大流问题

如下图,我的代码只能求指定两点的最大流,例如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]
上传的图像
文件类型: jpg 无标题.jpg (7.9 KB, 8 次查看)
jady 当前离线   回复时引用此帖
 


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码



所有时间均为北京时间。现在的时间是 11:23


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.