Python:使用itertools.permutations实现全排列

例题

给五个坐标,绘制一系列的直线(路径),从原点出发,包含五个xy点,再回到原点。输出最小的路径长度

代码使用例

import itertools
import math

# 计算两点之间的欧几里得距离
def distance(point1, point2):
    return math.sqrt((point1[0] - point2[0]) ** 2 + (point1[1] - point2[1]) ** 2)

# 计算一条路径的总长度
def total_path_length(path):
    length = 0
    # 计算路径中的相邻点的距离
    for i in range(len(path) - 1):
        length += distance(path[i], path[i + 1])
    return length

# 给定的5个坐标点
coordinates = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]

# 原点
origin = (0, 0)

# 生成所有点的排列组合(包括原点)
permutations = itertools.permutations(coordinates)

# 初始化最短路径长度为无穷大
min_length = float('inf')

# 遍历所有路径(从原点出发,经过5个点并回到原点)
for perm in permutations:
    # 在路径开头插入原点,在末尾添加原点
    path = [origin] + list(perm) + [origin]
    # 计算该路径的总长度
    length = total_path_length(path)
    # 更新最短路径
    if length < min_length:
        min_length = length

# 输出最短路径长度
print(f"最短路径长度: {min_length:.2f}")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值