我正在尝试编写一个脚本来查找典型的最大流量问题中从源到接收器的所有路径。在将Ford-Fulkerson算法作为类项目的实现中,此总体操作将作为第一步。
我已经进行了一些基本的调试,但是似乎正在发生的事情是该算法并没有通过for循环产生应有的所有子代,而是只找到相同的路径几次然后终止。 / p>
#pathfinder
function final=pathFinder(A,path) #call with path=1 to initiate
#A is a matrix that looks like
# u v w where uv is an edge, and w is its weight (weight is used later)
vert=path(numel(path)); #get last vertex used
F=find(A(:,1)'==vert); #find incident edges
disp("F is");
disp(F); #displaying these for debugging purposes
if(sum(F)==0) #terminates with no more edges (happens only at sink)
#save externally
disp("path found!");
disp(path);
final=0; #terminate it
else
for i=1:numel(F) #this should split this up in "children" for recursion, but it does not. Why?
b=F(i);
path=[path, A(b,2)]; #add new vertex/edge to path
disp("non-final path");
disp(path);
disp("going deeper");
final=pathFinder(A,path); #recurs on next vertex
endfor
endif
endfunction
我正在使用的示例图是
A=[1 2 0; 1 3 0; 2 3 0; 2 4 0; 3 4 0];
应具有路径[1 2 3 4],[1 2 4],[1 3 4](按算法顺序)。
答案 0 :(得分:2)
您的代码有两个问题:
vert=path(numel(path))
说,路径中的元素数量是您要从其开始的顶点索引。错了您需要使用vert=path(end)
,即路径中的最后一个元素。
在循环中,您更新path
。因此,下一次循环迭代将使用修改后的path
,而不是回溯。您需要将path
输入修改为下一个递归调用,而不是本地path
变量。
这是更正的代码:
function pathFinder(A,path) % call with path=1 to initiate
% A is a matrix that looks like
% u v w where uv is an edge, and w is its weight (weight is used later)
vert=path(end); % get last vertex used
F=find(A(:,1)'==vert); % find incident edges
if isempty(F) % terminates with no more edges (happens only at sink)
% save externally
disp(path);
else
for b=F % loop over the incident edges
pathFinder(A,[path, A(b,2)]); % recurse on next vertex
end
end
end
为简洁起见,我删除了调试输出。我还将一些仅使用八度音阶的内容(endfor
,#
注释)更改为也可以在MATLAB中运行的内容。