【问题标题】:minimum connected subgraph containing a given set of nodes包含给定节点集的最小连通子图
【发布时间】:2010-10-20 07:52:14
【问题描述】:

我有一个未加权的连通图。我想找到一个连接的子图,它肯定包含一组特定的节点,并且尽可能少的额外节点。这怎么可能实现?

为了以防万一,我会用更准确的语言重述这个问题。令 G(V,E) 为无权、无向、连通图。假设 N 是 V 的某个子集。找到 G(V,E) 的最小连通子图 G'(V',E') 以使 N 是 V' 的子集的最佳方法是什么?

近似值很好。

【问题讨论】:

    标签: algorithm graph graph-theory subgraph graph-algorithm


    【解决方案1】:

    这正是众所周知的 NP-hard Steiner Tree 问题。如果没有更多关于您的实例的详细信息,就很难就合适的算法给出建议。

    【讨论】:

    • 我没有听说过 Steiner 树,但我已经到达了 k 最小生成树的 Wikipedia 页面,我认为这与 MST 版本的 Steiner 树相同。
    • 我不认为这完全是施泰纳树问题。首先,被优化的值是顶点的数量而不是边的长度,其次,你不能添加任意顶点。你是对的,虽然这个问题很接近,调查它的解决方案可能会深入了解手头的问题。
    • 如果将边长度设置为 1,边的数量将被最小化,并且由于生成的子图必须是一棵树,它的边恰好比顶点少一个,这与最小化相同顶点数。我不明白“你不能添加任意顶点”是什么意思。
    • “任意顶点”指的是“欧几里得斯坦纳树”问题,根据维基百科,它是斯坦纳树的原始形式。 en.wikipedia.org/wiki/Steiner_tree
    • 我明白了,维基百科页面确实有点混乱。我指的是一般的施泰纳树问题,也称为“图中的施泰纳树”。
    【解决方案2】:

    我想不出一种有效的算法来找到最佳解决方案,但假设您的输入图是密集的,以下可能会工作得很好:

    1. 将输入图G(V, E) 转换为加权图G'(N, D),其中N 是您要覆盖的顶点子集,D 是原始图中相应顶点之间的距离(路径长度)图形。这会将所有不需要的顶点“折叠”成边。

    2. 计算G' 的最小生成树。

    3. 通过以下过程“扩展”最小生成树:对于最小生成树中的每条边d,取图中G中的相应路径,并添加路径上的所有顶点(包括端点)到结果集V' 以及到结果集E' 的路径中的所有边。

    这个算法很容易出错,给出次优的解决方案。示例:等边三角形,在角处、边中点和三角形中间有顶点,边沿边和从角到三角形的中间。为了覆盖角落,选择三角形的单个中间点就足够了,但是这个算法可能会选择边。尽管如此,如果图形很密集,它应该可以正常工作。

    【讨论】:

      【解决方案3】:

      最简单的解决方案如下:

      a) 基于 mst: - 最初,V 的所有节点都在 V' - 构建图 G(V,E) 的最小生成树 - 将其称为 T。
      - 循环:对于 T 中不在 N 中的每个叶子 v,从 V' 中删除 v。
      - 重复循环,直到 T 中的所有叶子都在 N 中。

      b) 另一种解决方案如下 - 基于最短路径树。
      - 选择 N 中的任何节点,称其为 v,令 v 为树 T = {v} 的根。 - 从 N 中删除 v。

      • 循环: 1)从T中的任何节点和N中的任何节点中选择最短路径。最短路径p:{v,...,u}其中v在T中,u在N中。 2) p 中的每个节点都被添加到 V'。 3) 从 N 中删除 p 和 N 中的每个节点。 --- 重复循环,直到 N 为空。

      在算法开始时:使用任何已知的有效算法计算 G 中的所有最短路径。

      就个人而言,我在我的一篇论文中使用了这个算法,但它更适合分布式环境。 让 N 是我们需要互连的节点集。我们想要构建图 G 的最小连通支配集,并且我们想要优先考虑 N 中的节点。 我们给每个节点 u 一个唯一的标识符 id(u)。如果 u 在 N 中,我们让 w(u) = 0,否则 w(1)。 我们为每个节点 u 创建对 (w(u), id(u))。

      • 每个节点 u 构建一个多集中继节点。也就是说,一组 M(u) 的 1 跳邻居使得每个 2 跳邻居都是 M(u) 中至少一个节点的邻居。 【M(u)越小,解越好】。

      • u 在 V' 中当且仅当: u 在其所有邻居中具有最小的对 (w(u), id(u))。 或者在 M(v) 中选择 u,其中 v 是 u 的 1-hop 邻居,具有最小的 (w(u),id(u))。

      -- 以集中方式执行此算法的技巧是高效计算 2 跳邻居。我可以从 O(n^3) 得到的最好的结果是通过矩阵乘法得到 O(n^2.37)。

      -- 我真的很想知道最后一个解的近似比率是多少。

      我喜欢这个关于 steiner 树启发式的参考: 斯坦纳树问题,黄弗兰克;理查兹·达纳 1955- 温特·帕维尔 1952

      【讨论】:

      • 虽然我最喜欢这种方法,但两者都是启发式方法,对吧? A) 很明显,因为 MST 可能会在子图中没有绘制的绘制时选择随机边,以及 B) 因为随机起点可能导致不同的遍历。但是 b) 对我来说似乎是一种更可靠的启发式方法——是吗?有没有办法选择一个“好”的起点?最后,如果存在 a) 更好的情况,有没有办法在给定已知图的情况下估计哪种启发式方法会更差?
      【解决方案4】:

      您可以尝试执行以下操作:

      1. 为所需的节点 N 创建一个 minimal vertex-cover

      2. 将这些可能未连接的子图折叠成“大”节点。即对于每个子图,将其从图中移除,并用新节点替换。调用这组节点N'

      3. N'中的节点进行最小顶点覆盖。

      4. “解包”N' 中的节点。

      不确定它是否会在某个特定范围内为您提供近似值。你甚至可以欺骗算法做出一些非常愚蠢的决定。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-02
        • 1970-01-01
        • 2017-10-08
        相关资源
        最近更新 更多