matlab新手快速上手3(差分进化算法)

news2025/1/16 18:00:11

        本文用经典差分进化框架模板,对matlab新手友好,快速上手看懂matlab代码,快速应用实践,源代码在文末给出。 

差分进化算法定义:

差分进化算法(Differential Evolution,简称DE算法)是一种优化算法,由Storn和Price于1997年提出。这个算法主要用于解决连续优化问题。

DE算法的基本思想是模拟生物进化中的个体竞争和适者生存的原理。它通过维护一个种群,每个个体都代表问题的一个解,并通过不断的迭代和交叉变异来寻找最优解。

DE算法的核心操作包括选择、交叉和变异:

  1. 选择:通过比较个体的适应度来选择优秀的个体进入下一代。
  2. 变异:随机选择种群中的个体,并基于差分向量进行变异操作,产生新的个体。
  3. 交叉:将变异后的个体与原始个体进行交叉操作,产生新的解。

DE算法具有较好的全局搜索能力和较快的收敛速度,在许多优化问题中表现良好。它已经被广泛应用于工程优化、信号处理、机器学习等领域。

开始编程:

参数与子函数定义:

function DE
%---------------------------------- 参数设置 -------------------------------
NP=100;                            %种群规模
D=10;                              %变量个数
MinX=-30;                          %范围下限
MaxX=30;                           %范围上限
alpha=0.6;                         %缩放因子
beta=0.6;                          %缩放因子
CR=0.8;                            %交叉概率
Error=0.001;                         %限定精度
Max_N=1000;                        %限定代数
flagc=[0,Max_N];                   %收敛标志
%---------------------- 粒子位置初始化 ----------------------
for i=1:1:D
    X(:,i)=MinX+(MaxX-MinX)*rand(NP,1);
    selfX(:,i)=X(:,i);
end
%----------------------- 计算函数值 -------------------------
F=fun(X);
selfF=F;
%---------------------------- 子函数1:目标函数 ----------------------------
function F=fun(X)
for i=1:1:size(X,1)
    for j=1:1:size(X,2)
        x(j)=X(i,j);
    end
    for j=1:1:size(X,2)-1
        temp(j)=100*(x(j+1)-x(j)^2)^2+(x(j)-1)^2;
    end
    F(i)=sum(temp);
end
%--------------------- 求最优解 ---------------------------
[Bestf,Indexf]=sort(F,2);        %对NP个函数值排序

Bestfi=Bestf(1);                 %第1个函数值最小
Bestp=Indexf(1);                 %最优粒子序号

粒子位置初始化:

此函数生成一个X矩阵,为NP行,D列的矩阵,矩阵元素为0~1的随机值,每一行代表一个个体列的元素代表每个自变量,selfX矩阵与它相等。

子函数定义:

根据fun(X)得知,子函数为经典的罗森布鲁克函数f(x) = \sum_{i=1}^{D-1} \left[ 100 \times (x_{i+1} - x_i^2)^2 + (x_i - 1)^2 \right],此函数在x = 1处时,函数最小为0。差分进化算法就是寻找此函数找到最小值的点,最终输出的X中最优个体中的元素应该都接近于1。

附:罗森布鲁克函数(百度百科)

程序主体:

%--------------------- 程序主循环开始 ----------------------
for gen=1:1:Max_N
    time(gen)=gen;
    %----------------- 变异操作 ---------------------------
    for i=1:1:NP
        flag1=ceil(rand*NP);
        while(flag1==i)
            flag1=ceil(rand*NP);
        end
        flag2=ceil(rand*NP);
        while((flag2==i)|(flag2==flag1))
            flag2=ceil(rand*NP);
        end
        X(i,:)=X(i,:)+alpha*(X(Bestp,:)-X(i,:))+beta*(X(flag1,:)-X(flag2,:));
    end
    %----------------- 交叉操作 ---------------------------
    for i=1:1:NP
        temp=rand(1,D);
        for j=1:1:D
            if temp(j)>CR
                X(i,j)=selfX(i,j);
            end                
        end
    end
    %----------------- 计算函数值 ---------------------------
    F=fun(X);
    %----------------- 选择操作 ---------------------------
    for i=1:1:NP
        if F(i)>=selfF(i)
            F(i)=selfF(i);
            X(i,:)=selfX(i,:);            
        end
    end
    %----------------- 迭代更新 ---------------------------
    for i=1:1:NP
        selfF(i)=F(i); selfX(i,:)=X(i,:);            
    end
    %----------------- 求最优解 ---------------------------
    [Bestf,Indexf]=sort(F,2);        %对NP个函数值排序
    Bestfi=Bestf(1);                 %第1个函数值最小
    Bestp=Indexf(1);                 %最优粒子序号
    %----------------------------- 记录结果 --------------------------------
    result(gen)=Bestfi;
    if mod(gen,10)==0
        disp(sprintf('代数:%d -------- 结果:%f',gen,Bestfi));
        plot(time,result,'r');axis([1,Max_N,0,100]);
        xlabel('迭代步数');ylabel('优化结果');drawnow;pause(0.1);
    end
    if Bestfi<Error break;end
