You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:48:24