A* 在带有传送门的网格上的可接受启发式方法?

假设你有一个由单元格组成的二维网格,其中一些单元格被墙壁填充。角色可以从一个方块移动到任何水平或垂直相邻的方块,但不能穿越墙壁。

给定一个起始位置和一个结束位置,我们可以通过使用A*算法和一个可接受的启发式方法来找到从起始位置到结束位置的最短路径。在当前设置中,曼哈顿距离是可接受的,因为它永远不会高估到目的地的距离。

现在假设除了墙壁外,世界中还存在成对的传送门。踏上传送门会立即将角色传送到与之相连的传送门。传送门的出现打破了上述可接受的启发式方法,因为使用传送门可能比走最优的曼哈顿距离更快到达目的地。例如,考虑这个带有传送门标记为T,起始位置标记为S,结束位置标记为E的线性世界:

T . S . . . . . . . . . . . . . E . T

在这里,最佳路线是走到左边的传送门,然后向左走两步。

我的问题是:在带有传送门的网格世界中,A*算法的良好可接受启发式方法是什么?

谢谢!


回答:

构建传送门的图形:

  • 为每个传送门和结束位置各设一个节点。
  • 每个节点之间都有一条边,形成一个完全连通的图。
  • 对于边的权重,使用每个节点的目标单元格(当你进入传送门时去的地方)与所有其他节点之间的曼哈顿距离。

使用Dijkstra算法计算从每个节点到结束位置的最短距离。

现在,你可以使用特定位置与所有节点之间的距离的最小值加上从节点到结束位置的预计算距离作为启发式函数。Dijkstra算法只需作为预处理步骤运行一次。然而,如果传送门的数量占单元格总数的很大比例,你可能不会比使用更简单的启发式函数获得更多好处。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注