end
disp(' ');
disp(sprintf('迭代步数:%d -------- 优化结果:%f',gen,Bestfi));
disp(X);

最外层循环:

大循环表示迭代Max_N次,time存储每次循环的迭代次数。

变异操作:

for循环遍历NP次,表示对每个个体都进行变异,flag1表示一个[1,NP]之间的随机整数,while控制这个整数不能与当前个体序号相等,flag1与flag2也不能相同,也就是防止选择相同的两个个体导致变异不明显。后续的X(i,:)的操作就是让当前个体加上0.6倍的与种群最优个体的差值向量(这个就是差分变异),再加上0.6倍的两个随机个体的差值向量。这样就实现了一个个体的变异操作。

交叉操作:

交叉操作很明显,就是根据交叉概率,将当前的个体的某些参数变为没变异之前的参数

选择操作:

选择操作就是根据适应度进行选择,将适应度低的个体变为上一代的个体。

迭代更新:

将这一代的个体更新到self中,为下一次迭代做准备,也就是在下一代更新后,将下一代与这个self做对比。

后续就是排序,绘图,输出,等操作,就是将个体按照适应度排序,将最优个体进行输出

源代码:

%---------------------------------- 程序说明 -------------------------------

%                          该程序实现了基本差分变异算法

%---------------------------------- 程序正文 -------------------------------
function DE
%---------------------------------- 参数设置 -------------------------------
NP=100;                            %种群规模
D=10;                              %变量个数
MinX=-30;                          %范围下限
MaxX=30;                           %范围上限
alpha=0.6;                         %缩放因子
beta=0.6;                          %缩放因子
CR=0.8;                            %交叉概率
Error=0.001;                         %限定精度
Max_N=1000;                        %限定代数
flagc=[0,Max_N];                   %收敛标志
%---------------------- 粒子位置初始化 ----------------------
for i=1:1:D
    X(:,i)=MinX+(MaxX-MinX)*rand(NP,1);
    selfX(:,i)=X(:,i);
end
%X=MinX+(MaxX-MinX)*rand(NP,D);
%selfX = X;
%----------------------- 计算函数值 -------------------------
F=fun(X);
selfF=F;
%--------------------- 求最优解 ---------------------------
[Bestf,Indexf]=sort(F,2);        %对NP个函数值排序

Bestfi=Bestf(1);                 %第1个函数值最小
Bestp=Indexf(1);                 %最优粒子序号
%--------------------- 程序主循环开始 ----------------------
for gen=1:1:Max_N
    time(gen)=gen;
    %----------------- 变异操作 ---------------------------
    for i=1:1:NP
        flag1=ceil(rand*NP);
        while(flag1==i)
            flag1=ceil(rand*NP);
        end
        flag2=ceil(rand*NP);
        while((flag2==i)|(flag2==flag1))
            flag2=ceil(rand*NP);
        end
        X(i,:)=X(i,:)+alpha*(X(Bestp,:)-X(i,:))+beta*(X(flag1,:)-X(flag2,:));
    end
    %----------------- 交叉操作 ---------------------------
    for i=1:1:NP
        temp=rand(1,D);
        for j=1:1:D
            if temp(j)>CR
                X(i,j)=selfX(i,j);
            end                
        end
    end
    %----------------- 计算函数值 ---------------------------
    F=fun(X);
    %----------------- 选择操作 ---------------------------
    for i=1:1:NP
        if F(i)>=selfF(i)
            F(i)=selfF(i);
            X(i,:)=selfX(i,:);            
        end
    end
    %----------------- 迭代更新 ---------------------------
    for i=1:1:NP
        selfF(i)=F(i); selfX(i,:)=X(i,:);            
    end
    %----------------- 求最优解 ---------------------------
    [Bestf,Indexf]=sort(F,2);        %对NP个函数值排序
    Bestfi=Bestf(1);                 %第1个函数值最小
    Bestp=Indexf(1);                 %最优粒子序号
    %----------------------------- 记录结果 --------------------------------
    result(gen)=Bestfi;
    if mod(gen,10)==0
        disp(sprintf('代数:%d -------- 结果:%f',gen,Bestfi));
        plot(time,result,'r');axis([1,Max_N,0,100]);
        xlabel('迭代步数');ylabel('优化结果');drawnow;pause(0.1);
    end
    if Bestfi<Error break;end
