Graph 如何找到加权二部图';s使用Mathematica 8的最小边缘覆盖?

Graph 如何找到加权二部图';s使用Mathematica 8的最小边缘覆盖?,graph,wolfram-mathematica,Graph,Wolfram Mathematica,在图论中,我们使用匈牙利算法计算加权二部图的最小边覆盖(一组与每个顶点相关的边,即总权重最小的边) 我发现在Mathematica的新版本8中,有一个全新的图论函数包,(从Graph[]开始),但我没有发现任何函数可以完成这项工作。我确实找到了一个名为FindEdgeCover[]的函数,它只能找到边覆盖,而不能找到最小的边覆盖。我做了一些实验,虽然没有记录,但似乎FindEdgeCover[]做了您想要的事情 例如,考虑: h[list_] := CompleteGraph[4, EdgeW

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


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

我做了一些实验,虽然没有记录,但似乎
FindEdgeCover[]
做了您想要的事情

例如,考虑:

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

 FindEdgeCover[h@Range@6]
 (*
 ->  {1->2,1->3,1->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]]


注意:代码一点也不好,但我找不到使用
EdgeLabels->“edgewight”
的方法。我发帖子是想看看是否有人能做到这一点。

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