【问题标题】:How do I find a weighted bipartite graph's minimum edge cover using Mathematica 8?如何使用 Mathematica 8 找到加权二部图的最小边覆盖?
【发布时间】:2011-09-11 02:23:04
【问题描述】:

在图论中,我们使用匈牙利算法来计算加权二分图的最小边覆盖(一组与每个顶点相关的边,总权重最小的边。)

我发现在 Mathematica 的新版本 8 中,有一个全新的 Graph Theory 函数包(以 Graph[] 开头。)但我没有找到任何可以完成这项工作的函数。我确实找到了一个名为 FindEdgeCover[] 的函数,它只能找到 边缘覆盖,而不是最小的。

【问题讨论】:

  • 您确定该功能不能满足您的需求吗?根据文档,FindEdgeCover[g] 找到图 g 的边覆盖最少的边。那么它不是根据需要找到最小边缘覆盖吗?否则将给出不止一个答案,包括非最小边缘覆盖。
  • 不,我所说的最小值是指集合中边的最小总重量,而不是边的数量。
  • 啊,实际上是未加权版本。可能是还没有内置必要的功能。
  • @trVoldemort - 感谢您提出这个问题...我自己只是在看匈牙利算法,但对图论知之甚少。虽然我可以遵循基于矩阵的算法解释,但理解与图表的对应关系仍然让我感到沮丧。

标签: graph wolfram-mathematica


【解决方案1】:

我做了一些实验,虽然没有记录,但似乎 FindEdgeCover[] 可以满足您的需求。

考虑例如:

 h[list_] := CompleteGraph[4, EdgeWeight -> list]

 FindEdgeCover[h@Range@6]
 (*
 ->  {1->2,1->3,1->4}
 *)

但是

 FindEdgeCover[h@Reverse@Range@6]
 (*
 -> {1->2,3->4}
 *)

当然没有保修...

编辑

这里有一些代码可以通过使用不同的加权邻接矩阵进行试验

adj = {{\[Infinity], 1, 1, 1, 1}, {1, \[Infinity], 2, 2, 2}, 
       {1, 2, \[Infinity], 2, 2}, {1, 2, 2, \[Infinity], 2}, 
       {1, 2, 2, 2, \[Infinity]}}
g = WeightedAdjacencyGraph[adj];
g = WeightedAdjacencyGraph[adj, VertexShapeFunction -> "Name", 
  EdgeLabels -> 
   MapThread[
    Rule, {EdgeList@g, AbsoluteOptions[g, EdgeWeight] /. {_ -> x_} -> x}], 
  GraphHighlight -> FindEdgeCover[g]]

NB:代码一点都不好,但我找不到使用EdgeLabels -> “EdgeWeight”的方法。我发布了this question 看看是否有人可以做到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 2021-10-26
    • 2012-09-09
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 2017-08-07
    相关资源
    最近更新 更多