c# - 修复 C# 中的 A* 实现

标签 c# unity-game-engine a-star

因此,我在 Unity C# 中实现了 A* 算法来进行一些测试,以便构建基于 2D 的游戏。我知道有几个组件可以帮助您解决此问题,但我想自己尝试一下挑战。

我基本上已经阅读了 A* 应该如何表现并将其行为转换为代码。几乎可以用了。但在某些情况下,相邻的图 block 具有完全相同的分数(曼哈顿距离 + 距原点的距离),并且您最终会得到一条通向目的地的路径,但不是最短的路径。正如您在图像中看到的那样,这两个相邻的图 block 具有相同的分数,但我在该点随机选取一个...(在下图中,起点是猫,红十字是目的地点.绿色半透明文件为计算出的路径)

enter image description here

我在想,由于没有太多的图 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/

相关文章:

c# - 如何在 SQL Server 连接字符串中隐藏用户 ID/密码?

c# - 使用 SQL 2000 和 ASP.NET C# 创建搜索引擎

c# - 如何从代码中获取 customErrors 的 defaultRedirect 值?

c# - 如何从 .Net Core Web API 返回 Json?

c# - Visual Studio 可以理解,但 Unity 不能?

unity-game-engine - Unity 使用另一个带有函数的脚本的值更改相机位置

android - Google Play 服务 Unity 插件显示排行榜

algorithm - 将路标添加到 A* 图搜索

algorithm - 当没有节点坐标可用时的 A* 启发式

language-agnostic - 使用深度/广度优先/A*算法在图树中搜索