我应该在基于非网格的A *算法中存储2d点之间的距离

时间:2015-04-23 14:44:46

标签: c# dictionary unity3d 2d a-star

我正在实施A *算法。任何节点都可以连接到任何其他节点,前提是没有任何阻碍路径的情况,这种情况应该很少。这种方式发现路径通常包含少量节点(甚至可能只有2个),但是从节点移动到节点的选项非常多。在基于网格的A *算法视频中,我听说存储这些距离而不是一遍又一遍地计算它们是个好主意,但这是这种情况吗?节点的位置没有绑定到网格,在我看来,计算距离的字典会变得太大而无法使用(搜索密钥)。不应该有太多的节点(30到500),因此在字典中搜索相应值的499个参考比较需要的时间比每次计算距离要长吗?如果不是 - 这个字典搜索时间对于什么数量的节点很重要? 下面是我使用的类的骨架代码。

class Node
{
    private Vector2 position;
    public Vector2 Position 
    {
        get 
        {
            return position;
        }
        set 
        {
            position = value; 
            calculatedDistances.Clear();
        }
    }
    private Dictionary<Node, float> calculatedDistances;

    public float DistanceTo(Node to)
    {
        float dist;
        if (calculatedDistances.TryGetValue(to, out dist))
        {
            return dist;
        }
        else
        {
            dist = Vector2.Distance(this.Position, to.Position);
            calculatedDistances.Add(to, dist);
            return dist;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

性能特征总是非常依赖于您的实际数据集。您几乎不应该依赖于认为会更快的内容:个人资料个人资料。 C#Stopwatch类很适合这个目的。

话虽如此,这里有一些关于你案件的想法:

  • 字典可能不会进行499个参考比较。根据C#字典的确切实现(根据MSDN,它使用哈希表),您可以接近O(1)查找,而不是O(n)(用于线性扫描)或O(log(n) )(用于二进制搜索)。
  • 使用A *,您无需使用节点之间的实际距离。任何充当“度量”的东西都可以。为了成为一个指标,它只需要总是正数(除非你比较相同的两个点,在这种情况下它必须是0)和距离A - >的距离。 B - &gt; C必须大于或等于A - > C.具体地说,您可以使用距离平方而不是距离。当您关注性能时,这可以节省昂贵的平方根计算。