end
disp(' ');
disp(sprintf('迭代步数:%d -------- 优化结果:%f',gen,Bestfi));
disp(X);
%---------------------------- 子函数1:目标函数 ----------------------------
function F=fun(X)
for i=1:1:size(X,1)
    for j=1:1:size(X,2)
        x(j)=X(i,j);
    end
    for j=1:1:size(X,2)-1
        temp(j)=100*(x(j+1)-x(j)^2)^2+(x(j)-1)^2;
    end
    F(i)=sum(temp);
end

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

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

相关文章

基于springboot实现企业oa管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现企业oa管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了企业OA管理系统的开发全过程。通过分析企业OA管理系统管理的不足&#xff0c;创建了一个计算机管理企业OA管理系统的方案…

SVGDreamer: 文本引导矢量图形合成

现有的 Text-to-SVG 方法还存在两个限制&#xff1a;1.生成的矢量图缺少编辑性&#xff1b;2. 难以生成高质量和多样性的结果。为了解决这些限制&#xff0c;作者提出了一种新的文本引导矢量图形合成方法&#xff1a;SVGDreamer。 论文题目&#xff1a; SVGDreamer: Text Guid…

❤mac使用Idea工具

❤mac使用Idea工具 1、安装 直接跳过&#xff0c;文章有 &#xff08;点击跳转&#xff09; 给自己的mac系统上安装java环境 2、使用 快捷键 Command , 系统首选项 设置Idea连接数据库 打开右侧的database&#xff08;或菜单里&#xff09;连接数据库&#xff0c;根据提…

Zabbix 安装部署说明文档

Zabbix是一个开源的网络监控和管理系统&#xff0c;其架构设计用于提供企业级的监控解决方案。以下是Zabbix的主要组件&#xff1a; 1.Zabbix Server&#xff1a;这是Zabbix系统的核心组件&#xff0c;负责接收Agent程序报告的系统可用性、系统完整性和统计数据。Zabbix Serve…

架构师系列- JVM(三)- 类加载

通过字节码&#xff0c;我们了解了class文件的结构 通过运行数据区&#xff0c;我们了解了jvm内部的内存划分及结构 接下来&#xff0c;让我们看看&#xff0c;字节码怎么进入jvm的内存空间&#xff0c;各自进入那个空间&#xff0c;以及怎么跑起来。 4.1 加载 4.1.1 概述 …

基于FastGPT搭建知识库问答系统

什么是 FastGPT &#xff1f; FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景&#xff01; FastGPT 允许用户构建本地知识库&#xff0c;…

创新书荐|用《创新者的窘境》指导企业应对AI颠覆技术避免被颠覆

如何利用《创新者的窘境》应对AI的颠覆性技术时&#xff0c;了解并实施正确的战略对于确保企业在动荡的市场环境中保持增长和竞争力至关重要。我们分析了市场领导者和初创公司如何利用AI开辟新的增长路径&#xff0c;以及企业如何在技术革命中维持竞争优势。想要深入了解并实践…

[C++ QT项目实战]----C++ QT系统登陆界面设计

前言 在C QT项目开发过程中&#xff0c;设计系统登录界面可以使用QT框架来实现。以下是一个简单的系统登录界面设计示例&#xff1a; 创建登录界面UI&#xff1a;可以使用QT Designer来设计登录界面的UI&#xff0c;包括用户名输入框、密码输入框、登录按钮等。在QT Designer中…

Linux下软硬链接和动静态库制作详解

目录 前言 软硬链接 概念 软链接的创建 硬链接的创建 软硬链接的本质区别 理解软链接 理解硬链接 小结 动静态库 概念 动静态库的制作 静态库的制作 动态库的制作 前言 本文涉及到inode和地址空间等相关概念&#xff0c;不知道的小伙伴可以先阅读以下两篇文章…

实习算法准备之BFSDFS

