将图分割成2组顶点

时间:2014-12-02 08:06:03

标签: algorithm graph

我想将连通图划分为2组顶点,这样每组顶点之间边缘权重之和的差异就会最小化。

例如,如果图形由顶点1,2,3,4,5组成,请考虑此分区:

设置A - {1,2,3}

设置B - {4,5}

总和A = {w(1 2)+ w(2 3)+ w(1 3)}

总和B = {w(4 5)}

Diff = abs(Sum A - Sum B)...(这是一个可能的分区差异。)

那么,我如何找到一个分区,使差异最小化?

2 个答案:

答案 0 :(得分:1)

这个问题很难,因为它至少和partition problem一样难。

证明草图

考虑一个分区问题,我们将数字{1,2,3,4,5}分成两组,尽可能小的差异。

构建如下图: graph with node per number

如果有人想出一个算法来解决你的问题,你可以使用算法将这个图分成两组,这样每组中的权重总和就会最小化。

在最佳解决方案中,蓝色和绿色节点必须放置在不同的集合中(因为我们有一个重量无穷大的边连接它们)。其余节点将连接到蓝色或绿色节点。调用连接到蓝色set1的连接和连接到绿色set2的连接。此分区将为分区问题提供最佳答案。

贪心算法

但是,根据图表的结构和权重值,您可能能够做出合理的工作。

例如,您可以尝试:

  1. 选择顶点的随机排列
  2. 循环遍历每个顶点,并根据目标函数(仅对目前指定的顶点进行评估)进行最小化,分配给集合1或2。
  3. 重复此算法几次并跟踪最佳分数。

    当您只需要分配几个顶点时,您还可以尝试对剩余顶点的所有可能分区进行强力评估,以搜索一个好的解决方案。

答案 1 :(得分:1)

以下算法草图基于Iterated Local Search。我们的想法是贪婪地优化当前的解决方案,直到找到局部最优解决方案。然后打扰此解决方案以克服局部最优解。始终跟踪到目前为止找到的最佳解决方案。

  1. 将顶点集随机分为V1和V2
  2. 迭代
    • 计算当前分部的成本(边缘重量差异)
    • 从V1中选择两个随机顶点v1,从V2
    • 中选择v2
    • 检查交换这些顶点(将v1移动到V2,将v2移动到V1)是否会降低成本(边缘权重差异)。如果是这样,交换顶点v1和v2,否则保持集合。
  3. 通过将V1中的一半顶点与V2中的一半顶点进行交换来扰乱会聚解。转到2。
  4. 迭代本地搜索是一种令人惊讶的有效且实用的启发式算法 - 即使对于NP完全问题也是如此。

相关问题