遗传算法(GA算法)求解实例---旅行商问题 (TSP)

news2024/9/20 19:08:27

目录

  • 一、采用GA求解 (TSP)
  • 二、 旅行商问题
    • 2.1 旅行商问题简介
    • 2.2 使用遗传算法解决 TSP
      • 2.2.1 遗传算法求解 TSP 的基本步骤
    • 2.3 实际例子:求解 6 个城市的 TSP
      • 1. 初始化种群
      • 2. 计算适应度
      • 3. 选择操作
      • 4. 交叉操作
      • 5. 变异操作
      • 6. 生成新种群
      • 7. 迭代与终止
  • 三、 ==**采用GA求解TSP**==
    • 3.1 求解该问题的代码
    • 3.2 代码运行过程截屏
    • 3.3 代码运行结果截屏(后续和其他算法进行对比)
  • 四、 ==如何修改代码?==
    • 4.1 减少城市坐标,如下:
    • 4.2 增加城市坐标,如下:
  • 五、 遗传算法 (Genetic Algorithm, GA) 原理
    • 5.1 GA算法定义
    • 5.2 GA算法的基本思想
    • 5.3 GA算法的工作流程
    • 5.4 GA算法的操作
      • 1. 初始化种群
      • 2. 适应度函数
      • 3. 选择操作
      • 4. 交叉操作
      • 5. 变异操作
    • 5.5 GA算法的优缺点
      • 5.5.1 优点
      • 5.5.2 缺点
    • 5.6 GA算法的应用场景

一、采用GA求解 (TSP)

求解代码在文中,后续会出其他算法求解TSP问题,你们参加数学建模竞赛只需要会改代码即可。

我知道大家对原理性的东西不感兴趣,我把原理性的东西放在后面,大家如果需要写数模论文可以拿去,但是记得需要改一改,要不然查重过不去。

二、 旅行商问题

2.1 旅行商问题简介

旅行商问题(Travelling Salesman Problem, TSP) 是一个经典的组合优化问题,问题描述如下:

给定一组城市以及每对城市之间的距离,一个旅行商需要从某个城市出发,经过每个城市恰好一次,并最终回到起点城市。目标是找到一条总距离最短的旅行路线。

2.2 使用遗传算法解决 TSP

遗传算法是解决 TSP 问题的有效方法之一。它通过模拟自然进化过程(如选择、交叉、变异等)来逐步优化解,寻找最短路径。

2.2.1 遗传算法求解 TSP 的基本步骤

  1. 定义编码方式

    • 一个个体(即解)表示为一个城市序列。例如,假设有 5 个城市,用数字 0, 1, 2, 3, 4 表示,一个可能的解为 [0, 2, 4, 3, 1],表示从城市 0 出发,依次经过城市 2, 4, 3, 1,最后回到城市 0。
  2. 定义适应度函数

    • 适应度函数用于评估每个个体的优劣。在 TSP 中,适应度通常定义为旅行总距离的倒数(因为我们希望最小化距离)。例如,个体的路径为 [0, 2, 4, 3, 1],则其适应度为该路径总距离的倒数。
  3. 初始化种群

    • 随机生成一组解(路径),构成初始种群。种群中的每个个体表示一个可能的路径。
  4. 选择操作

    • 根据个体的适应度值,以一定的概率选择个体作为父代,用于生成下一代种群。适应度高的个体有更大的概率被选择。
  5. 交叉操作

    • 从父代中选取两个个体进行交叉操作,生成新的子代。例如,采用部分映射交叉(Partially Mapped Crossover, PMX)
  6. 变异操作

    • 对新生成的个体(子代)进行随机变异,以增加解的多样性。例如,随机交换两个城市的位置。
  7. 生成新种群

    • 用子代替换父代,形成新的种群。
  8. 迭代和终止

    • 重复上述过程,直到达到预定的迭代次数或找到一个满意的解。

2.3 实际例子:求解 6 个城市的 TSP

假设有 6 个城市,其坐标如下:

城市X 坐标Y 坐标
01020
13040
22010
34030
41010
55020

目标是找到一个经过所有城市且总距离最短的路径。

1. 初始化种群

初始种群由一组随机生成的城市序列组成,例如:

  • 个体 1: [0, 2, 4, 1, 5, 3]
  • 个体 2: [1, 0, 3, 5, 4, 2]
  • 个体 3: [3, 1, 0, 2, 4, 5]
  • …(假设种群大小为 100)

2. 计算适应度

