Graph 如何选择包含任意k个节点的图的最小子图
我正在努力解决下面的问题。它类似于k-最小生成树和steiner树问题,但它是一个图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
- 我们有一个非负的无向加权图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和n是一回事吗?U和V是一回事吗?你的第三点只是你第四点的简化版本吗?不完全是。V表示某个图中所有顶点的集合。E表示此图中的边集。k只是一个整数,表示我们需要多少个顶点(它是问题的输入,以及包含V和E的图G)。U表示我们希望通过某种算法选择的k个顶点的子集(U是问题的输出)。因此,第4点是说,我们的算法选择的位于U中的k个顶点的选择应该使它们到所有顶点(包括那些不在U中的顶点)的边的长度之和最小化。因此,如果你想到一个矩阵,其中每列/行是一个顶点,每个单元格是一个权重。所以U是行的子集,然后你想最小化每行的权重之和?