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

如何使VBA*寻路算法返回对角线路径?,vba,algorithm,path-finding,Vba,Algorithm,Path Finding,我在这里使用代码: 它使用A*寻路算法,带有曼哈顿启发式和四向网格(即,您只能上下左右移动,不能对角移动)。这很好地工作,并且(当没有障碍物时)在“L”形的路径中: 我想要实现的是这样的目标: i、 我不想让路径采用对角线,但我希望它“之”字形,以便有效地模仿对角线。路径的长度相同,但看起来更自然 如何调整代码以实现这一点?我已经摆弄了一点,但没有乐趣。你需要低估启发来选择之字形步骤 因此,如果使用欧几里德距离来低估启发式,应该得到如下结果: xxxxxxx xx

我在这里使用代码:

它使用A*寻路算法,带有曼哈顿启发式和四向网格(即,您只能上下左右移动,不能对角移动)。这很好地工作,并且(当没有障碍物时)在“L”形的路径中:

我想要实现的是这样的目标:

i、 我不想让路径采用对角线,但我希望它“之”字形,以便有效地模仿对角线。路径的长度相同,但看起来更自然


如何调整代码以实现这一点?我已经摆弄了一点,但没有乐趣。

你需要低估启发来选择之字形步骤

因此,如果使用欧几里德距离来低估启发式,应该得到如下结果:

xxxxxxx
      xx 
       xx
        xx
         xx
如果你想要更像

xxx 
  xxx
    xxx
      xxx
        xxx

简单地在网格上使用*-搜索很难做到这一点(可能不可能?)。

我通过使用以下代码调整每个单元格的H值来解决这个问题,该代码可以确定是否还有垂直或水平方向的距离,然后稍微调整H值以支持当前方向的单元格(其中cr和cc是我们当前考虑的相邻单元格的行和列值):

如果Abs(cr-E(0))>Abs(cc-E(1)),则PreferRChange=True,否则PreferRChange=False
如果PreferRChange=True,则
如果cr-E(0)>0且j=0,则H(tr,tc)=H(tr,tc)*0.95
如果cr-E(0)<0且j=1,则H(tr,tc)=H(tr,tc)*0.95
其他的
如果cc-E(1)>0且j=2,则H(tr,tc)=H(tr,tc)*0.95
如果cc-E(1)<0且j=3,则H(tr,tc)=H(tr,tc)*0.95
如果结束

如果你想选择某些类型的路径,那么你必须将其考虑到成本或启发式中。使用欧几里德距离作为启发式更喜欢直线周围的路径。不过,你要求的具体结果很奇怪。我不知道你是如何得到的,甚至你真正想要的。你可以使用节点系统,如本视频中所示:但您所做的不是垂直线或水平线,而是允许节点在它们之间绘制不垂直或水平的线。但仍然要求节点之间不允许有墙。然后您可以在节点之间绘制线,使其看起来像之字形谢谢-我尝试使用欧几里德一个启发式(下面使用的一行代码),但它的结果是相同的L形。H(tr,tc)=Sqr(((tr-E(0))*(tr-E(0))+((tc-E(1))*(tc-E(1)))@J.汤普森:你应该开始调试,因为目标后面的每一步都与“迄今为止的投资成本”+“下一步的成本”+H(tr,tc)成45°角是最低的,如果你走下来,而不是进一步的权利。
                                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