对每个个体计算其路径总距离,例如:

  • 个体 1 的路径 [0, 2, 4, 1, 5, 3]
    • 路径总距离 = 距离(0, 2) + 距离(2, 4) + 距离(4, 1) + 距离(1, 5) + 距离(5, 3) + 距离(3, 0)
    • 假设计算得到路径总距离为 100,则适应度为 1/100 = 0.01

3. 选择操作

采用轮盘赌选择法:根据适应度值的大小,随机选择适应度高的个体作为父代。

4. 交叉操作

采用部分映射交叉(PMX)

  • 父代 1: [0, 2, 4, 1, 5, 3]
  • 父代 2: [1, 0, 3, 5, 4, 2]

选取交叉点(例如 24),交换基因片段后得到子代:

  • 子代 1: [0, 2, 3, 5, 4, 3]
  • 子代 2: [1, 0, 4, 1, 5, 2]

再根据父代保持路径唯一性调整得到合法子代:

  • 调整后子代 1: [0, 2, 3, 5, 1, 4]
  • 调整后子代 2: [1, 0, 3, 2, 5, 4]

5. 变异操作

对子代进行变异,例如随机交换子代 1 的城市位置 [5, 1]

  • 变异后子代 1: [0, 2, 3, 1, 5, 4]

6. 生成新种群

用子代替换种群中的劣质个体,形成新的种群。

7. 迭代与终止

重复上述步骤,迭代进行进化,直到达到预定的迭代次数或找到最短路径。

三、 采用GA求解TSP

3.1 求解该问题的代码

import numpy as np
import random

# 定义城市坐标
cities = np.array([
    [10, 20],
    [30, 40],
    [20, 10],
    [40, 30],
    [10, 10],
    [50, 20]
])


# 计算两城市之间的欧几里得距离
def calculate_distance(city1, city2):
    return np.sqrt(np.sum((city1 - city2) ** 2))


# 计算总旅行距离
def total_distance(path):
    distance = 0
    for i in range(len(path) - 1):
        distance += calculate_distance(cities[path[i]], cities[path[i + 1]])
    distance += calculate_distance(cities[path[-1]], cities[path[0]])  # 回到起点
    return distance


# 初始化种群
def initialize_population(pop_size, num_cities):
    population = []
    for _ in range(pop_size):
        individual = list(np.random.permutation(num_cities))
        population.append(individual)
    return population


# 计算种群的适应度
def fitness(population):
    fitness_scores = []
    for individual in population:
        fitness_scores.append(1 / total_distance(individual))
    return fitness_scores


# 选择操作:轮盘赌选择法
def selection(population, fitness_scores):
    selected = []
    total_fit = sum(fitness_scores)
    prob = [f / total_fit for f in fitness_scores]
    for _ in range(len(population)):
        selected.append(population[np.random.choice(len(population), p=prob)])
    return selected


# 交叉操作:部分映射交叉(PMX)
def crossover(parent1, parent2):
    size = len(parent1)
    child = [-1] * size

    # 随机选择交叉点
    start, end = sorted(random.sample(range(size), 2))

    # 将父代1的片段复制到子代中
    child[start:end] = parent1[start:end]

    # 填充子代其余部分
    for i in range(size):
        if parent2[i] not in child:
            for j in range(size):
                if child[j] == -1:
                    child[j] = parent2[i]
                    break

    # 修复可能的重复问题
    for i in range(size):
        if child[i] == -1:
            for city in parent2:
                if city not in child:
                    child[i] = city
                    break

    return child


# 变异操作:交换变异
def mutation(individual, mutation_rate=0.01):
    for i in range(len(individual)):
        if random.random() < mutation_rate:
            j = random.randint(0, len(individual) - 1)
            # 交换两个城市的位置
            individual[i], individual[j] = individual[j], individual[i]
    return individual


# 遗传算法主函数
def genetic_algorithm(cities, pop_size=100, generations=500, mutation_rate=0.01):
    num_cities = len(cities)
    population = initialize_population(pop_size, num_cities)

    for generation in range(generations):
        fitness_scores = fitness(population)
        print(f"Generation {generation} Best distance: {1 / max(fitness_scores):.2f}")

        # 选择
        selected = selection(population, fitness_scores)

        # 交叉
        next_generation = []
        for i in range(0, len(selected), 2):
            parent1 = selected[i]
            parent2 = selected[(i + 1) % len(selected)]
            child1 = crossover(parent1, parent2)
            child2 = crossover(parent2, parent1)
            next_generation.extend([child1, child2])

        # 变异
        population = [mutation(ind, mutation_rate) for ind in next_generation]

    # 最佳路径
    best_individual = min(population, key=lambda ind: total_distance(ind))
    return best_individual, total_distance(best_individual)


