簡體   English   中英

如何將距離公式應用於python中的[x,y]坐標列表

[英]How to apply the distance formula to a list of [x,y] coordinates in python

為了使用遺傳算法解決旅行商問題(TSP) ,我在N x N網格上隨機生成Z點的列表:

field = [random.sample(range(N), 2) for x in range(Z)]

然后,為了創建旅行推銷員可以采用的隨機路徑,我將這些點進行混洗並將第一個點附加到最后一個點,以使該路徑成為“往返”。

path = random.sample(field, len(field))
path.append(member[0])

這是可能的“路徑”之一:

[[0, 7], [167, 118], [150, 173], [37, 21], [48, 150], [0, 7]]

但是,我還需要測量適合度,即路徑的長度 ,以確定要消除的路徑和要保留的路徑(因為這是遺傳算法)。 這是我不知道如何繼續進行的地方。

我目前的想法是對一對點使用距離公式 ,但隨后必須復制所有值,以將每對x,y坐標傳遞到計算器中以查找距離公式。

例如,對於以上幾點,它必須看起來像這樣:

[[[0, 7], [167, 118]], [[167, 118], [150, 173]], [[150, 173], [37, 21]],....]

從技術角度來看,我不知道如何生成這樣的列表。

PS我發現這個答案解決這一問題,但它是在R,和我還是不知道如何解決這個問題。

使用切片使用zip很容易,除了zip創建元組而不是列表:

>>> list(zip(path[0:], path[1:]))
[([0, 7], [167, 118]), ([167, 118], [150, 173]), ([150, 173], [37, 21]), ([37, 21], [48, 150]), ([48, 150], [0, 7])]

如果您絕對需要列表而不是元組,則可以使用列表理解來類似地創建它。

>>> [[a, b] for a, b in zip(path[0:], path[1:])]
[[[0, 7], [167, 118]], [[167, 118], [150, 173]], [[150, 173], [37, 21]], [[37, 21], [48, 150]], [[48, 150], [0, 7]]]
def dist(p1, p2):
    return math.hypot(p2[0] - p1[0], p2[1] - p1[1])

route = [[3, 0], [0, 4], [1, 4], [2, 1], [1, 4], [3, 0]]

total_dist = 0.0
for i in range(len(route) -1):
    total_dist += dist(route[i], route[i+1])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM