c# - 修复 C# 中的 A* 实现
问题描述
所以我在 Unity C# 中实现了一个 A* 算法来做一些测试,以便构建一个基于 2D 的游戏。我知道有几个组件可以帮助您解决这个问题,但我想尝试自己来迎接挑战。
我基本上已经阅读了 A* 应该如何表现并将行为转换为代码。它几乎可以工作。但是在某些情况下,相邻图块的分数完全相同(曼哈顿距离 + 到原点的距离),您最终会得到一条通往目的地但不是最短的路径。正如您在图像中看到的,那两个相邻的图块具有相同的分数,但我在那个点随机选择了一个......(在下图中,起点是猫,红十字是目标点.绿色半透明文件为计算路径)
我在想,因为没有太多的瓦片,我可以从 4 个初始相邻瓦片计算 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(也称为 frontier)通常是PriorityQueue。队列中的节点根据它们的优先级排序。节点的优先级计算为到目前为止的成本(在您的情况下为步数)和启发式距离(在您的情况下为曼哈顿)的总和。因此,一旦 A* 到达优先级为 11 的节点,它将停止探索该路径并继续探索其他路径(蓝色圆圈)
推荐阅读
- angular - 在 PrimeNG 中单击多选下拉列表中的字段时禁用多选下拉关闭
- vb.net - 无法使用 vb.net 命令将值插入我的 MS Access 数据库
- android - Android底页对话框透明背景
- vim - 您的 C++ 编译器不完全支持 C++17
- reactjs - Microsoft Graph Toolkit People Picker 只读属性
- postgresql - 为新区块链构建 Chainlink 节点,连接失败并出现“包含错误运行迁移”附近的错误
- python - 根据用户名过滤用户记录
- go - 值与指针:`*x=y` 是否等同于`x=&y`?
- svg - Webpack:无法使用文件加载器显示 SVG 图像(svg 解析错误)
- python - How can i send sms notification to 200 phone number and subscribe them to a topic in SNS