2017-01-24 81 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我想我找到了罪魁禍首(正在引用錯誤順序的缺口),你能再看一次嗎? –