如何将距离公式应用于python中的[x,y]坐标列表

问题描述 投票:0回答:2

为了使用遗传算法求解Traveling Salesman Problem (TSP),我在N×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]],....]

从技术角度来看,我不知道如何生成这样的列表。

P.S我发现this回答了这个问题,但它在R中,我仍然不明白如何解决这个问题。

python arrays python-3.x euclidean-distance traveling-salesman
2个回答
1
投票

使用切片很容易使用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]]]

1
投票
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])
© www.soinside.com 2019 - 2024. All rights reserved.