如何在Python中对[x,y]坐标列表应用距离公式(TSP遗传算法)
嘿,我明白你的需求了——要把闭环路径里的连续坐标点配对成嵌套列表,用来计算总路径长度对吧?这在Python里其实有好几种简洁的实现方式,我给你详细说一下:
方法一:列表推导式(直观易懂)
利用路径的闭环特性(最后一个元素是起点),我们可以通过遍历索引,把每个位置的点和下一个位置的点配对:
# 假设你的闭环路径已经生成好 path = [[0, 7], [167, 118], [150, 173], [37, 21], [48, 150], [0, 7]] # 生成连续点对列表 point_pairs = [[path[i], path[i+1]] for i in range(len(path)-1)]
这里len(path)-1是因为我们只需要遍历到倒数第二个元素,它的下一个元素就是最后一个(起点),刚好覆盖所有路段。
输出结果就是你想要的格式:
[[[0, 7], [167, 118]], [[167, 118], [150, 173]], [[150, 173], [37, 21]], [[37, 21], [48, 150]], [[48, 150], [0, 7]]]
方法二:用zip函数(更Pythonic)
zip函数可以把两个可迭代对象按位置一一配对,我们只需要把原路径和“去掉第一个元素的路径”配对即可:
path = [[0, 7], [167, 118], [150, 173], [37, 21], [48, 150], [0, 7]] # zip返回的是元组对,转成列表格式 point_pairs = [list(pair) for pair in zip(path, path[1:])]
这个方法更简洁,path[1:]会生成从第二个元素到最后一个元素的子列表,和原路径path配对后,自然得到所有连续的点对。
顺便补上路径长度计算(适应度函数)
既然你需要计算路径长度作为适应度,这里直接给你配套的欧几里得距离计算代码:
import math def calculate_fitness(path): # 先生成点对 point_pairs = [list(pair) for pair in zip(path, path[1:])] total_distance = 0 for p1, p2 in point_pairs: # 欧几里得距离公式 distance = math.sqrt((p2[0] - p1[0])**2 + (p2[1] - p1[1])**2) total_distance += distance # 遗传算法里通常希望适应度越小越好(或者取倒数,看你需求) return total_distance # 测试示例 path = [[0, 7], [167, 118], [150, 173], [37, 21], [48, 150], [0, 7]] fitness = calculate_fitness(path) print(f"当前路径的总长度(适应度):{fitness:.2f}")
这样你就能直接用这个函数来评估每条路径的优劣,筛选出更优的个体啦。
内容的提问来源于stack exchange,提问作者Sergey Ronin
相关产品推荐
相关产品推荐