这里写目录标题 1 理论1.1 BFS框架 2 例题2.1 二叉树的最小高度2.2 打开转盘锁2.3 滑动谜题 1 理论 BFS和DFS是两个遍历算法&#xff0c;其中DFS之前已经接触过&#xff0c;就是回溯&#xff0c;忘记的话请回顾回溯篇的例题&#xff08;全排列&#xff0c;N皇后&#xff09; B…

力扣数据库题库学习(4.23日)

610. 判断三角形 问题链接 解题思路 题目要求&#xff1a;对每三个线段报告它们是否可以形成一个三角形。以 任意顺序 返回结果表。 对于三个线段能否组成三角形的判定&#xff1a;任意两边之和大于第三边&#xff0c;对于这个表内的记录&#xff0c;要求就是&#xff08;x…

python学习笔记B-11:序列结构之列表--二维列表的遍历和生成式

二维列表的遍历方式&#xff0c;使用双层for循环&#xff0c;遍历索引号。 二维列表的生成式&#xff0c;也是使用类似双层循环的形式生成。 print("##初始化二维列表&#xff0c;每个元素就是1个列表") lst [["东方延续","太空军自然选择号舰长&qu…

【Java GUI】人机对弈五子棋

在学校的Java课程中&#xff0c;我们被分配了一项有趣的任务&#xff1a;开发一款能够实现人机对弈的五子棋游戏。为了更好地理解Java GUI的运用&#xff0c;并与大家分享学习心得&#xff0c;我将整个开发过程记录在这篇博客中。欢迎大家阅读并提供宝贵的意见和建议&#xff0…

PSoc™62开发板之SPI显示屏

实验目的 使用PSoc62™开发板驱动OLED模块&#xff0c;显示字符串、中文、数字 实验准备 PSoc62™开发板SSD1309 OLED模块 模块电路 引脚对应关系如下&#xff0c;这次实验采用的是SPI的驱动方式&#xff0c;可以无视SDA、SCL的命名 开发板GPIOSSD1309A0P10.0CSA1P10.1DC…

锂电池SOH预测 | 基于CNN的锂电池SOH预测(附matlab完整源码)

锂电池SOH预测 锂电池SOH预测完整代码锂电池SOH预测 锂电池的SOH(状态健康度)预测是一项重要的任务,它可以帮助确定电池的健康状况和剩余寿命,从而优化电池的使用和维护策略。 SOH预测可以通过多种方法实现,其中一些常用的方法包括: 容量衰减法:通过监测电池的容量衰减…

Python脚本抢票【笔记】

Python脚本抢票【笔记】 前言版权推荐Python脚本抢票【Python】microsoft edge驱动器下载以及使用最后 前言 2024-4-17 18:19:15 以下内容源自《【笔记】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是ht…

Spring Web MVC入门(2)——请求

目录 一、传递单个参数 基础类型和包装类型的区别 1、基础类型 &#xff08;1&#xff09;不传参 &#xff08;2&#xff09;传字符串 2、包装类型 &#xff08;1&#xff09;不传参 &#xff08;2&#xff09;传字符串 3、小结 二、传递多个参数 三、传递对象 四、…

Fast-DetectGPT 无需训练的快速文本检测

本文提出了一种新的文本检测方法 ——Fast-DetectGPT&#xff0c;无需训练&#xff0c;直接使用开源小语言模型检测各种大语言模型&#xff0c;如GPT等生成的文本内容。 Fast-DetectGPT 将检测速度提高了 340 倍&#xff0c;将检测准确率相对提升了 75%&#xff0c;超过商用系…

Redis缓存问题:穿透,击穿,雪崩,双写一致性等

Redis缓存问题:穿透,击穿,雪崩,双写一致性等 在高并发场景下,数据库往往是最薄弱的环节,我们通常选择使用redis来进行缓存,以起到缓冲作用,来降低数据库的压力,但是一旦缓存出现问题,也会导致数据库瞬间压力过大甚至崩溃,从而导致整个系统崩溃.今天就聊聊常见的redis缓存问题.…

多路递归的一些算法题

前言 首先我想讲一下&#xff0c;我对多路递归的理解吧&#xff0c;我认为多路递归就是循环中套回调&#xff0c;对于循环有几次就是几叉树&#xff0c;就好比我们常用的二叉树的dfs(node.left) 和 dfs(node.right)等前中后序遍历&#xff0c;也就是for (int i 0; i < 2; …