推重新算法

时间:2013-01-25 21:36:22

标签: global heuristics push-relabel gaps-in-data

我已经完成了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

有人可以指导,展示或帮助我吗?

0 个答案:

没有答案