我在这里使用代码:https://www.get-digital-help.com/2014/06/16/a-quicker-a-pathfinding-algorithm/
它使用A *寻路算法,曼哈顿启发式算法和4向网格(即,您只能向上,向下,向左和向右移动,而不能对角移动)。这样效果很好,并且在没有“ L”字形的路径上会产生结果(没有障碍物时):
我想要实现的是这样的:
即我不想允许路径采用对角线,但我希望它“曲折”以使其有效地模仿对角线。路径的长度相同,但是看起来更自然。
如何调整代码以实现这一目标?我摆弄了一些,但没有乐趣。
答案 0 :(得分:0)
您需要低估启发式方法,以采用之字形步骤。
因此,如果您使用欧式距离来低估启发式算法,则应该得到以下信息:
xxxxxxx
xx
xx
xx
xx
如果您想要更多类似的东西
xxx
xxx
xxx
xxx
xxx
仅通过在网格上使用A *-搜索很难(也许不可能?)。
答案 1 :(得分:0)
我已通过以下代码调整每个单元格的H值来解决此问题,该代码可以计算出是否还有进一步垂直或水平移动的地方,然后稍微调整H值以适合当前使用的任何一个单元格方向(其中cr和cc是我们当前正在考虑与其相邻的单元格的行和列值):
If Abs(cr - E(0)) > Abs(cc - E(1)) Then PreferRChange = True Else PreferRChange = False
If PreferRChange = True Then
If cr - E(0) > 0 And j = 0 Then H(tr, tc) = H(tr, tc) * 0.95
If cr - E(0) < 0 And j = 1 Then H(tr, tc) = H(tr, tc) * 0.95
Else
If cc - E(1) > 0 And j = 2 Then H(tr, tc) = H(tr, tc) * 0.95
If cc - E(1) < 0 And j = 3 Then H(tr, tc) = H(tr, tc) * 0.95
End If