运筹学-最大流问题的编程实现实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验7 最大流问题的编程实现
专业班级学号姓名报告日期.
实验类型:●验证性实验○综合性实验○设计性实验
实验目的:熟练最大流问题的求解算法。
实验内容:最大流问题的求解算法。
实验原理:先给定初始可行流,然后找出可扩充路(增广链),调整可扩充路上的流量,使可行流增大,不断重复上述过程,直到不存在可扩充路为止。
实验步骤
1 要求上机实验前先编写出程序代码
2 编辑录入程序
3 调试程序并记录调试过程中出现的问题及修改程序的过程
4 经反复调试后,运行程序并验证程序运行是否正确。
5 记录运行时的输入和输出。
预习编写程序代码:
实验报告:根据实验情况和结果撰写并递交实验报告。
实验总结:
参考程序
求最大流
>> n=6;
>> C=[0 6 7 0 0 0;0 0 3 8 4 0;0 0 0 3 5 0;0 0 0 0 0 10;0 0 0 6 0 14;0 0 0 0 0 0];
>> [f,wf,No]=maxflow(n,C)
f =
0 6 7 0 0 0
0 0 0 6 0 0
0 0 0 3 4 0
0 0 0 0 0 9
0 0 0 0 0 4
0 0 0 0 0 0
wf =
13
No =
7 0 0 0 0 0
由运行结果知,最大流量为13.
程序代码
function [f,wf,No]=maxflow(n,C)
% 利用Ford--Fulkerson 标号法求最大流算法的MA TLAB 程序代码
% f %显示最大流
V 4 V 6 V 5
V 3 V 1 6
7
3 3
4 8
5 6
14 10 V 2
% 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) 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