Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有更有效的算法来计算8字谜游戏的曼哈顿距离?_Python_Performance_Heuristics - Fatal编程技术网

Python 有没有更有效的算法来计算8字谜游戏的曼哈顿距离?

Python 有没有更有效的算法来计算8字谜游戏的曼哈顿距离?,python,performance,heuristics,Python,Performance,Heuristics,我目前正在编写一个算法,通过Python的A*搜索算法来解决8字谜游戏。然而,当我计时代码时,我发现get\u manhattan\u distance需要很长时间 我使用Python的cProfile运行代码,结果如下所示。因为我的问题 通过使用Numpy数组而不是Python的列表进行复制,我已经提高了程序的效率。我不太知道如何使这一步更有效率。我当前的get\u manhattan\u distance代码是 def get_manhattan(self): “”“返回此板的曼哈顿启发式

我目前正在编写一个算法,通过Python的A*搜索算法来解决8字谜游戏。然而,当我计时代码时,我发现
get\u manhattan\u distance
需要很长时间

我使用Python的
cProfile
运行代码,结果如下所示。因为我的问题

通过使用Numpy数组而不是Python的列表进行复制,我已经提高了程序的效率。我不太知道如何使这一步更有效率。我当前的
get\u manhattan\u distance
代码是

def get_manhattan(self):
“”“返回此板的曼哈顿启发式
将尝试使用缓存的曼哈顿值来提高速度,但如果没有
已经计算过,则需要计算它(即
非常昂贵!)。
"""
如果self.u曼哈顿!=-1:
返回self.u曼哈顿
#将该值设置为零,这样我们就可以根据元素超出范围来添加元素
#地点。
self.u=0
对于范围内的r(self.get_dimension()):
对于范围内的c(self.get_dimension()):
如果自板[r][c]!=0:
num=自板[r][c]
#解决此数字应位于哪一行和哪一列。
correct\u row,correct\u col=np.divmod(num-1,self.get\u dimension())
#将曼哈顿距离从其当前位置添加到其正确位置
#位置。
曼哈顿区=abs(正确列-c)+abs(正确列-r)
self.cached_曼哈顿+=曼哈顿区
返回self.u曼哈顿
这背后的想法是,3x3网格的目标拼图如下:

 1  2  3
 4  5  6
 7  8 
其中有一个空白磁贴(空白磁贴由int数组中的0表示)。因此,如果我们有难题:

 3  2  1
 4  6  5
 7  8   
它的曼哈顿距离应该是6。这是因为,3离它应该在的地方有两个地方。1是离它应该在的地方两个地方。5是离它应该在的地方一个地方,6是离它应该在的地方一个地方。因此,2+2+1+1=6


不幸的是,这个计算需要很长的时间,因为有数十万个不同的电路板。有什么方法可以加快计算速度吗?

在我看来,您只需计算一次整个电路板的曼哈顿距离总和,即第一个电路板的曼哈顿距离总和。之后,通过交换两个相邻的数字,从现有的
板创建新的
实体。新棋盘上的曼哈顿总距离将仅与这两个数字的曼哈顿距离变化之和不同

如果一个数字为空白(<代码> 0 < /代码>),则总距离根据负空白数是否移动到其适当位置或远离它而改变为负一或一。如果这两个数字都是非空的,比如当你制作“双胞胎”时,总距离会改变-2、0或2

我要做的是:在
板上添加一个
manhattan\u distance=None
参数。如果未给出,则计算电路板的总曼哈顿距离;否则,只需存储给定的距离。创建没有此参数的第一块板。从现有线路板创建新线路板时,计算总距离的变化,并将结果传递到新线路板。(缓存的
文件变得不相关。)


这将大大减少与距离有关的计算总数-我希望它能将速度提高几倍,电路板尺寸越大,速度越快。

起始位置为
(0,0)
,结束位置为
(n-1,n-1)
?其中
n=self.get_dimension()
是,这是正确的。如果您愿意,我可以链接我的代码的其余部分。编辑:是否允许移动到对角线位置?或者它只是右下,左上?只是上下,左下和右,因为这是你在8字谜游戏中唯一可以移动的方式。你看过线了吗,我想它可能会有帮助。