【发布时间】:2018-09-21 23:25:30
【问题描述】:
所以我为推箱子游戏实现了 2 个不同的求解器。
求解器很简单,给定一个起始状态(位置),如果初始状态是目标状态,则返回结果。否则生成子状态并将它们存储到与算法相对应的任何数据结构中。 (BFS 队列和 A* 优先队列)然后它从数据结构中弹出第一个子状态以检查它是否是目标状态,否则生成子状态并存储到结构中,重复此过程直到找到目标状态。
目前,A* 算法确实比 BFS 更好,因此在找到结果之前生成的节点更少。但是,我的问题是 A* 算法需要更长的时间来计算。例如,在其中一个关卡中,BFS 算法生成了 26000 个节点,而 A* 仅生成了 3488 个节点,但 A* 比 BFS 多花费了一秒的时间来完成。
通过使用时间分析器,我得出结论,用于存储节点的优先级队列数据结构是造成这种减速的原因。因为每次将节点插入队列时,优先级队列都必须运行启发式函数算法来确定新状态是否应该是最接近目标状态的状态(因此它将该节点放在队列中的第一个位置)。
现在我的问题是,你们认为这是我的实现有问题还是这是正常的,因为计算启发式函数时会产生开销。
【问题讨论】:
-
如果您使用 Python 编写,
PriorityQueue很慢,请改用heapq(除非您是多线程)
标签: algorithm search breadth-first-search a-star state-space