我已经完成了push-relabel FIFO代码的MATLAB版本(与维基百科上的版本完全相同并尝试过。放电功能与维基百科完全一样。
它适用于小图形(例如节点数= 7)。然而,当我增加我的图形尺寸(即节点/顶点的数量> 3500或更多)时,“relabel”函数运行得非常慢,这在“放电”功能中被调用。我的图表很大(即> 3000nodes),所以我需要优化我的代码。
我尝试根据WIKIPEDIA对全球重新贴标/间隙重新贴标的建议优化代码: 1)为每个节点创建邻居列表,让看到[u]的索引成为这个的迭代器,而不是范围。 2)使用间隙启发式。
我被困在第一个,我不明白我到底要做什么,因为看起来有细节遗漏了。 (我创建了邻居列表,对于顶点u,任何连接的节点v(1..n)到u已经在邻居列表中,只是不确定如何使用看到的[u]索引进行迭代)。
[r,c] = find(C);
uc = unique(c);
s = struct;
for i=1:length(uc)
ind = find(c == uc(i));
s(uc(i)).n = [r(ind)];
end
AND放电函数使用's'邻域结构列表:
while(excess(u)> 0)%test如果当前节点的过量是> 0,如果是的话......
if (seen(u) <= length(s(u).n)) %check next neighbor
v = s(u).n(seen(u));
resC = C(u,v) - F(u,v);
if ((resC > 0) && (height(u) == height(v) + 1)) %and if not all neighbours have been tried since last relabel
[C, F, excess] = push(C, F, excess, u, v); %push into untried neighbour
else
seen(u) = seen(u) + 1;
height = relabel(C, F, height, u, N);
end
else
height = relabel(C, F, height, u, N);
seen(u) = 1; %relabel start of queue
end
端
有人可以指导,展示或帮助我吗?