# 运行遗传算法
best_path, best_distance = genetic_algorithm(cities)
print("Best path:", best_path)
print("Best distance:", best_distance)

3.2 代码运行过程截屏

在这里插入图片描述

3.3 代码运行结果截屏(后续和其他算法进行对比)

在这里插入图片描述

四、 如何修改代码?

这一部分是重中之重,大家参加数学建模肯定是想跑出自己的结果,所以大家只需要把自己遇到的数学问题,抽象成TSP问题,然后修改代码的城市坐标,然后运行即可。

# 定义城市坐标
cities = np.array([
    [10, 20],
    [30, 40],
    [20, 10],
    [40, 30],
    [10, 10],
    [50, 20]
])

4.1 减少城市坐标,如下:

# 定义城市坐标
cities = np.array([
    [10, 20],
    [30, 40],
    [20, 10],
    [40, 30]
])

4.2 增加城市坐标,如下:

# 定义城市坐标
cities = np.array([
    [10, 20],
    [30, 40],
    [20, 10],
    [40, 30],
    [30, 40],
    [20, 10],
    [10, 10],
    [50, 20]
])

五、 遗传算法 (Genetic Algorithm, GA) 原理

5.1 GA算法定义

遗传算法 (Genetic Algorithm, GA) 是一种基于自然选择和遗传机制的随机搜索和优化方法,由 John Holland 在 20 世纪 70 年代提出。遗传算法通过模拟自然界生物的进化过程(如遗传、选择、交叉、变异等)来搜索解空间,从而找到问题的最优解。它常用于复杂的优化问题和求解计算难题。

5.2 GA算法的基本思想

遗传算法的核心思想是模拟达尔文进化论的“自然选择,适者生存”原理。在遗传算法中,候选解被表示为“个体”,多个个体组成一个“种群”。通过对种群中的个体进行复制、交叉、变异等操作,算法在搜索空间内不断迭代,逐步进化出接近最优解的结果。

遗传算法主要包括以下几个步骤:

  1. 初始化种群:随机生成一定数量的个体作为初始种群,每个个体表示一个可能的解。
  2. 适应度评估:根据适应度函数(目标函数)评估每个个体的优劣,适应度值越高表示个体越优。
  3. 选择操作:根据个体的适应度值,以一定的概率选择个体作为父代,以生成下一代种群。适应度高的个体有更大的概率被选择。
  4. 交叉操作:通过交换两个个体(父母)的部分基因(染色体片段),生成新的个体(子代)。这模拟了生物的繁殖过程。
  5. 变异操作:随机改变个体的部分基因,以增加种群的多样性,避免陷入局部最优解。
  6. 生成新种群:用选择、交叉和变异操作产生的新个体替代旧种群,并重复步骤 2 到 5,直到满足终止条件(如达到最大迭代次数或找到最优解)。

5.3 GA算法的工作流程

遗传算法的典型工作流程如下:

  1. 初始化种群:随机生成种群内的所有个体。
  2. 迭代进化
    • 计算适应度:评估种群中每个个体的适应度。
    • 选择:根据适应度选择部分个体作为父代。
    • 交叉:对子代进行交叉操作,生成新个体。
    • 变异:对部分新个体进行变异操作。
    • 更新种群:用新个体替代旧种群。
  3. 终止条件:如果满足终止条件(如达到最大迭代次数或找到满意解),输出结果;否则,返回第 2 步继续迭代。

5.4 GA算法的操作

1. 初始化种群

种群中的每个个体通常用一个二进制串实数串其他编码方式表示。初始种群的大小通常根据问题的规模和复杂度来决定。

2. 适应度函数

适应度函数(Fitness Function)用于评估每个个体的质量。适应度函数的设计应能够正确反映目标问题的优化目标,适应度值越高表示个体越优。

3. 选择操作

常见的选择方法有:

  • 轮盘赌选择法(Roulette Wheel Selection):根据个体的适应度值,以概率比例进行选择,适应度高的个体被选择的概率更大。
  • 锦标赛选择法(Tournament Selection):随机挑选若干个体进行竞赛,选择其中适应度最高的个体。
  • 排序选择法(Rank Selection):将个体按适应度排序,赋予选择概率。

4. 交叉操作

