寻找有界子图之间的最小割集

Posted

技术标签:

【中文标题】寻找有界子图之间的最小割集【英文标题】:Finding minimum cut-sets between bounded subgraphs 【发布时间】:2011-02-04 18:04:51 【问题描述】:

如果将游戏地图划分为子图,如何最小化子图之间的边?

我有一个问题,我试图通过 pacman 或 sokoban 等基于网格的游戏进行 A* 搜索,但我需要找到“附件”。我说的外壳是什么意思?给定作为软约束的每个子图的顶点数的最大尺寸和最小尺寸,尽可能少 cut edges 的子图。或者,您可以说我正在寻找子图之间的桥梁,但是它通常是同样的问题。


示例

Gridbased gamemap example http://dl.dropbox.com/u/1029671/map1.jpg

给定一个看起来像这样的游戏,我想做的是找到围场,这样我就可以正确地找到它们的入口,从而获得一个很好的启发式方法来到达这些围场内的顶点。

alt text http://dl.dropbox.com/u/1029671/map.jpg

所以我想要在任何给定的地图上找到这些彩色区域。


我的动机

我之所以费心这样做,而不是仅仅满足于简单的曼哈顿距离启发式的性能,是因为封闭启发式可以提供更优化的结果,我不必实际做 A* 来获得一些合适的结果距离计算,也用于以后在玩推箱子类型游戏时在这些围栏内增加对手的竞争性阻挡。此外,封闭启发式可用于极小极大方法,以更准确地找到目标顶点。

可能的解决方案

问题的可能解决方案是Kernighan Lin algorithm:

function Kernighan-Lin(G(V,E)):
  determine a balanced initial partition of the nodes into sets A and B
  do
     A1 := A; B1 := B
     compute D values for all a in A1 and b in B1
     for (i := 1 to |V|/2)
      find a[i] from A1 and b[i] from B1, such that g[i] = D[a[i]] + D[b[i]] - 2*c[a][b] is maximal
      move a[i] to B1 and b[i] to A1
      remove a[i] and b[i] from further consideration in this pass
      update D values for the elements of A1 = A1 / a[i] and B1 = B1 / b[i]
    end for
    find k which maximizes g_max, the sum of g[1],...,g[k]
    if (g_max > 0) then
       Exchange a[1],a[2],...,a[k] with b[1],b[2],...,b[k]
 until (g_max <= 0)
 return G(V,E)

我对这个算法的问题是它的运行时间为 O(n^2 * lg(n)),我正在考虑将 A1 和 B1 中的节点限制在每个子图的边界,以减少完成的工作量。

我也不理解算法中的 c[a][b] 成本,如果 a 和 b 之间没有边是假定为 0 或无穷大的成本,或者我应该根据一些创建边启发式。

你知道当 a 和 b 之间没有边时 c[a][b] 应该是什么吗? 您认为我的问题适合使用多级方法吗?为什么或者为什么不? 对于如何减少我的问题使用 kernighan-lin 算法完成的工作,您有一个好主意吗?

【问题讨论】:

我不明白你是如何在第二张图片中完全这样着色的。你的标准是什么?为什么黄色斑点没有细分?你如何定义图表?一个顶点是一个点,它的邻居是(最多)北、南、东、西四个点? 是的,这就是我定义图形的方式,每个正方形(顶点)在北、东、南和西都有它的邻居。图片只是为了说明,你可以将黄色、红色、黑色等分成几个闭包,它只是每个闭包的最大/最小顶点的约束,调节了细分的性质。因此,如果我的最小约束是 8 个顶点,那么黄色闭包将填充约束,但如果最小约束是 4,它可能会在框下方结束。寻找一种通常适用于多个地图和闭包的算法是我所追求的。 您想将地图划分为子图。子图的大小必须遵守一些界限(最大、最小大小),并且分区之间的边数应该最小化? 正确。这正是我想做的。 Kernighan Lin 在 K 个不同的子图上使用它时给了我奇怪的解决方案。我认为这是因为我将图划分为 K 个子图的方式。 【参考方案1】:

不确定这个问题,但也许您可以使用最大流量/最小切割对偶。

max-flow 有专门且高效的算法,可用于求解原始问题。

然后您需要使用here 描述的技术获得双重解决方案。

PS:如果您需要运筹学方面的帮助行话,请告诉我。

【讨论】:

【参考方案2】:

也许可以在 Wikipedia 上查看此链接以进一步阅读。

graph partitioning problem in 数学包括划分一个 将图形分成几部分,使得 件的大小大致相同,并且 之间的联系很少 件。

Graph Partition

【讨论】:

以上是关于寻找有界子图之间的最小割集的主要内容,如果未能解决你的问题,请参考以下文章

USACO 4.4 Pollutant Control (网络流求最小割割集)

hiho 第116周,最大流最小割定理,求最小割集S,T

[BZOJ1797][AHOI2009]最小割Mincut

HDU 3491 最小点权割集

POJ 1815 - Friendship - [拆点最大流求最小点割集][暴力枚举求升序割点] - [Dinic算法模板 - 邻接矩阵型]

奶牛通讯 usaco 网络流