【发布时间】:2018-03-24 20:32:46
【问题描述】:
我正在开发一款类似于吃豆人的游戏:考虑一下这个迷宫:
每个白色方块都是迷宫中的一个节点,其中位于 P 的对象(例如 X)正以从右到左的方向向节点 A 移动。 X 不能切换到它的相反方向,除非它遇到像 A 这样的死胡同。因此,连接 P 和 B 的最短路径通过 A,因为 X 不能将其方向反转到最右下角的节点(称为 C)。一个常见的 A* 算法会输出:
从P到B先向右,再向上;
这是错误的。所以我想:好吧,我可以在运行A*之前将C的visited属性设置为true,让算法找到路径。显然这种方法不适用于链接迷宫,除非我允许它重新发现一些节点(问题是:哪些节点?如何区分无用节点?)。我的第一个想法是:使用以前的方法始终跟踪上次访问的单元格;如果生成的路径不为空,则完成。否则,当你到达最后一次访问的死胡同时,说Y,(这一步后面是A*的失败)转到Y,然后使用标准A*到达目标(I' m 假设迷宫已连接)。我的问题是:这是否保证始终有效?是否有更有效的算法,例如为此目的修改的 A* 派生算法?你将如何解决这个问题?我将非常感谢解释最优和非最优搜索技术的答案(实际上我不需要最短路径,稍微长一点的路径很好,但我很好奇这样的最优算法是否像 Dijkstra 算法一样高效运行; 如果是,与非最优算法相比,它的运行时间是多少?)
编辑对于 Valdo:我添加了 3 个单元格以便概括一下:如果我明白了,请告诉我:
【问题讨论】:
标签: algorithm search graph-algorithm dijkstra