因此,我在 Unity C# 中实现了 A* 算法来进行一些测试,以便构建基于 2D 的游戏。我知道有几个组件可以帮助您解决此问题,但我想自己尝试一下挑战。
我基本上已经阅读了 A* 应该如何表现并将其行为转换为代码。几乎可以用了。但在某些情况下,相邻的图 block 具有完全相同的分数(曼哈顿距离 + 距原点的距离),并且您最终会得到一条通向目的地的路径,但不是最短的路径。正如您在图像中看到的那样,这两个相邻的图 block 具有相同的分数,但我在该点随机选取一个...(在下图中,起点是猫,红十字是目的地点.绿色半透明文件为计算出的路径)
我在想,由于没有太多的图 block ,我可以从 4 个初始相邻图 block 计算 4 条不同的路径,将有效的路径存储在数组中,然后基本上只使用最短的,但也许这会是开销太大,还有其他解决方案吗?
为了计算距离,我使用基本计算:
private int CalculateManhattanDistance(int x1, int x2, int y1, int y2)
{
return Mathf.Abs(x1 - x2) + Mathf.Abs(y1 - y2);
}
最佳答案
也许这可以帮助您理解@Zdeněk Jelínek 和@Peter Wishart 所指出的内容。 openSet(也称为前沿),通常是 PriorityQueue 。队列的节点根据其优先级排序。节点的优先级计算为到目前为止的成本(您的情况下的步数)和启发式距离(您的情况下的曼哈顿)的总和。因此,一旦 A* 到达优先级为 11 的节点,它将停止探索该路径并继续探索其他路径(蓝色圆圈)
关于c# - 修复 C# 中的 A* 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50187440/