DE算法简介

文章目录

  • 前言
  • 一、DE是什么?
  • 二、DE流程
    • 2.1 初始化种群
    • 2.2 变异(差分操作)
    • 2.3 交叉
    • 2.4 选择
    • 2.5 重复迭代
  • 三、DE运行结果

前言

这两天看了DE算法,简单说下自己的认识
在这里插入图片描述

一、DE是什么?

百科定义:差分进化算法(Differential Evolution Algorithm,DE)是一种高效的全局优化算法。它也是基于群体的启发式搜索算法,群中的每个个体对应一个解向量。

差分进化算法DE(Differential Evolution)由Storn等人于1995年提出。最初用于解决切比雪夫多项式问题,现在DE广泛用于解决复杂优化问题,并且取得非常不错的效果。它通过模拟生物进化的过程,通过不断演化生成一组解,以期望找到问题的最优解。

二、DE流程

在这里插入图片描述

  1. 初始化种群: 随机生成一定数量的个体,形成初始种群;
  2. 变异(差分操作):对每个个体执行差分操作,生成新的个体。差分操作涉及目标个体、两个随机选择的其他个体和一个缩放因子;
  3. 交叉: 将变异后的个体与目标个体进行交叉操作,生成新的解;
  4. 选择: 比较新生成的解和当前种群中对应位置的个体,选择其中更优秀的个体作为下一代的种群;
  5. 重复迭代: 重复执行上述步骤,直到满足停止条件,例如达到最大迭代次数。

2.1 初始化种群

初始化种群先确定个体的数量NP(又称种群规模)和个体的初始基因数D;然后指定范围后随机生成结果;
如下所示,博主是生成了一个基因数D为10的种群,种群数量NP为2(放的太多会影响内容,出于演示考虑就放两个,真正运行时不能这样)。

[[-18.02048681 -14.41718301  -9.71498628 -19.59758138   2.96261434
    9.88606516 -17.80244701  10.98612544   7.85991822  -4.35000201]
 [-11.12895672   7.22395332  -8.69086121  -7.86988929  -3.97588362
    7.80052737   7.26921488   6.6008707  -10.11471569  15.70808097]]

2.2 变异(差分操作)

在第g次迭代中,从种群中随机选择3个个体Xp1(g),Xp2(g),Xp3(g),且p1≠p2≠p3≠i,生成的变异向量为
在这里插入图片描述
Xp1(g)称为基向量,(Xp2(g)-Xp3(g))称为差分向量;
F是缩放因子,F越大,越不容易陷入局部极值点;F越小,越有利于收敛到局部极值点;
计算出来的结果Hi(g)被称为变异个体
上面的i代表的是当前第g代种群中的第i个个体,所以其实当前种群中的每个个体都会生成一个变异个体。

2.3 交叉

以一定概率让新产生的变异个体与原种群中个体进行交叉重组,增强种群的多样性
在这里插入图片描述
其中cr∈[0,1]为交叉概率,得出的结果Vi,j被称为试验个体

2.4 选择

将试验个体和父代个体相比较选择损失函数较小的作为下一代个体
在这里插入图片描述

2.5 重复迭代

重复执行上述步骤,直到满足停止条件,例如达到最大迭代次数。

三、DE运行结果

在这里插入图片描述
附代码

import numpy as np
import random
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #设置显示中文标签
plt.rcParams['axes.unicode_minus']=False   #设置正常显示符号
import math as mt

#损失函数
def funcl(x):
    y = 0
    for i in range(len(x)):
        y = y + x[i] ** 2
    return y


#初始化参数
NP = 100  # 初始化种群数
D = 10  # 基因数目
CR = 0.1  # 交叉算子
F0 = 0.4  # 初始变异算子
G = 1000  # 最大遗传代数
Xs = 20  # 上限
Xx = -20  # 下限

jiyi = np.random.rand(NP, D)
f = jiyi * (Xs - Xx) + Xx  # 随机获得初始种群
FIT = []  # 适应度计算存储列表
trace = []
xtrace = []

for i in range(NP):
    FIT.append(funcl(f[i]))

