我正在开发类似Pacman的游戏:考虑这个迷宫:
每个白色方块是迷宫中的节点,其中位于P的对象(比如说X)在从右到左的方向上朝向节点A移动。 X不能切换到相反的方向,除非它遇到诸如A的死胡同。因此,连接P和B的最短路径经过A,因为X不能将其方向转向最右下方节点(称为C)。一个常见的A *算法将输出:
首先从P到达B然后向上,然后向上;
这是错误的。所以我想:好吧,我可以在运行A *之前将C的被访问属性设置为true,然后让算法找到路径。显然这种方法不适用于链接的迷宫,除非我允许它重新发现一些节点(问题是:哪些节点?如何区分无用的节点?)。我想到的第一个想法是:使用前面的方法始终跟踪最后访问过的单元格;如果生成的路径不是空的,那么就完成了。否则,当你到达最后访问过的死胡同时,说Y,(这一步之后是A *失败)转到Y,然后使用标准A *来达到目标(I&# 39; m假设迷宫已连接)。我的问题是:这是否保证始终有效?是否有更高效的算法,例如为此目的而修改的A *衍生算法?你会如何解决这个问题?我非常感谢一个解释最佳和非最佳搜索技术的答案(实际上我不需要最短的路径,稍长的路径是好的,但我很好奇,如果这样的优化算法运行有效因为Dijkstra的算法存在;如果存在,与非最优算法相比,它的运行时间是多少?)
编辑对于Valdo:我添加了3个单元格以便概括一下:请告诉我是否有这个想法:
答案 0 :(得分:2)
好问题。我可以建议以下方法。
在有向图上使用Dijkstra(或A *)算法。迷宫中的每个单元格应由多个(最多4个)图形节点表示,每个节点表示特定状态中的访问单元格。
也就是说,在你的例子中,你可能在P表示的单元格中处于以下两种状态之一:向左走,向右走。它们中的每一个都由一个单独的图形节点表示(尽管它在空间上是相同的单元格)。这两个节点之间也没有直接链接,因为您无法在此特定单元格中切换方向。
根据您的规则,您只能在遇到障碍物时切换方向,这是您在不同状态下表示相同单元格的节点之间的链接。
你可能还会想到你的图形,你的迷宫被复制成4层,每层代表你的pacman的状态。在表示向右移动的图层中,您只将链接放在右边,也就是w.r.t.你迷宫的几何形状。在有障碍物的单元格中,无法向右移动,您可以将链接放置在不同层的相同单元格中。
<强>更新强>
关于草图中描述的场景。它实际上是正确的,你有了正确的想法,但它看起来很复杂,因为你决定在不同的单元格和状态之间建立链接。
这个想法是拆分你的小区间和国家间链接。现在有两种边:细胞间,用蓝色标记,和间状态,用红色标记。
蓝色边缘始终连接相邻单元格之间相同状态(箭头方向)的节点,而红色边缘连接同一单元格内的不同状态。
根据你的规则,遇到障碍物时可能会发生状态变化,因此如果没有障碍物,每个状态节点都是蓝色边缘的来源,如果遇到障碍物则是红色(即不能发出蓝色边缘) 。因此,我还用蓝色和红色绘制了状态节点。
如果根据你的规则,状态转换立即发生,没有延迟/惩罚,那么红色边缘的权重为0.否则你可以为它们指定非零权重,红色/蓝色边缘之间的权重比应该对应于时间转弯/行程的周期比率。