算法与数学建模 ga-path-planning

遗传算法求解路径规划

用遗传算法求解路径顺序优化,带种群、交叉、变异和适应度断言。

  • Python
  • 难度进阶
  • 未提供
  • 许可证MIT

收录于 2026-10-18 · 最后核对 2026-10-18

概览

所有字段以收录时的公开信息为准

项目名称
遗传算法求解路径规划
原始名称
未提供
别名
基于遗传算法的路径规划、遗传算法、路径规划、GA 路径规划、遗传算法路径优化
一句话简介
用遗传算法求解路径顺序优化,带种群、交叉、变异和适应度断言。
详细介绍

单文件 Python 示例:把一条访问顺序编码成染色体,用选择、交叉、变异迭代出更短路径。脚本固定随机种子并内置适应度断言,运行后会打印初始顺序和优化后的距离。适合作为遗传算法的第一个可运行样例,再扩展成带障碍物的二维栅格规划。

分类
算法与数学建模
语言
Python
技术栈
未提供
上手难度
进阶
Star 数
未提供
许可证
MIT
作者
开源拾遗

获取方式

优先使用原始仓库

本项目通过以下方式获取:站内代码片段

站内代码片段 102 行

文件snippets/ga-path-planning.py

ga-path-planning.py
"""遗传算法求解路径规划(旅行商问题 TSP)—— 站内原创示例代码

用途:给定若干地点的二维坐标,用遗传算法搜索一条访问所有地点一次并回到起点、
      且总距离尽量短的路线。常见于「基于遗传算法的路径规划」类课程设计。
依赖:仅 Python 标准库(random / math)。
运行:python ga-path-planning.py
许可:MIT(开源拾遗原创,可自由使用与修改)
"""

import math
import random

# 十个地点的坐标(可换成你自己的地图数据)
POINTS = [
    (2, 3), (5, 9), (8, 4), (12, 8), (15, 2),
    (18, 11), (21, 6), (24, 14), (27, 3), (30, 9),
]

POPULATION_SIZE = 80
GENERATIONS = 300
MUTATION_RATE = 0.2
ELITE = 4
SEED = 42


def distance(a, b):
    return math.hypot(a[0] - b[0], a[1] - b[1])


def route_length(route):
    """一条路线的总长度(首尾相连)。"""
    total = 0.0
    for i in range(len(route)):
        total += distance(POINTS[route[i]], POINTS[route[(i + 1) % len(route)]])
    return total


def random_route():
    route = list(range(len(POINTS)))
    random.shuffle(route)
    return route


def ordered_crossover(parent_a, parent_b):
    """顺序交叉(OX):保留一段连续基因,其余按另一父代的相对顺序填充。"""
    n = len(parent_a)
    start, end = sorted(random.sample(range(n), 2))
    child = [None] * n
    child[start:end + 1] = parent_a[start:end + 1]
    fill = [gene for gene in parent_b if gene not in child]
    index = 0
    for i in range(n):
        if child[i] is None:
            child[i] = fill[index]
            index += 1
    return child


def mutate(route):
    """交换变异:随机交换两个位置。"""
    if random.random() < MUTATION_RATE:
        i, j = random.sample(range(len(route)), 2)
        route[i], route[j] = route[j], route[i]
    return route


def tournament_select(population, k=3):
    contenders = random.sample(population, k)
    return min(contenders, key=route_length)


def solve():
    population = [random_route() for _ in range(POPULATION_SIZE)]
    best = min(population, key=route_length)

    for _ in range(GENERATIONS):
        population.sort(key=route_length)
        next_generation = population[:ELITE]  # 精英保留,保证不退化
        while len(next_generation) < POPULATION_SIZE:
            child = ordered_crossover(tournament_select(population), tournament_select(population))
            next_generation.append(mutate(child))
        population = next_generation
        best = min(best, min(population, key=route_length), key=route_length)

    return best


if __name__ == "__main__":
    random.seed(SEED)  # 固定随机种子,结果可复现
    baseline = route_length(list(range(len(POINTS))))
    best_route = solve()
    best_length = route_length(best_route)

    print("地点数量:", len(POINTS))
    print("初始顺序长度: %.2f" % baseline)
    print("优化后长度:   %.2f" % best_length)
    print("最优路线:", " -> ".join(str(i) for i in best_route))

    # 自检:必须访问每个地点且只访问一次;结果应优于初始顺序
    assert sorted(best_route) == list(range(len(POINTS)))
    assert best_length < baseline, (best_length, baseline)
    print("断言通过")

站内原创示例代码,仅演示核心思路,许可证为 MIT。本条目为站内整理内容,未提供原始仓库地址。

安装与运行

命令均来自公开资料

环境与依赖

  • Python 3.9+
安装命令 未提供
运行命令
python snippets/ga-path-planning.py

数据与硬件

未核实的字段不会编造

数据集说明
未提供
硬件要求
未提供

运行验证状态

四态徽章

实验已验证

已按说明完成安装、启动,并跑通实验或核心流程,结果可复现。

  1. 未测试
  2. 依赖安装已测试
  3. 基本启动已测试
  4. 实验已验证

说明:只有真正执行过对应步骤才会升级状态;未测试 表示仅核对了公开信息。

当前状态
实验已验证
最后核对
2026-10-18
核对版本
待核实
验证说明

已在本机 Python 3.14.6 实际运行:初始顺序 95.51,优化后 69.00,内置断言通过。

许可证与引用

转载与引用请保留出处

许可证
MIT
作者 / 组织
开源拾遗
原始仓库
未提供
核对版本
待核实
最后核对
2026-10-18
收录日期
2026-10-18

引用建议

遗传算法求解路径规划 / 开源拾遗. 《开源拾遗》收录,收录日期 2026-10-18,最后核对 2026-10-18. 许可证:MIT.

许可证以原始仓库的 LICENSE 文件为准;本站不对许可证做法律判断。