最大二分匹配方法中的错误
Error in an approach to Maximum Bipartite matching
具有源和汇的二分图如下所示。每条边的容量为 1 个单位:
Source : GeeksforGeeks
我试图找到从源到汇的最大流量。一种方法是使用 Ford-Fulkerson 算法解决最大流问题,该算法适用于所有图形。
我找到了一种找到最大流量的简单方法(太简单了,不可能正确!)但我无法在该方法中发现任何错误。
方法:
c1 = 在具有出边的顶点列表中计算具有非零边数的顶点的数量。
c2 = 在具有传入边的顶点列表中计算具有非零边数的顶点的数量。
最大流量将是这两个数字中的最小值,即 min(c1,c2)。[因为任何路径都需要传出顶点列表中的一个顶点,以及传入顶点列表中的其他顶点。]
如有任何帮助,我们将不胜感激。
考虑像这样的图表
*--*
/
/
* *
/
/
*--*
(连接组件工作的补丁不能解决问题;连接左下角到右上角。)
没有确切答案,但我有一个有效的迭代算法。
对我来说,你显然需要平衡流,以便它分布在可以将它发送到可以接收它的右顶点的左顶点中。
假设您使用包含二分链接的矩阵 A 对您的情况进行建模。然后,您可以假设,如果您的矩阵恰好包含您想要通过边的流量(介于 0 和 1 之间),那么给出此决定的总流量为 b=A*a,其中 a 是一个向量。
如果您从 A 的最大容量开始,将所有边设为 1,将所有其他边设为 0,则 b 中的某些元素可能大于 1,但您可以减少 A 中它们对应的元素,使它们通过较少的流量。
然后你可以逆流看看你的二分体最大接收能力是多少,用a=A'b测试一下。
同样,您可能拥有大于 1 的 a 元素,这意味着理想流将大于从源到元素的可能容量,并减少 A 流中的这些元素。
使用此 ping-pong 算法并逐步减少校正,您可以保证收敛于最佳矩阵。
给定一个最终的 b=Aa 和一个向量,你的最大流量将是 sum(b)。
看下面的octave代码,我用B作为收敛矩阵,大家有意见可以留言。
A=[0 1 0 1;1 0 0 1;1 1 0 0;0 0 1 0];
B=A;
repeat
b=B*ones(4,1);
B=B.*([.8 .8 .8 1]'*ones(1,4));
a=B'*ones(4,1)
B=B.*(ones(4,1)*[.9 .9 1 .9]);
until converge
maxflow=sum(b)
具有源和汇的二分图如下所示。每条边的容量为 1 个单位: Source : GeeksforGeeks
我试图找到从源到汇的最大流量。一种方法是使用 Ford-Fulkerson 算法解决最大流问题,该算法适用于所有图形。 我找到了一种找到最大流量的简单方法(太简单了,不可能正确!)但我无法在该方法中发现任何错误。
方法:
c1 = 在具有出边的顶点列表中计算具有非零边数的顶点的数量。
c2 = 在具有传入边的顶点列表中计算具有非零边数的顶点的数量。
最大流量将是这两个数字中的最小值,即 min(c1,c2)。[因为任何路径都需要传出顶点列表中的一个顶点,以及传入顶点列表中的其他顶点。]
如有任何帮助,我们将不胜感激。
考虑像这样的图表
*--*
/
/
* *
/
/
*--*
(连接组件工作的补丁不能解决问题;连接左下角到右上角。)
没有确切答案,但我有一个有效的迭代算法。 对我来说,你显然需要平衡流,以便它分布在可以将它发送到可以接收它的右顶点的左顶点中。 假设您使用包含二分链接的矩阵 A 对您的情况进行建模。然后,您可以假设,如果您的矩阵恰好包含您想要通过边的流量(介于 0 和 1 之间),那么给出此决定的总流量为 b=A*a,其中 a 是一个向量。 如果您从 A 的最大容量开始,将所有边设为 1,将所有其他边设为 0,则 b 中的某些元素可能大于 1,但您可以减少 A 中它们对应的元素,使它们通过较少的流量。 然后你可以逆流看看你的二分体最大接收能力是多少,用a=A'b测试一下。 同样,您可能拥有大于 1 的 a 元素,这意味着理想流将大于从源到元素的可能容量,并减少 A 流中的这些元素。 使用此 ping-pong 算法并逐步减少校正,您可以保证收敛于最佳矩阵。 给定一个最终的 b=Aa 和一个向量,你的最大流量将是 sum(b)。 看下面的octave代码,我用B作为收敛矩阵,大家有意见可以留言。
A=[0 1 0 1;1 0 0 1;1 1 0 0;0 0 1 0];
B=A;
repeat
b=B*ones(4,1);
B=B.*([.8 .8 .8 1]'*ones(1,4));
a=B'*ones(4,1)
B=B.*(ones(4,1)*[.9 .9 1 .9]);
until converge
maxflow=sum(b)