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

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

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

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

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

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

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

谢谢!


回答:

构建传送门的图形:

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

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

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

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

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