所以我为游戏推箱子实现了 2 个不同的求解器。
求解器很简单,给定一个起始状态(位置),如果初始状态是目标状态,则返回结果。否则生成子状态并将它们存储到与算法相对应的任何数据结构中。(BFS 的队列和 A* 的优先级队列)然后它从数据结构中弹出第一个子状态以检查它是否是目标状态,否则生成子状态并存储到结构中,重复此过程直到找到目标状态。
目前,A* 算法确实比 BFS 更好,因此在找到结果之前生成的节点更少。但是,我的问题是 A* 算法需要更长的时间来计算。例如,在其中一个级别中,BFS 算法生成了 26000 个节点,而 A* 只生成了 3488 个节点,但 A* 比 BFS 花费了一秒钟的时间来完成。
通过使用时间分析器,我得出结论,用于存储节点的优先级队列数据结构是造成这种减速的原因。因为每次将节点插入队列时,优先级队列都必须运行启发式函数算法来确定新状态是否应该是最接近目标状态的状态(因此它将该节点放在队列中的第一个位置)。
现在我的问题是,你们认为这是我的实现有问题还是这是正常的,因为计算启发式函数会产生开销。