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

news2024/11/14 14:58:51

目录

  • 一、采用DE求解 TSP
  • 二、 旅行商问题
    • 2.1 实际例子:求解 6 个城市的 TSP
    • 2.2 ==**求解该问题的代码**==
    • 2.3 代码运行过程截屏
    • 2.4 代码运行结果截屏(后续和其他算法进行对比)
  • 三、 ==如何修改代码?==
    • 3.1 减少城市坐标,如下:
    • 3.2 增加城市坐标,如下:
  • 四、 差分进化算法 (Differential Evolution, DE) 原理
    • 4.1 DE算法定义
    • 4.2 DE的基本思想
    • 4.3 DE的工作原理
    • 4.4 DE的参数
    • 4.5 DE的优缺点
      • 4.5.1 优点
      • 4.5.2 缺点
    • 4.6 DE的应用场景

一、采用DE求解 TSP

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

用来对比此专栏的
遗传算法(GA算法)求解实例—旅行商问题 (TSP)
粒子群算法(PSO算法)求解实例—旅行商问题 (TSP)
模拟退火算法(SA算法)求解实例—旅行商问题 (TSP)
蚁群算法(ACO算法)求解实例—旅行商问题 (TSP)
禁忌搜索算法(TS算法)求解实例—旅行商问题 (TSP)
注意每次运行算法得到的结果可能不太一样。

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

二、 旅行商问题

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

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

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

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

2.2 求解该问题的代码

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 differential_mutation(population, F=0.8):
    size = len(population)
    mutant_population = []
    for i in range(size):
        # 随机选择三个不同的个体
        indices = list(range(size))
        indices.remove(i)
        a, b, c = random.sample(indices, 3)

        # 获取个体的路径
        path_a, path_b, path_c = population[a], population[b], population[c]

        # 生成变异向量 (通过交换生成一个新路径)
        mutant_path = path_a.copy()
        for j in range(len(mutant_path)):
            if random.random() < F:
                # 确保新路径中不出现重复的城市
                if path_b[j] not in mutant_path:
                    mutant_path[j] = path_b[j]
                elif path_c[j] not in mutant_path:
                    mutant_path[j] = path_c[j]

        mutant_population.append(mutant_path)

    return mutant_population

# 差分进化算法主函数
def differential_evolution(cities, pop_size=20, max_iter=500, F=0.8, CR=0.7):
    num_cities = len(cities)

    # 初始化种群(每个个体是一个随机的城市排列)
    population = [list(np.random.permutation(num_cities)) for _ in range(pop_size)]

    # 初始化最优解
    best_solution = population[0]
    best_distance = total_distance(best_solution)

    for iteration in range(max_iter):
        # 差分变异
        mutant_population = differential_mutation(population, F)

        # 交叉与选择
        for i in range(pop_size):
            trial_path = population[i].copy()
            for j in range(num_cities):
                if random.random() < CR:
                    # 采用变异路径的值
                    trial_path[j] = mutant_population[i][j]

            # 修正路径,确保所有城市均被唯一访问
            missing_cities = list(set(range(num_cities)) - set(trial_path))
            for j in range(num_cities):
                if trial_path.count(trial_path[j]) > 1:  # 如果有重复的城市
                    trial_path[j] = missing_cities.pop()  # 替换为缺失的城市

            # 计算试验路径的总距离
            trial_distance = total_distance(trial_path)

            # 选择操作
            if trial_distance < total_distance(population[i]):
                population[i] = trial_path

            # 更新全局最优解
            if trial_distance < best_distance:
                best_solution = trial_path
                best_distance = trial_distance

        print(f"Iteration {iteration + 1}: Best distance = {best_distance:.2f}")

    return best_solution, best_distance

# 运行差分进化算法
best_path, best_distance = differential_evolution(cities)
print("Best path:", best_path)
print("Best distance:", best_distance)

2.3 代码运行过程截屏

在这里插入图片描述

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

在这里插入图片描述

三、 如何修改代码?

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

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

3.1 减少城市坐标,如下:

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

3.2 增加城市坐标,如下:

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

