如何将距离公式应用于 python 中的 [x,y] 坐标列表
How to apply the distance formula to a list of [x,y] coordinates in python
为了使用遗传算法解决 Traveling Salesman Problem (TSP),我在 N×N 网格上随机生成 Z 点列表:
field = [random.sample(range(N), 2) for x in range(Z)]
之后,为了创建旅行推销员可以采用的随机路径,我打乱了点并将第一个点附加到最后一个点以使路径成为 "round trip"。
path = random.sample(field, len(field))
path.append(member[0])
这是可能的 "paths":
[[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 我找到了解决该问题的 答案,但它在 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])
为了使用遗传算法解决 Traveling Salesman Problem (TSP),我在 N×N 网格上随机生成 Z 点列表:
field = [random.sample(range(N), 2) for x in range(Z)]
之后,为了创建旅行推销员可以采用的随机路径,我打乱了点并将第一个点附加到最后一个点以使路径成为 "round trip"。
path = random.sample(field, len(field))
path.append(member[0])
这是可能的 "paths":
[[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 我找到了解决该问题的
使用切片 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])