获得A *算法的2个坐标的启发式算法

时间:2016-10-10 12:05:54

标签: c# path-finding

对于我的学校项目我使用A *算法制作2D平铺地图,以找到通过障碍物的最短路径。我使用了一个公式来为http://www.growingwiththeweb.com/2012/06/a-pathfinding-algorithm.html

的下一个图块获取启发式分数

这是获取启发式的功能

bool matching_brackets(char p1, char p2)
{
    return (p1 == '(' && p2 == ')')
        || (p1 == '{' && p2 == '}')
        || (p1 == '[' && p2 == ']');
}

// ...
if(s.at(i)==y.at(j))
{
    if (list.empty())
    {
        v = 0;
        error_position = i + 1;
    }
    else if (matching_brackets(list.back(), s.at(i)))
    {
        v = 1;
        list.pop_back();
    }
    else
    {
        error_position = i + 1;
    }            
}
// ...

当y轴上的起点高于终点时,这是有效的,但是当y轴上的起点较低时,它没有找到最有效的路径。

我已经添加了我的问题的控制台版本。最有效的应该是对角线上升,但它需要一条错误的路径。

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

enter image description here

1 个答案:

答案 0 :(得分:0)

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

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

距离没有附加标志。当cx - ex大于ex时(cx同样cy - ey),Math.MinMath.Max可能会导致d_min选择d_maxMath.Abs的维度错误。您应该使用 int d_min = Math.Min(Math.Abs(cx - ex), Math.Abs(cy - ey)); 从正在比较的数量中删除符号。

e.g。

d_max

(同样适用于tolower。)