我在许多应用程序中都使用了 A*(和Dijkstra 算法),但我一直在寻找转弯次数最少的路径,而路径长度无关紧要。我正在使用上下左右网格,没有对角线。
A* 定义,我试图通过增加成本来扩展它。在我遇到这样的情况之前,这非常有效:Cost = DistanceFromStart + Heuristic(Manhattan)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”解决方案,但不断收到不t 覆盖。有没有直观的方法来做到这一点?
谢谢!