我在许多应用程序中都使用了 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 覆盖。有没有直观的方法来做到这一点?
谢谢!