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

时间:2017-08-24 21:56:10

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

我正在尝试解决下面的问题。它就像k-minimum-spanning-tree和steiner tree问题,但是它带有图形。

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

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

2 个答案:

答案 0 :(得分:1)

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

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

如果有n个顶点,则会探索{{1}}这样的组合。

答案 1 :(得分:1)

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

虽然juancn's回答看起来是正确的,但我认为使用类似metaheuristic的内容,例如<{3}}或simulated annealing方法会更好。

对于metaheuristics:

  1. 计算每个顶点的边缘成本
  2. Greedely选择 k 顶点 - 它形成初始解决方案
  3. 在SA的情况下,开始修改初始解决方案是逐个包含/排除新顶点(也许有更好的方法,你应该自己研究)
  4. 如果有足够的时间,它应该收敛到足够好的解决方案
  5. 对于约束满足:

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

      sum(vertices == 1)= k

      1. 受制于: k -vertices与其他之间的边缘权重的最小总和。如果我是正确的,U的边缘成本是0.我不知道如何恰当地制定这样的约束,但它们应该相当简单。
      2. 运行一个超时解算器,让我们说几个小时。
      3. 对于最后一种方法,约束满足,内存可能是一个问题 - 您需要大量内存来表示完全连接的图形和所有约束。不过,请检查constraint satisfactionMinizinclpsolve项目。