[英]Calculating the Manhattan distance in the eight puzzle
我正在开发一个程序,该程序使用具有启发性的启发式搜索来解决Python中的八个难题。 我们应该使用的启发式方法是曼哈顿距离。 因此,对于像这样的板:
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, 2, 3, 4, 5, 6, 7, 8, 9, 0]
。 我一直在试图使用mod使其工作,但似乎无法使其正常工作。 我的老师说使用mod将有助于弄清楚如何做到这一点。 我看过的一些示例为abs(x_val - x_goal) + abs(y_val - y_goal)
使用了2d数组,这很有意义,但是由于我使用的是列表,所以我不确定如何实现此目的。 到目前为止,我得到的代码是:
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
这将为每个图块生成一个x,y值。 因此,上面表示为[7, 2, 4, 5, 0, 6, 8, 3, 1]
将为7生成(0, 0)
(2, 0)
为4生成(0, 0)
(2, 0)
,依此类推。目标状态以相同的方式获取x,y坐标。 然后,我将采用x-val的绝对值-x_goal和诸如此类的值。 但是,是否有直接从列表执行此操作的更好/更有效的方法,而不是使用2 for循环迭代两个列表?
总结每个数字的曼哈顿距离:
>>> 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属于(从零开始的)坐标(0,2)=( (7-1)%3
, (7-1)//3
)但位于坐标(0,0),因此添加abs(0 - 0) + abs(2 - 0)
。
对于非标准目标:
>>> goal = [1, 2, 3, 8, 0, 4, 7, 6, 5]
>>> sum(abs(b%3 - g%3) + abs(b//3 - g//3)
for b, g in ((board.index(i), goal.index(i)) for i in range(1, 9)))
16
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.