Python 为15个难题(4*4)寻找解决方案花费的时间太长

Python 为15个难题(4*4)寻找解决方案花费的时间太长,python,algorithm,puzzle,Python,Algorithm,Puzzle,我正在尝试用python制作一个n字谜解算器,它可以很好很快地解决8字谜,但在15字谜中需要的时间太长了。 我还是不知道我的代码出了什么问题, 我使用了A*算法和线性冲突启发式算法 我可能在执行linear\u conflict时出错,但我不知道如何验证它。 此外,在计算 f>代码>值时,该程序运行速度非常快(队列> g >代码> > 这是拼图的初始状态: 5 14 6 0 2 13 3 11 15 1 10 9 8 7 12 4 目标国家: 1 2 3 4 12 13

我正在尝试用python制作一个n字谜解算器,它可以很好很快地解决8字谜,但在15字谜中需要的时间太长了。 我还是不知道我的代码出了什么问题, 我使用了A*算法和
线性冲突
启发式算法 我可能在执行
linear\u conflict
时出错,但我不知道如何验证它。 此外,在计算<代码> f>代码>值时,该程序运行速度非常快(<代码>队列> g >代码> >

这是拼图的初始状态:

 5 14  6  0
 2 13  3 11
15  1 10  9
 8  7 12  4
目标国家:

1 2 3 4
12 13 14 5
11 0 15 6
10 9 8 7
从数学导入sqrt
从集合导入*
从发电机进口*
从heapq导入*
班级难题:
def uuu init uuu(self,puzzle,parent=None):
self.puzzle=puzzle
self.parent=parent
如果self.parent!=无:
self.g=parent.g+1
其他:
self.g=0
def已解决(自我):
节点=自身
while节点:
打印(node.puzzle)
node=node.parent
类求解:
定义初始(自我、谜题、启发式、dim):
self.puzzle=puzzle
self.dim=dim
self.goal=生成目标(dim)
自我启发=启发
self.time=0
self.size=0
自我解决(难题)
定义曼哈顿距离(自身、拼图):
曼哈顿=0
对于拼图中的瓷砖:
如果tile==0或puzzle.index(tile)==self.goal.index(tile):
持续
y=(self.goal.index(tile)%self.dim)-(puzzle.index(tile)%self.dim)
x=(self.goal.index(tile)//self.dim)-(puzzle.index(tile)//self.dim)
曼哈顿+=abs(x)+abs(y)
返回曼哈顿
定义线性冲突(自我、难题、目标):
x=1
y=0
线性=0
对于拼图中的瓷砖:
如果平铺==0:
持续
对于拼图[puzzle.index(tile)+1:((puzzle.index(tile)//self.dim)+1)*self.dim]中的项目:
如果项==0:
持续
如果(puzzle.index(tile)//self.dim)=(goal.index(tile)//self.dim)和(puzzle.index(item)//self.dim)==(goal.index(item)//self.dim):
如果目标索引(项)<目标索引(平铺):
线性+=1
对于拼图中的项目:
如果项==0:
持续
如果puzzle.index(tile)%self.dim==puzzle.index(item)%self.dim和(puzzle.index(item)//self.dim)>(puzzle.index(tile)//self.dim):
如果拼图索引(平铺)%self.dim==目标索引(平铺)%self.dim和拼图索引(项目)%self.dim==目标索引(项目)%self.dim:
如果目标索引(项)<目标索引(平铺):
线性+=1
返回(自曼哈顿距离(拼图)+2*线性)
def f(自我,队列):
h=0
如果self.heuristic==“线性冲突”:
h=自我线性冲突(queue.puzzle,self.goal)
返回(h+queue.g)
def解算(自我、谜题):
堆=[]
SEED=[]
节点=拼图(拼图)
seen.append(node.puzzle)
heappush(堆,(0,节点))
而堆:
node=heappop(堆)
self.time+=1
如果节点[1]。谜题==self.goal:
节点[1]。已解决()
打印(“时间”,self.time,“大小”,self.size)
返回
邻居=查找邻居(节点[1]。拼图,节点[1]。拼图。索引(0)+1,self.dim)
附件中的项目:
如果未看到项目:
拼图=拼图(项目,节点[1])
heappush(heap,(self.f(拼图),拼图))
参见。追加(项目)
self.size+=1

谢谢你的亵渎,你能具体说明什么是“15”字谜吗?是4*4字谜也许我遗漏了什么,但什么是4*4字谜?我们说的是滑块拼图,拼图。。。这个谜题的目的是什么?它的出发点是什么?好的,我更新了请帖检查,我认为15个谜题无法解决