我有一个问题,我试图通过像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算法对我的问题所做的工作,你有一个好主意吗?
答案 0 :(得分:1)
不确定问题,但也许你可以使用max-flow / min-cut二元性。
max-flow有专门有效的算法可以用来解决原始问题。
然后,您需要使用here所述的技术获取 dual 解决方案。
PS:如果您需要有关Operations Research 行话的帮助,请告诉我。
答案 1 :(得分:0)
或许可以查看维基百科上的这个链接以便进一步阅读。
graph partitioning problem in 数学包括划分a 图形成碎片,这样的 碎片的大小和大小差不多 之间几乎没有联系 件。