2017-01-24 82 views
0

什么是计算manhattan distances曼哈顿距离

我目前的解决方案的最优化的方式是:

def distance(state): 
    target_state = (1,2,3,4,5,6,7,8,0) 
    target_matrix = np.reshape(np.asarray(list(target_state)),(-1,3)) 
    reshaped_matrix = np.reshape(np.asarray(list(state)),(-1,3)) 
    dist = 0 
    for i in range(1,9): 
     dist = dist + (abs(np.where(target_matrix == i)[0][0] 
          - np.where(reshaped_matrix == i)[0][0]) + 
         abs(np.where(target_matrix == i)[1][0] 
          - np.where(reshaped_matrix == i)[1][0])) 

    return dist 
+3

必须有你没有向我们解释的东西。曼哈顿的距离是'dx + dy',这也是一种很有效的计算方法。 –

+0

目标状态保持不变。有没有更好的方式比我的方式? – Harjatin

+0

我绝对不会为此使用numpy ... –

回答

2

如何

import numpy as np 

def summed_manhattan(state): 
    shuffle = np.reshape((np.array(state)-1) % 9, (3, 3)) 
    all_dists = np.abs(np.unravel_index(shuffle, (3, 3)) - np.indices((3, 3))) 
    all_dists.shape = 2, 9 
    gap = np.where(shuffle.ravel() == 8)[0][0] 
    return all_dists[:, :gap].sum() + all_dists[:, gap + 1 :].sum() 

这通过避免重复调用到提高您的解决方案(合计为O(n^2))。相反,利用target_state的简单结构,它会针对每个索引计算进入具有相同值的target_state的索引状态;置换被存储在洗牌中。这个小窍门使算法O(n)和作为奖励使得它易于矢量化。

从某种意义上来说,这个解决方案是最优的,因为它显然不能比O(n)做得更好。

+0

这不会给出与输入状态相同的答案。示例状态是(2,8,3,1,0,5,4,7,6) – Harjatin

+0

哎呀,对不起,我们会研究它。 –

+0

@Harjatin我想我找到了罪魁祸首(正在引用错误顺序的缺口),你能再看一次吗? –