有没有更有效的算法来计算8拼图游戏的曼哈顿距离?

阿迪亚·皮莱(Aditya pillai)

我目前正在编写一种算法,该算法通过使用Python的A *搜索算法来解决8谜题游戏。但是,当我对代码进行计时时,我发现这get_manhattan_distance花费了很长时间。

cProfile为Python运行了代码,结果低于该程序输出的结果。这是的要点

通过使用Numpy数组而不是Python的列表进行复制,我已经使我的程序更加高效。我不太了解如何使这一步骤更有效率。我当前的代码get_manhattan_distance

def get_manhattan(self):
    """Returns the Manhattan heuristic for this board

    Will attempt to use the cached Manhattan value for speed, but if it hasn't 
    already been calculated, then it will need to calculate it (which is 
    extremely costly!).
    """
    if self.cached_manhattan != -1:
      return self.cached_manhattan

    # Set the value to zero, so we can add elements based off them being out of
    # place.
    self.cached_manhattan = 0

    for r in range(self.get_dimension()):
      for c in range(self.get_dimension()):
        if self.board[r][c] != 0:
          num = self.board[r][c]

          # Solves for what row and column this number should be in.
          correct_row, correct_col = np.divmod(num - 1, self.get_dimension())

          # Adds the Manhattan distance from its current position to its correct
          # position.
          manhattan_dist = abs(correct_col - c) + abs(correct_row - r)
          self.cached_manhattan += manhattan_dist

    return self.cached_manhattan

其背后的想法是,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。

不幸的是,这种计算需要很长时间,因为有成千上万的不同电路板。有什么办法可以加快计算速度吗?

内森(NathanVērzemnieks)

在我看来,您只需要为整个木板计算一次完整的曼哈顿距离总和-对于第一个木板。之后,您将Board通过交换两个相邻的数字从现有实体中创建新实体。新板上的曼哈顿总距离将仅因这两个数字的曼哈顿距离变化之和而不同。

如果其中一个数字是空白(0),则总距离将改变负一或一,具体取决于非空白数字是移近还是移到适当位置。如果两个数字都不是空白的(例如,当您制作“双胞胎”时),则总距离将变化为负两个,零个或两个。

这就是我要做的:在中添加一个manhattan_distance = None参数Board.__init__如果没有给出,计算板子的曼哈顿总距离;否则,只需存储给定的距离即可。创建不带此参数的第一块板。从现有的木板创建新木板时,请计算总距离的变化并将结果传递给新木板。cached_manhattan变得无关紧要。)

这将使距离计算的总数减少很多-我希望它可以使速度加快数倍,并且更大的电路板尺寸也可以。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有没有更有效的方法来计算距离矩阵?

有没有更有效的方式来跟踪没有孩子的父母记录?

有没有比python中的networkx更有效的方法来计算最短路径问题?

有没有更有效的方法来创建分组列表

有没有更有效的方法来搜索特定像素的图像?

有没有更有效的方法来重构Ruby上哈希的迭代?

有没有更有效的方法来存储关键字参数?

有没有更有效的方法来编写这段代码?

有没有更有效的方法来排序此数组?

有没有更有效的方法来编码此“ 2 Sum”问题

有没有更有效的方法来切片多维数组

有没有更有效的方法来在servlet中输出html?

有没有更有效的方法来实现这一目标?

有没有更有效的方式来编写合并函数?

有没有更有效的方式来编写此sql查询?

有没有更有效的方法来执行此嵌套SQL查询?

有没有更快,更有效的方法来保存python字典?

有没有更有效的方法来运行多个UPDATE SQL语句

有没有更有效的方法来制作多步动画?

有没有更有效的方式来扩展字符串?

有没有更有效的方法来遍历数据帧?

有没有更有效的方法来包装浮点数?

有没有更有效的方法来改变点击按钮的样式?

有没有更有效的方法来规范字段的字符数?

有没有更有效的方式来编写此乘法表?

有没有更有效的方法来按数组分组?

有没有更有效的方法来运行此功能?

Python:有没有更有效的方法来转换月份的 int 值?

使算法更有效