繁体   English   中英

在八个难题中计算曼哈顿距离

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM