如何使VBA A *寻路算法返回对角线路径?

时间:2018-10-12 12:19:11

标签: vba algorithm path-finding

我在这里使用代码:https://www.get-digital-help.com/2014/06/16/a-quicker-a-pathfinding-algorithm/

它使用A *寻路算法,曼哈顿启发式算法和4向网格(即,您只能向上,向下,向左和向右移动,而不能对角移动)。这样效果很好,并且在没有“ L”字形的路径上会产生结果(没有障碍物时):

Current Result Image

我想要实现的是这样的:

Desired Result Image

即我不想允许路径采用对角线,但我希望它“曲折”以使其有效地模仿对角线。路径的长度相同,但是看起来更自然。

如何调整代码以实现这一目标?我摆弄了一些,但没有乐趣。

2 个答案:

答案 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