8带有A *的益智游戏:开放集的结构是什么?

问题描述 投票:0回答:1

我最近正在用python开发8Puzzle游戏求解器,我需要一些帮助到目前为止,我已经完成了使用Manhattan距离作为启发式函数对A *算法进行编码。

求解器在不到2秒的时间内运行并找到约60%的解决方案但是,对于另外的40%,我的求解器最多可能需要20-30分钟,就像在没有启发式的情况下运行一样我开始进行故障排除,似乎我使用的Openset引起了一些问题:

  • 我的开放集是一个数组
  • 每次迭代,我遍历开放集以找到最低的f(n)(复杂度为O(n))

我感到O(n)太多,无法使用这样的内存来运行像样的A *算法,因此我想知道如何设法减少openset的“时间消耗者”

谢谢您的帮助!祝你有美好的一天

编辑:已修正我解决了我的问题,实际上这是一个双重问题。我尝试使用字典而不是数组,在该数组中,我按节点的f(n)值存储了节点,这使我可以在几秒钟内运行解算器和约181000种游戏第二个问题(由于第一个原因我不知道)是我不知道益智游戏的可解性,而且当我随机化初始节点时,无法解决50%的难题。这就是为什么将openset作为数组花了这么长时间的原因。

python algorithm complexity-theory a-star 8-puzzle
1个回答
0
投票

开放集应为优先级队列。尽管存在其他实现,但通常使用binary heap实现这些。

数组列表和字典都不会有效。


闭集应该是有效的set

,因此通常是hash tablebinary search tree,这取决于您语言的标准库默认设置。

字典(又名“地图”)在技术上可以使用,但是从概念上讲,这是错误的数据结构,因为您没有映射到任何内容。数组列表效率不高。

© www.soinside.com 2019 - 2024. All rights reserved.