【问题标题】:How to select a minimum subgraph of a graph containing any k nodes如何选择包含任何 k 个节点的图的最小子图
【发布时间】:2018-02-02 22:06:10
【问题描述】:

我正在尝试解决以下问题。它类似于 k-minimum-spanning-tree 和 steiner 树问题,但它是带有图的。

  • 我们有一个非负无向加权图 G = (V, E)。
  • 对于每对顶点 v1 和 v2,都存在一条边 e12。换句话说,每个顶点都连接到其他每个顶点。
  • 我们将创建一个包含 k 个顶点的顶点 U 的子集。
  • 我们的目标是选择 U 中的 n 个顶点,使得从 U 中的每个顶点到每个其他顶点的边的总和最小化。换句话说,我们希望选择 U 中的顶点,使得从 U 中的节点向外的所有边的总和最小化。
  • 1

我是否正确,k-MST 或施泰纳树近似解决方案都不起作用?如果是这样,这个问题叫什么?解决方案是什么?我可以使用启发式或近似来解决这个问题,并且不需要正式的证明。

【问题讨论】:

  • 我最近在这类问题上没有太多经验,所以我不得不问几个可能很愚蠢的问题:k 和 n 是一回事吗? U和V是一回事吗?你的第三点只是你第四点的简化版吗?
  • 不完全是。 V 表示某个图中所有顶点的集合。 E 表示该图中的边集。 k 只是一个整数,表示我们想要多少个顶点(它是问题的输入,以及包含 V 和 E 的图 G)。 U 表示我们想用某种算法选择的 k 个顶点的子集(U 是问题的输出)。所以第 4 点是说我们的算法选择在 U 中的 k 个顶点应该这样选择,使得它们的边到所有顶点(包括那些不在 U 中的顶点)的长度之和最小化。
  • 因此,如果您想到一个矩阵,其中每列/行是一个顶点,每个单元格都是一个权重。那么U是行的一个子集,然后你想最小化每一行的权重之和?

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


【解决方案1】:

您是正确的,K-MST 或 Steiner 树不起作用 - 它们只生成树,而您需要具有特殊属性的图,例如如果我理解您的问题,U 内的顶点之间的成本为 0,所有其他边的成本最低。

虽然juancn's 的答案看起来正确,但我认为使用metaheuristic 之类的东西,例如simulated annealingconstraint satisfaction 方法会更好。

对于元启发式:

  1. 计算每个顶点的边成本
  2. 贪婪地挑选 k 个顶点 - 它构成了您的初始解决方案
  3. 在 SA 的情况下,开始修改初始解决方案,逐个包含/排除新顶点(也许有更好的方法,您应该自己研究)
  4. 如果有足够的时间,它应该会收敛到足够好的解决方案

为了满足约束:

  1. 目标:从给定图中选择 k 个顶点。对于每个顶点引入 一个布尔变量,如果它是 1 - 顶点是 U 的一部分,否则它是 0。那么你的目标是:

总和(顶点==1)= k

  1. 受制于:k-顶点和其他顶点之间的边权重的最小总和。如果我是正确的,那么 U 中边的成本为 0。我不知道如何正确制定此类约束,但它们应该相当简单。
  2. 超时运行求解器,假设是几个小时。

对于最后一种方法,即约束满足,内存可能是个问题 - 您需要大量内存来表示全连接图和所有约束。不过,请检查 Minizinclpsolvecoin-or 项目。

【讨论】:

    【解决方案2】:

    我不知道是否有更快的算法,但微不足道的算法(如果我的解释正确的话)是:

    • 构建一个数组/映射,在其中保存从 vi 到任何其他顶点的每条边的权重总和。如果您考虑图形的矩阵表示,其中每一行/列是一个顶点,每个单元格是一个边上的权重。该数组将是每一行的总和。
    • 生成所有 k 大小的顶点子集,保留总和最小的那个。

    如果有 n 个顶点,这是探索n!/(k! (n-k)!) 这样的组合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-21
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 2021-04-27
      • 2015-05-08
      • 2015-04-15
      相关资源
      最近更新 更多