# 差分进化循环
for i in range(G):
    print(f'第{i}代')
    vec = []  # 变异种群,没看懂但是都是2维的
    u = [[] for i in range(NP)]  # 选择种群
    lamda = mt.exp(1 - G / (G - i))  # 自适应变异算子,随着迭代次数发生变化,之后可以讨论一下
    F = F0 * (2 ** lamda)
    # 变异操作,和遗传算法的变异不同!,得到任意两个个体的差值,与变异算子相乘加第三个个体
    for m in range(NP):
        r1 = random.sample(range(0, NP), 1)[0]
        while r1 == m:
            r1 = random.sample(range(0, NP), 1)[0]
        r2 = random.sample(range(0, NP), 1)[0]
        while r2 == m or r2 == r1:
            r2 = random.sample(range(0, NP), 1)[0]
        r3 = random.sample(range(0, NP), 1)[0]
        while r3 == m or r3 == r2 or r3 == r1:
            r3 = random.sample(range(0, NP), 1)[0]
        vec.append(f[r1] + F * (f[r2] - f[r3]))

    # 交叉操作,交叉所有个体的第j维
    r = random.sample(range(0, NP), 1)[0]
    for j in range(D):
        cr = np.random.rand()
        tem = []
        if cr <= CR or j == r:
            for k in range(len(f)):
                u[k].append(vec[k][j])  # 添加所有个体的第j维
        else:
            for k in range(len(f)):
                u[k].append(f[k][j])

    # 边界条件处理
    for j in range(NP):
        for m in range(D):
            if u[j][m] < Xx or u[j][m] > Xs:
                u[j][m] = np.random.rand() * (Xs - Xx) + Xx  # 因为vec是变异得到的,所以不一定在取值范围之内
            else:
                continue
    # 选择操作
    FIT1 = []
    for m in range(NP):
        FIT1.append(funcl(u[m]))
    for m in range(NP):
        if FIT1[m] < FIT[m]:
            f[m] = u[m]
    FIT = []
    for m in range(NP):
        FIT.append(funcl(f[m]))
    trace.append(min(FIT))
    xtrace.append(f[FIT.index(min(FIT))].tolist())  # 这里呀,ndarray读进来的时候会发生浅拷贝和深拷贝的问题,转成列表形式保存就不会出问题了
xvalue = []
for i in range(len(xtrace)):
    xvalue.append(xtrace[i][2])

# 绘制结果
plt.plot(trace, color='deepskyblue', marker='o', linewidth=2, markersize=3)
plt.xlabel('迭代次数', fontsize=10)
plt.ylabel('损失函数', fontsize=10)
plt.show()
plt.close()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用ChatGPT进行数据分析案例——贷款数据分析

目录 数据数据 每一行是一个记录,代表着一笔贷款,每一列是一个特征,一共1万多条数据,最后一列非常重要save_loans是否成功收回

在线代码调试运行微信开放平台官方接口调试校验工具大全

具体前往&#xff1a;在线代码调试&API校验工具大全

c++异常

c异常 1. c异常概念2. 异常的简单使用3. 自定义异常体系4. 异常的规范和安全4.1 异常规范4.2 异常安全 5. C标准库的异常体系和异常的优缺点 1. c异常概念 异常是一种处理错误的方式&#xff0c;当一个函数发现自己无法处理的错误时就可以抛出异常&#xff0c;让函数的直接或间…

【GCN】GCN学习笔记一

谱域图卷积 卷积 卷积定义离散空间的卷积 图卷积简介 卷积定理谱域图卷积实现思路如何定义图上的傅里叶变换拉普拉斯矩阵 &#xff08;Laplacian Matrix&#xff09;拉普拉斯矩阵的性质拉普拉斯矩阵的谱分解拉普拉斯矩阵与拉普拉斯算子 图傅里叶变换 图上的信号表示经典傅里叶变…

ubuntu20.04在docker下运行ros-noetic进行开发

经常折腾虚拟机各双系统 &#xff0c; 想着不如把docker利用起来&#xff0c;下面算是一个初学者使用docker运行ros的记录&#xff1a; 1. 安装 使用官方安装脚本自动安装 curl -fsSL https://test.docker.com -o test-docker.shsudo sh test-docker.sh验证是否安装成功 doc…

力扣 hot100 最长连续序列 哈希去重 双指针