交叉(Crossover)是模拟生物遗传过程中的基因重组操作。常见的交叉方法有:

  • 单点交叉(Single-Point Crossover):在染色体中随机选择一个位置,交换两个父代的基因片段。
  • 多点交叉(Multi-Point Crossover):在染色体中选择多个位置进行基因片段的交换。
  • 均匀交叉(Uniform Crossover):以固定的概率在每个位置选择父代的基因进行交换。

5. 变异操作

变异(Mutation)是对个体基因的随机改变,以增加种群的多样性。常见的变异方法有:

  • 位变异(Bit Mutation):随机改变个体二进制串的某个位(0 变 1 或 1 变 0)。
  • 实数变异(Real-Value Mutation):对实数编码的基因加入随机扰动。

5.5 GA算法的优缺点

5.5.1 优点

  • 全局搜索能力强:遗传算法通过并行搜索和种群进化,能有效避免局部最优解,具有较强的全局搜索能力。
  • 不依赖梯度信息:遗传算法不需要目标函数的导数或梯度信息,适用于不可微分、非线性、多峰值等复杂优化问题。
  • 适应性强:能够处理不同类型的优化问题(如离散和连续优化问题)。

5.5.2 缺点

  • 计算成本高:遗传算法需要大量计算资源,尤其是在种群规模大和问题规模大时,计算效率较低。
  • 收敛速度慢:相对于一些局部搜索方法,遗传算法的收敛速度较慢。
  • 参数敏感:算法性能对参数(如种群规模、交叉率、变异率等)比较敏感,需要进行调优。

5.6 GA算法的应用场景

  • 函数优化:在非线性、多峰值函数优化问题中,寻找全局最优解。
  • 组合优化:如旅行商问题(TSP)、背包问题、调度问题等。
  • 机器学习:用于特征选择、超参数优化、神经网络结构优化等。
  • 工程优化:如结构优化、控制参数调优、交通流量优化等。
  • 生物信息学:如 DNA 序列比对、基因表达数据分析等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2139665.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用户体验在网站建设中的重要性

用户体验在网站建设中的重要性不言而喻。以下是对其重要性的具体介绍&#xff1a; 提升用户满意度&#xff1a;用户体验的优劣直接关系到用户对网站的满意程度。一个设计良好、易于导航、响应迅速的网站能够让用户在使用过程中感到舒适和愉悦&#xff0c;从而增加用户对网站的…

【JavaEE】初识⽹络原理

目录 一、计算机相互连接的方式 1.1 局域网LAN 1.2 广域网WAN 二、网络通信的基础 1.1 IP地址 1.2 格式 1.3 端口号 三、认识协议 1.1 概念 1.2 五元组&#xff1a; 1.3 协议分层 1.4 OSI七层模型 1.5 TCP/IP五层&#xff08;或四层&#xff09;协议 一、计算机相互连…

【计算机网络 - 基础问题】每日 3 题(七)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

合并RAR分卷压缩包

因为文件压缩之后体积仍然过大&#xff0c;大家可能会选择进行分卷压缩&#xff0c;那么rar分卷压缩包之后如何合并成一个压缩包文件呢&#xff1f;今天我们来学习rar分卷压缩包&#xff0c;合并成一个的方法。 最基础的方法就是将分卷压缩包解压出来之后&#xff0c;再将文件…

AttributeError: module ‘numpy‘ has no attribute ‘object‘.

报错&#xff1a; AttributeError: module numpy has no attribute object. np.object was a deprecated alias for the builtin object. To avoid this error in existing code, use object by itself. Doing this will not modify any behavior and is safe. 位置&#xff…

HBase集群环境搭建

HBase集群环境搭建 一、集群规划二、前置条件三、集群搭建3.1 下载并解压3.2 配置环境变量3.3 集群配置1. hbase-env.sh2. hbase-site.xml3. regionservers4. backup-masters 3.4 HDFS客户端配置3.5 安装包分发 四、启动集群4.1 启动ZooKeeper集群4.2 启动Hadoop集群4.3 启动HB…

rtems 5.3 qemu realview_pbx_a9 环境搭建:生成 rtems arm 工具链

前言 rtems 是一款比较优秀的 RTOS&#xff0c;官方网址 https://www.rtems.org/ 当前 rtems 最新发布的版本&#xff1a;rtems-5.3 版本&#xff0c; 下载地址 https://ftp.rtems.org/pub/rtems/releases/5/5.3/ rtems 支持的 平台也是比较多的&#xff0c;当前支持 STM32F4…

