计划在2D RTS上工作,我试图了解Astar是如何工作的。 实际上,我发现文章解释了如何优化Astar与二进制堆的耦合,以及利用Path对称性的算法,如Jump Poin Search algorithm。 我尝试implement跳转点搜索,它运行正常。我甚至用MovingAI的地图做了一些基准测试。
但是有一个问题。允许对角线移动时,一切运行正常。禁用时,不返回任何路径......
它可能与我实现它的方式有关,然后我都在问......一般来说,你如何要求算法(JPS)搜索仅涉及直线移动(不是对角线移动)的路径一个目标?
答案 0 :(得分:6)
跳转点搜索NEEDS对角线已启用。在状态算法中,这是其局限之一。此外,你不能使你的地形区分(泥=运动的惩罚等),因为这会破坏对称性。我建议你坚持使用A *并尝试通过地形演示(网格,航路点)获得性能。或者可以查看HPA *。
答案 1 :(得分:1)
应该可以创建一个只使用基本方向的JPS版本,如果你让它沿垂直于原始方向的方向发送子搜索(就像对角线移动一样)。这样做,它将能够找到给定位置的节点何时会找到更远的节点。
答案 2 :(得分:0)
从技术上讲,如果不允许对角线移动,那么您的最佳启发式算法就是曼哈顿距离。这意味着A *会以最少的动作找到答案。在网格中表示您的地图,每个节点具有onOpen和onClosed布尔值,而不是使用封闭列表,这是一个巨大的优化。此外,如果你使用std make heap,push_heap和pop heap,你可以得到最便宜的节点,其中有成本日志n(1到pop + log n到sort = O(logn)),这比使用向量要好得多。