运筹学-最大流问题的编程实现实验

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档