差分进化算法(DE算法)求解实例---旅行商问题 (TSP)

目录 一、采用DE求解 TSP二、 旅行商问题2.1 实际例子&#xff1a;求解 6 个城市的 TSP2.2 **求解该问题的代码**2.3 代码运行过程截屏2.4 代码运行结果截屏&#xff08;后续和其他算法进行对比&#xff09; 三、 如何修改代码&#xff1f;3.1 减少城市坐标&#xff0c;如下&am…

关系数据库(6,7,8)

目录 除运算 例子 关系演算 元组关系演算语言ALPHA 检索操作 更新操作 插入操作 删除操作 除运算 其中x&#xff0c;y&#xff0c;z是属性组&#xff0c;r对s的除运算得到新的关系p&#xff08;x&#xff09;&#xff0c;列数减少了&#xff0c;变得只有一列。 例子 当…

103.WEB渗透测试-信息收集-FOFA语法(3)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;102.WEB渗透测试-信息收集-FOFA语法&#xff08;2&#xff09; FOFA使用实例 组件框架 …

基于yolov5的混凝土缺陷检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv5的混凝土缺陷检测系统是一项利用深度学习技术&#xff0c;特别是YOLOv5算法&#xff0c;实现对混凝土结构中缺陷进行自动检测和识别的系统。该系统通过收集大量的混凝土图像数据&#xff0c;并标注缺陷区域&#xff0c;如裂缝、空洞、剥落等&#xff0…

Github 2024-09-16 开源项目周报 Top14

根据Github Trendings的统计,本周(2024-09-16统计)共有14个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4TypeScript项目2Go项目2JavaScript项目2Shell项目2Rust项目2C++项目2Jupyter Notebook项目1C#项目1React: 用于构建用户界面的JavaS…

中国矿业大学《2023年868+2007年自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《25届中国矿业大学868自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2007年复试真题 2023年初试真题 Part1&#xff1a;完整版真题 2007年复试真题 2…

【自动驾驶】控制算法(八)横向控制Ⅳ | 调试与优化

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

寄存器的位数据调测方法(摩尔信使MThings)

图中是一种典型MODBUS寄存器位数据定义方式&#xff0c;这种数据定义主要基于数据紧凑设计原则&#xff08;精确位宽分配&#xff09;&#xff0c;将明确含义&#xff08;取值范围&#xff09;的字段分配最小必要的数据长度&#xff0c;进而减少寄存器总数&#xff0c;提升数据…

【更新】上市公司-供应链金融水平数据(2000-2023年)

上市公司供应链金融是指上市公司利用其产业链核心地位&#xff0c;通过整合金融资源&#xff0c;为供应链上下游企业提供包括融资、结算、风险管理等在内的综合金融服务。为了衡量上市公司的供应链金融水平&#xff0c;参考周兰等&#xff08;2022&#xff09;的研究方法&#…

统信服务器操作系统【d版字符系统升级到dde图形化】配置方法

统信服务器操作系统d版本上由字符系统升级到 dde 桌面系统的过程 文章目录 一、准备环境二、功能描述安装步骤1. lightdm 安装2. dde 安装 一、准备环境 适用版本&#xff1a;■UOS服务器操作系统d版 适用架构&#xff1a;■ARM64、AMD64、MIPS64 网络&#xff1a;连接互联网…

Redis Key的过期策略

Redis 的过期策略主要是指管理和删除那些设定了过期时间的键&#xff0c;以确保内存的有效使用和数据的及时清理。 具体来说&#xff0c;Redis 有三种主要的过期策略&#xff1a;定期删除&#xff08;Scheduled Deletion&#xff09;、惰性删除&#xff08;Lazy Deletion&#…

要想实现稳定利润就来Anzo Capital 昂首资本官网

都知道低波动性交易策略不仅降低了风险&#xff0c;还提供了一种在波动市场中保持冷静的方法&#xff0c;但投资者要想在低波动性交易策略下实现稳定的利润&#xff0c;还需来Anzo Capital 昂首资本官网。 Anzo Capital 昂首资本官网的交易策略基于几个核心原则。首先&#xf…

基于yolov8的无人机检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的无人机检测系统是一项前沿技术&#xff0c;结合了YOLOv8深度学习模型的强大目标检测能力与无人机的灵活性。YOLOv8作为YOLO系列的最新版本&#xff0c;在检测精度和速度上均有显著提升&#xff0c;特别适用于复杂和高动态的场景。 该系统通过捕获实…