计算八个谜题中的曼哈顿距离

时间:2016-09-29 00:51:56

标签: python

我正在开发一个程序,使用具有启发式的知情搜索来解决Python中的Eight Puzzle。我们应该使用的启发式是曼哈顿距离。对于像这样的董事会:

 State            Goal        Different Goal
7  2  4         1  2  3           1  2  3
5     6         8     4           4  5  6
8  3  1         7  6  5           7  8

曼哈顿距离为4 + 0 + 3 + 3 + 1 + 0 + 2 + 1 = 14

从视觉上看,很容易计算一定数量的空格数,但在Python中我将一个板表示为一个列表,因此上面的板将是[7, 2, 4, 5, 0, 6, 8, 3, 1],目标状态为{{ 1}}。我一直在努力尝试使用mod工作,但似乎无法让它正常工作。我的老师说使用mod会有助于弄清楚如何做到这一点。我看到的一些例子使用了[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]的二维数组,这是有道理的,但由于我使用的是列表,我不知道如何实现它。我到目前为止的代码是:

abs(x_val - x_goal) + abs(y_val - y_goal)

这将为每个图块生成x,y值。因此,上面表示为distance = 0 xVal = 0 yVal = 0 for i in range(len(self.layoutList)): pos = self.layoutList.index(i) if pos i == 0 or pos i == 1 or pos i == 2: xVal = pos yVal = 0 if pos i == 3 or pos i == 4 or pos i == 5: xVal = pos - 3 yVal = 1 if pos i == 6 or pos i == 7 or pos i == 8: xVal = pos - 6 yVal = 2 的状态将为7生成[7, 2, 4, 5, 0, 6, 8, 3, 1],为4生成(0, 0)等等。我将以相同的方式为目标状态实现此方法以获取该坐标的x,y坐标。然后我会取x-val的绝对值 - x_goal和诸如此类的东西。但是,是否有更好/更有效的方法直接从列表中执行此操作,而不是使用2 for循环来迭代这两个列表?

1 个答案:

答案 0 :(得分:5)

总结每个号码的曼哈顿距离:

SELECT t2.name
FROM tags t1
INNER JOIN tags t2
    ON t1.id = t2.related
WHERE t1.name LIKE '%:str%'     -- e.g. MySQL

例如,7属于(从零开始)坐标(0,2)=(>>> board = [7, 2, 4, 5, 0, 6, 8, 3, 1] >>> sum(abs((val-1)%3 - i%3) + abs((val-1)//3 - i//3) for i, val in enumerate(board) if val) 14 (7-1)%3)但是在坐标(0,0)处,所以添加{{1对于它。

对于非标准目标:

(7-1)//3