四、 差分进化算法 (Differential Evolution, DE) 原理

4.1 DE算法定义

差分进化算法 (Differential Evolution, DE) 是一种基于种群的全局优化算法,由 Storn 和 Price 在 1995 年提出。DE 主要用于连续优化问题,但也可以通过适当的修改和适配用于离散问题,如旅行商问题 (TSP)。差分进化算法通过对种群中个体的差分变异、交叉和选择操作,不断逼近问题的最优解。DE 因其简单、高效和全局搜索能力强而受到广泛应用。

4.2 DE的基本思想

差分进化算法的核心思想是通过模拟自然界中的进化过程,对种群中的个体进行变异和选择,以迭代地逼近最优解。算法在每一代中,对种群中的每个个体生成一个“变异个体”,并通过交叉操作形成“试验个体”,然后通过选择操作决定是否用试验个体替换当前个体。

4.3 DE的工作原理

  1. 初始化种群

    • 随机生成一个包含多个个体(解)的初始种群,通常个体数量为 pop_size。每个个体表示问题解空间中的一个可能解。
  2. 变异操作

    • 对于种群中的每个个体 X_i,生成一个变异个体 V_i。变异是通过随机选择三个不同的个体 X_aX_bX_c,按如下公式进行:
      V i = X a + F ⋅ ( X b − X c ) V_i = X_a + F \cdot (X_b - X_c) Vi=Xa+F(XbXc)
      其中:
      • F 是变异因子,通常取值在 [0, 2] 之间,用于控制差分向量的缩放,影响变异的幅度。
  3. 交叉操作

    • 将当前个体 X_i 与其对应的变异个体 V_i 进行交叉操作,生成一个“试验个体” U_i。交叉操作采用以下公式:
      U i , j = { V i , j , if rand ( 0 , 1 ) < C R  or  j = j r a n d X i , j , otherwise U_{i,j} = \begin{cases} V_{i,j}, & \text{if } \text{rand}(0, 1) < CR \text{ or } j = j_{rand} \\ X_{i,j}, & \text{otherwise} \end{cases} Ui,j={Vi,j,Xi,j,if rand(0,1)<CR or j=jrandotherwise
      其中:
      • CR 是交叉概率(交叉率),决定变异个体的分量保留到试验个体中的概率。
      • j_{rand} 是一个随机选择的索引,确保至少一个基因来自变异个体 V_i
  4. 选择操作

    • 选择操作用于决定是否用试验个体 U_i 替换当前个体 X_i。若 U_i 的适应度(即目标函数值)优于 X_i,则用 U_i 替换 X_i
      X i = { U i , if  f ( U i ) ≤ f ( X i ) X i , otherwise X_i = \begin{cases} U_i, & \text{if } f(U_i) \leq f(X_i) \\ X_i, & \text{otherwise} \end{cases} Xi={Ui,Xi,if f(Ui)f(Xi)otherwise
  5. 迭代和终止

    • 重复步骤 2-4,直到满足终止条件(如达到最大迭代次数或找到满意解)。

4.4 DE的参数

  • 种群大小 (pop_size):通常为解空间维度的 5 到 10 倍。较大的种群规模可以提高算法的全局搜索能力,但计算开销也会增加。
  • 变异因子 (F):控制差分变异的幅度。通常取值在 [0.5, 1.0] 之间。较大的 F 值可能会导致更大的变异,增强全局搜索能力,但可能降低收敛速度。
  • 交叉概率 (CR):控制交叉操作的概率。通常取值在 [0, 1] 之间。较高的 CR 值会使得个体与变异个体有更多基因交换,增加种群多样性。
  • 最大迭代次数 (max_iter):算法运行的最大迭代次数,决定了算法的终止条件。

4.5 DE的优缺点

4.5.1 优点

  • 全局搜索能力强:DE 算法通过差分变异和选择操作,能够有效避免陷入局部最优解,具有较强的全局搜索能力。
  • 参数少且易于设置:DE 算法的参数相对较少,通常只有种群大小、变异因子和交叉概率,易于理解和调整。
  • 简单易实现:DE 算法的结构简单,易于实现和应用于各种优化问题。
  • 适应性强:DE 算法可以处理复杂的非线性、多模态优化问题,适用于连续优化和某些离散优化问题。

4.5.2 缺点

  • 适用于连续优化问题:DE 算法主要用于连续优化问题,在离散优化问题中需要进行适配和修改。
  • 收敛速度较慢:在某些复杂问题中,DE 算法的收敛速度可能较慢,需要较多的迭代次数。
  • 依赖参数设置:虽然 DE 的参数少,但性能仍然对参数选择较为敏感,需根据具体问题进行调整。

4.6 DE的应用场景

  • 函数优化:解决复杂数学函数的最小化或最大化问题。
  • 工程优化:如结构设计优化、机器学习模型的参数优化、能源分配优化等。
  • 机器学习:用于优化神经网络的权重、支持向量机的参数选择等。
  • 组合优化问题:经过适当修改,DE 算法可用于求解旅行商问题 (TSP)、路径规划问题等。

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

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

相关文章

关系数据库(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;特别适用于复杂和高动态的场景。 该系统通过捕获实…

【python】python入门基础理论+实践,这一篇就够了

文章目录 简介&#xff1a;第一个hello world字符串str多引号字符串拼接字符串方法格式化方法判断方法查、改、计数、替换特殊方法 布尔型bool列表类型深浅copy列表生成式练习列表去重(不能用set)找到列表中第二大的数&#xff08;不能用sort&#xff09;判断一个列表是不是另外…

python selenium网页操作

一、安装依赖 pip install -U seleniumselenium1.py&#xff1a; from selenium import webdriver from selenium.webdriver.common.by import Bydriver webdriver.Chrome() driver.get("https://www.selenium.dev/selenium/web/web-form.html") title driver.ti…

网络安全学习(二)初识kali

kali有两种界面模式&#xff0c;为了更好的适应windows用户&#xff0c;需要操作一下。 先更新一下kali&#xff0c;执行命令 sudo apt-get update 然后换界面 sudo apt install kali-desktop-gnome 等待&#xff0c;出现如下界面时&#xff0c;选择gdm3&#xff08;键盘&a…

计算机视觉 对比学习 串烧一

文章目录 【文章列表】一、 Inst Disc1.1 文章摘要1.2 实验结果1.3 文章图示图一 超级学习结果的可视化图二 非参数softmax分类器的流程图三 近端正则化的效果图四 训练和测试目标的一致性图五 图像检索的结果表 1: CIFAR10 数据集上的分类准确率表 2: ImageNet 数据集上的分类…

临工30装载机多路阀

如图&#xff0c;因为螺丝太紧实&#xff0c;只好使用冲击螺丝刀卸下来了。 如图&#xff0c;防尘圈型号为FA 28 40 5/9 如图所示 28杆

【双方演化博弈】研究理论学习

1. 演化基础 1.1.演化博弈常用软件 载学习软件: Matlab、Vensim PLE、 Visio 其中,Matlab和Vensim PLE主要是用做演化博弈仿真,Matlab是演化博弈最常用的仿真软件&#xff0c;VensimPLE是系统动力学(SD)仿真软件也是常用仿真软件之一。 Python、Netlogo等软件也可以用来做演…

Vue 也能这样玩?Vuetify 打造超强大的UI体验

Vue 也能这样玩&#xff1f;Vuetify 打造超强大的UI体验&#xff01; 在前端开发的世界里&#xff0c;选择一个合适的 UI 组件库就像选择一把趁手的兵器。Vuetify 作为一款基于 Vue 的 Material Design 组件库&#xff0c;凭借其强大的功能和活跃的社区&#xff0c;已经成为了无…

深度学习-神经网络构造

文章目录 一、正则化惩罚1.L1正则化2.L2正则化 二、梯度下降&#xff08;Gradient Descent&#xff09;1.基本原理2.注意事项 三、BP神经网络1.基本原理2.网络结构3.特点 四、总结 一、正则化惩罚 正则化惩罚&#xff08;Regularization Penalty&#xff09;是机器学习中常用的…