首先,我要感谢任何人花时间看这个。我们中的许多人都熟悉Dijkstra的算法,因而熟悉A *。我在许多应用程序中使用过A *,但对于这种特殊情况,我很难想出一个算法。这种情况涉及找到转弯次数最少的路径。实际上,我甚至不关心“最短路径”,只关心转弯最少的路径!我正在使用上下左右网格,没有对角线,这意味着有许多可能的最短路径解决方案。例如,在一个5x5的网格中,左下方有一个启动器,右上角有一个启动器,我们可以做一个楼梯的情况,或者一直走到右边然后一直向上(对我来说更好!)。
使用A *你使用Cost = DistanceFromStart + Heuristic(曼哈顿),我试图通过添加numTurns成本来扩展它。这完全有效,直到我遇到如下情况:
| 0 0 0 0 0 * 0 0
| 0 0 1'2'+ 0 0 E
| 0 0 S 1 2 * 0 0
| 0 0 0 0 0 * 0 0
| 0 0 0 0 0 * 0 0
请原谅糟糕的格式,我希望你能看到我的意图。
*是墙,0是空的,S是开始,E是结束。您将发现路径S-> 1-> 2->将给出与s-> 1' - > 2' - > +相同的成本。到目前为止,他们都有一个转弯,距离S和曼哈顿相同。然而,从+,如果我们采用素数(')路线,我们不必转向。但是如果我们采用1 2路线,我们必须向右转(+1费用)。因此,即使我们可能首先以1 2到达那里,但它不是最小转弯的路径。
我尝试过调整,例如让同一个方块的多个同时位于优先级队列中,这样它们都有机会(如果它们的值在堆中最小)。我已经尝试了其他“hacky”解决方案,但我不断获得未涵盖的案例。有没有人知道这样做的直观方法?再一次,我会尽我所能提出问题:
给定一个具有上下左右移动和障碍物的网格,如何找到从A到B的最小转弯路径。我不需要保证最短距离。该应用程序是一个连接瓷砖的游戏机器人程序,只有当它们相距不到3圈时才能消除。再次感谢任何可以提供帮助的人!
答案 0 :(得分:2)
创建一个新的距离矩阵。对于位置i和j,如果它们在一条直线上(没有转弯),则设置距离(i,j)= 1。其余元素设置为无穷大。现在运行任何最短距离算法。
答案 1 :(得分:0)
我认为你需要在你的州中加入'方向'。当你从1-> 2> +到达'+'时,你正面临'向上',当你从'1' - > 2'到达'+' - > +你正面临'正确' 。
然后,您可以将改变方向的成本纳入“成本”。也就是说,从一个州到另一个州的旅行费用。现在,当估计向右移动时,转到1-> 2> +将考虑改变方向的成本,而1' - > 2' - > +将不会。
当你进入A *的'生成孩子'阶段时,你可能只是将'cost-so-far'增加1,即移动到邻居所需的网格数量。如果邻居对你当前位置的方向是!=你当前的方向,你还需要加1。
首先,你可以使用像OMNIDIRECTIONAL这样的特殊方向,这样从起始位置移动到任何方格都不会产生费用。