二分最小边

时间:2012-11-28 15:05:35

标签: graph-theory bipartite

我正在寻找一种简单的算法,在二分图的边缘中获得最小加权边。我搜索过,我都知道它意味着二分的封面边缘,换句话说,如果我们有二分图并且每条边都有一个数字权重如何得到它们中最小的数字

example

3 个答案:

答案 0 :(得分:0)

提出这个问题的方式使得它非常不清楚。我得到的解释之一是:"给定加权二分图G,我如何获得G的最小边缘覆盖?"。如果是这种情况,那么Hungarian algorithm(另请参阅http://reference.wolfram.com/mathematica/ref/FindEdgeCover.html)也可以解决您的问题。

答案 1 :(得分:0)

你需要匈牙利算法。 点击here 得到讲义。

在处理之前,您应该有一个成本矩阵,其中每个条目都是边际成本 从节点A到节点B.匹配步骤如下:


  1. Substract每行中的最小条目
  2. Substract每列中的最小条目
  3. 通过适当的行和列绘制线条,以便这样做  成本矩阵的所有零条目都被覆盖了  
  4. 使用这些行的最小数量
  5. 最佳测试: (1)如果覆盖线的最小数量是n,则可以进行最佳分配并完成。 (2)如果最小覆盖线数小于n,则不可能进行零的最佳分配。 GOTO第5步。
  6. 确定任何行未涵盖的最小条目。从每个未覆盖的行中提取条目,然后将其添加到每个覆盖的列。返回第3步。

  7. 上述算法基于数学定理

    • 如果在成本矩阵的任何一行或列的所有条目中添加或减去数字,则对结果成本矩阵的最佳分配也是原始成本矩阵的最佳分配。

答案 2 :(得分:0)

比其他答案中建议的匈牙利算法更好的是Jonker-Volgenant(LAPJV)算法。

看看这个名为Bipartite Solver的GitHub存储库,它基本上是一个如何在代码中实现LAPJV的教程,并附带一个可运行的图形样本。

快速疯狂,能够在一秒钟内完成1000到1000次。

库中还包括贪婪搜索,这种搜索更快,但不保证最佳性。

如果您希望尝试算法而不必从源代码构建算法,那么该库也有一些executables