Graph 如何选择包含任意k个节点的图的最小子图

Graph 如何选择包含任意k个节点的图的最小子图,graph,tree,graph-theory,graph-algorithm,subgraph,Graph,Tree,Graph Theory,Graph Algorithm,Subgraph,我正在努力解决下面的问题。它类似于k-最小生成树和steiner树问题,但它是一个图 我们有一个非负的无向加权图G=(V,E) 对于每对顶点v1和v2,都存在一条边e12。换句话说,每个顶点都连接到其他每个顶点 我们将创建包含k个顶点的顶点U的子集 我们的目标是选择U中的n个顶点,这样从U中的每个顶点到每个其他顶点的边之和最小。换言之,我们希望选择U中的顶点,以便使U中的节点向外的所有边的总和最小化 1

我正在努力解决下面的问题。它类似于k-最小生成树和steiner树问题,但它是一个图

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

k-MST或Steiner树近似解都不起作用,这是对的吗?如果是,这个问题叫什么?解决方案是什么?我可以使用启发式或近似方法来解决这个问题,不需要正式的证明

我不知道是否有更快的算法,但最简单的算法(如果我理解正确的话)是:

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

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

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

虽然答案看起来是正确的,但我认为使用诸如或之类的方法会更好

对于元启发式:

  • 计算每个顶点的边成本
  • 贪婪地拾取k个顶点-它形成初始解
  • 对于SA,开始修改初始解决方案,一个接一个地包含/排除新顶点(可能有更好的方法,您应该自己研究)
  • 如果有足够的时间,它应该收敛到足够好的解决方案
  • 对于约束满足:

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

  • 受制于:k顶点和其他顶点之间边权重的最小和。如果我是正确的,U中边的成本是0。我不知道如何恰当地表达这些约束,但它们应该相当简单
  • 运行一个超时的解算器,比如说几个小时

  • 对于最后一种方法,约束满足,内存可能是一个问题-您需要大量内存来表示完全连通的图和所有约束。尽管如此,还是要进行检查和项目。

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