【问题标题】:How to prevent A* search from repeating paths如何防止 A* 搜索重复路径
【发布时间】:2018-02-24 01:32:54
【问题描述】:
我正在做 8 拼图挑战,我必须以最短路径成本以正确的顺序排列图块。
对于我的启发式方法,我将错位瓷砖的数量 + n 瓷砖的距离组合到其目标位置。
目标是
1 2 3
8 0 4
7 6 5
这样的谜题
1 2 3
7 8 4
6 0 5
效果很好
但是有了这个配置
1 3 4
8 0 2
7 6 5
它无限选择这个组合为最短的
1)
1 0 4
8 3 2
7 6 5
2)
1 3 4
8 0 2
7 6 5
然后 1) 然后 2)
【问题讨论】:
标签:
artificial-intelligence
a-star
sliding-tile-puzzle
【解决方案1】:
如果您查看wikipedia 上的算法伪代码,您会注意到他们命名为closedSet 的东西。这是一个集合,您可以在其中存储已扩展的状态(已为其生成后继的状态)。然后,遍历所有后继者(或伪代码中的邻居)的循环从以下开始:
if neighbor in closedSet
continue // Ignore the neighbor which is already evaluated.
这段代码的目的是完全防止您的问题发生。
请注意,您为 closedSet 选择的数据结构将显着影响算法的运行时间。它不应该像一个列表,检查一个对象是否已经在其中需要遍历整个列表。相反,您将希望查看诸如哈希映射/集合之类的东西(确切的术语取决于您选择的编程语言)。