【问题标题】:Getting Heuristic of 2 coordinates for A* algorithm获取 A* 算法的 2 个坐标的启发式
【发布时间】:2016-10-10 12:05:53
【问题描述】:

对于我的学校项目,我使用 A* 算法制作了一个 2D 瓦片地图,以找到穿过障碍物的最短路径。我使用公式从http://www.growingwiththeweb.com/2012/06/a-pathfinding-algorithm.html 获得下一个图块的启发式分数

这是获取启发式的函数

    public static int geth(int cx, int cy, int ex, int ey)
    {
        //cx = current position x
        //cy = current position y
        //ex = end (goal) position x
        //ey = end (goal) position y

        int c = 14;
        int d_min = Math.Min(cx - ex, cy - ey);
        int d_max = Math.Max(cx - ex, cy - ey);
        int h = c * d_min + (d_max - d_min);
        if (h < 0) //make h positive in case it's negative
        {
            h = h * -1;
        }

        return h;
    }

这在 y 轴上的起点高于终点时有效,但在 y 轴上的起点较低时找不到最有效的路径。

我添加了我的问题的控制台版本。最高效的应该是斜向上,但走错了路。

(蓝色'C'是检查的节点,绿色'P'路径已建立,红色'N'仍有待检查,其他尚未到达)

【问题讨论】:

    标签: c# path-finding


    【解决方案1】:

    在链接的文章中,我看到了这个算法:

    围绕差异的管道符号|absolute value function,这在C# 中表示为Math.Abs

    距离没有附加标志。当ex 大于cxcy - ey 也是如此)时,cx - ex 将为负数,这可能导致您的Math.MinMath.Maxd_mind_max 选择错误的维度。您应该使用Math.Abs 将符号从正在比较的数量中删除。

    例如

        int d_min = Math.Min(Math.Abs(cx - ex), Math.Abs(cy - ey));
    

    (同样适用于d_max。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      • 2014-06-05
      • 2011-12-28
      相关资源
      最近更新 更多