用于在图中找到最大独立集的算法是否正确?

时间:2013-03-25 03:51:22

标签: algorithm graph set pseudocode subset

我们对算法有以下输入:

没有周期(也就是生成树)的图G,其中每个节点都有一个相关的权重。

我想找到一个独立的集合S,以便:

  • S中没有两个元素在G
  • 中形成边缘
  • 没有其他可能的子集满足上述条件,其权重大于S[0] + S[1] + ... + S[n-1]len(S)==n)。

这是我到目前为止的高级伪代码:

MaxWeightNodes(SpanningTree S):
    output = {0}
    While(length(S)):
        o = max(node in S)
        output = output (union) o
        S = S \ (o + adjacentNodes(o))
    End While
    Return output   

有人可以告诉我我是否犯了错误,或者这个算法会给我我想要的结果吗?

2 个答案:

答案 0 :(得分:5)

该算法无效,因为当您排除初始最大值的相邻节点可能是最佳本地解决方案时,您将很快遇到这种情况,但不是最佳的全局决策。

例如,output = []

        10
      /    \
   100      20
   /  \    /  \
  80  90  10   30

output = [100]

         x
      /    \
     x      20
   /  \    /  \
  x    x  10   30

output = [100, 30]

         x
      /    \
     x      x
   /  \    /  \
  x    x  10   x

output = [100, 30, 10]

         x
      /    \
     x      x
   /  \    /  \
  x    x  x    x

虽然我们知道有更好的解决方案。

这意味着你没有optimal substructure的贪婪算法。

答案 1 :(得分:2)

我认为顶点的权重使得贪婪的解决方案变得困难。如果所有权重相等,您可以尝试选择树的一组级别(对于完整的k-ary树,这显然是最简单的,但是生成树通常不属于该类)。也许将贪婪近似视为具有组合权重的级别是有用的,因为您总是可以选择树的同一级别的所有顶点(独立于您根据它的哪个顶点)进入相同的独立组;在同一级别的两个顶点之间不能有边。我不提供解决方案,因为这对我来说似乎是一个难题。主要问题似乎是权重和事实,你不能假设你正在处理完整的树木。

编辑:实际上,总是选择一个级别的所有顶点似乎也是一个坏主意,因为鲁本斯的例子有助于可视化;想象一下,他树右边第二层的顶点重量为200。