我搜索了A * I的算法/伪代码,然后对其进行编码。我使用曼哈顿距离为h(n)。 (f(n)= g(n)+ h(n)) 这就是结果,
这种情况总是发生在没有挡墙的情况下,但是当我放置很多墙壁时,它似乎走的是最短路径。这是最短的路径吗?我的意思是为什么它不像下面这个?
这个也是A *曼哈顿,它们的大小相同(19x19)。这来自http://qiao.github.com/PathFinding.js/visual/
答案 0 :(得分:5)
两条路径都有相同的曼哈顿距离。因此,它取决于实现,选择哪个路径。为了说明为什么选择这个特定部分,我们必须查看这个特定A *实现的代码。
提示:从源到目标单元格的每条路径仅使用Von Neumann neighborhood(即,不对角行走)并且不向“错误”方向迈出一步(即,从不向上或向左走在你的例子中)具有相同的曼哈顿距离。所以,如果你在纽约,你到达曼哈顿某个地方的十字路口并不重要:)
答案 1 :(得分:0)
曼哈顿距离的第一个是最短的路径。它只计算所采取的水平和垂直步数。如果你想要的东西看起来更像是欧几里德距离中的最短路径,你可以尝试改变算法,这样当它可以选择在一个点水平或垂直移动时,如果水平距离大于垂直距离,则选择水平的算法。一个,反之亦然。
答案 2 :(得分:0)
你需要从起点到每个点(曼哈顿/ A *结果)投射视线(毕达哥拉斯/欧几里德)直到完成。如果通过障碍物阻挡/隐藏某条线到某一点,则使用前一个点,然后从该阻塞点开始另一条线,然后向前直到完成。 被阻止的点是当一个点被段/线的初始点的视线隐藏时。 所以它就像:
第一行:开始---------> S + N(在阻止点之前)
秒/中线/ s:阻塞点----------> S + N(在另一个阻挡点之前)再次重复(新线/段),直到它建立视线到目标。
最后一行:被阻止的点------------->目标
连接所有线路,您的最短路径更短。 您可以再次执行,但反过来添加另一个准确度,以便视线从目标开始直到开始。