128. 最长连续序列 ⭐ AC code class Solution {public int longestConsecutive(int[] nums) {if (nums.length 0)// 特判为空的数组&#xff0c;返回0return 0; // set实现去重HashSet<Integer> set new HashSet<>();for (int x : nums)set.add(x);Object[] a…

时间序列与 statsmodels:预测所需的基本概念(2)

时间序列与 statsmodels&#xff1a;预测所需的基本概念&#xff08;2&#xff09; 维托米尔约万诺维奇 跟随 出版于 走向发展 4 分钟阅读 2022 年 1 月 31 日 8 一、说明 在使时间序列平稳后&#xff0c;在本博客中我们应用 SARIMAX 预测并进行深入解释。 二、关于平稳性 …

算法设计与分析复习--求解最大子段和问题(分支法、动态规划)

文章目录 问题描述分治法动态规划法 问题描述 最大子段和问题&#xff1b; 洛谷P1115.最大子段和 分治法 利用归并排序的方法&#xff0c;但是由于是算最大子段和所以&#xff0c;并不能将它变成有序的&#xff0c;左边和右边的最大子段和通过调用函数&#xff0c;而中间的要…

SpringCloudAlibaba系列之Nacos服务注册与发现

目录 说明 认识注册中心 Nacos架构图 Nacos服务注册与发现实现原理总览 SpringCloud服务注册规范 服务注册 心跳机制与健康检查 服务发现 主流服务注册中心对比 小小收获 说明 本篇文章主要目的是从头到尾比较粗粒度的分析Nacos作为注册中心的一些实现&#xff0c;很…

「Tech初见」对epoll的理解

一、Motivation 通常&#xff0c;操作系统会为每个进程划分一个时间片的&#xff0c;在这个时间片内进程可以合法占有 cpu 进行一些计算任务。并当时间片结束后自动退回至就绪状态待命&#xff0c;等待下一次的调度 但是&#xff0c;有一种情况会使进程提前&#xff08;时间片…

Web实战:基于Django与Bootstrap的在线计算器

文章目录 写在前面实验目标实验内容1. 创建项目2. 导入框架3. 配置项目前端代码后端代码 4. 运行项目 注意事项写在后面 写在前面 本期内容&#xff1a;基于Django与Bootstrap的在线计算器 实验环境&#xff1a; vscodepython(3.11.4)django(4.2.7)bootstrap(3.4.1)jquery(3…

1、cvpr2024

CVPR2024官网&#xff1a; Overleaf模板&#xff1a; 更改作者&#xff08;去掉CVPR标识&#xff09; % \usepackage{cvpr} % To produce the CAMERA-READY version \usepackage[review]{cvpr} % To produce the REVIEW version改成 \usepackage{cvpr} …

性格懦弱怎么办?如何改变懦弱的性格?

性格懦弱是一个比较常见的话题了&#xff0c;懦弱带来的苦恼和困扰&#xff0c;深深影响着我们的生活&#xff0c;人际关系&#xff0c;以及事业的发展。然后如何摆脱懦弱&#xff0c;却并非易事&#xff0c;尤其是对于成年人来说&#xff0c;这种懦弱的性格特征&#xff0c;已…

Prometheus+Grafana监控

Prometheus是一种开源监控系统&#xff0c;可用于收集指标和统计数据&#xff0c;并提供强大的查询语言&#xff0c;以便分析和可视化这些数据。它被广泛用于云原生和容器化环境中&#xff0c;可以嵌入到Kubernetes集群中&#xff0c;并与其他Kubernetes工具进行集成。 Grafan…

大模型的交互能力

摘要&#xff1a; 基础大模型显示出明显的潜力&#xff0c;可以改变AI系统的开发人员和用户体验&#xff1a;基础模型降低了原型设计和构建AI应用程序的难度阈值&#xff0c;因为它们在适应方面的样本效率&#xff0c;并提高了新用户交互的上限&#xff0c;因为它们的多模式和生…

代码随想录算法训练营|五十六天

回文子串 647. 回文子串 - 力扣&#xff08;LeetCode&#xff09; dp含义&#xff1a;表示区间内[i,j]是否有回文子串&#xff0c;有true&#xff0c;没有false。 递推公式&#xff1a;当s[i]和s[j]不相等&#xff0c;false&#xff1b;相等时&#xff0c;情况一&#xff0c;…

图书管理系统 保姆级教学 手把手教你图书管理系统设计!

天梯无捷径&#xff0c;唯有苦攀登。 一起加油&#xff0c;小伙伴们&#xff01;&#xff01; 目录 1. 实现思路: 2. 那么如何找对象呢? 3. Book类的实现 Book类总代码&#xff1a; 4. BookList类的实现 BookList类总代码&#xff1a; 5. 用户的操作 5.1 AddOperation类…

在线识别二维码工具

具体请前往&#xff1a;在线二维码识别解码工具--在线识别并解码二维码网址等内容

10、背景分离 —— 大津算法

上一节学习了通过一些传统计算机视觉算法,比如Canny算法来完成一个图片的边缘检测,从而可以区分出图像的边缘。 今天再看一个视觉中更常见的应用,那就是把图片的前景和背景的分离。 前景和背景 先看看什么是前景什么是背景。 在图像处理和计算机视觉中,"前景"…

Go——一、Go语言安装及介绍

Go 一、Windows下安装Go1、下载Go2、配置环境变量3、下载Jetbrain下的GoLang4、编写hello world5、编译和执行 二、Go语言介绍1、开发文档2、Go语言核心开发团队3、为什么要创建Go4、Go语言发展史5、Go语言特点6、Golang执行过程6.1 执行过程分析6.2 编译是什么 7、开发注意事项…