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

        本文用经典差分进化框架模板,对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:DX(:,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);endfor j=1:1:size(X,2)-1temp(j)=100*(x(j+1)-x(j)^2)^2+(x(j)-1)^2;endF(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_Ntime(gen)=gen;%----------------- 变异操作 ---------------------------for i=1:1:NPflag1=ceil(rand*NP);while(flag1==i)flag1=ceil(rand*NP);endflag2=ceil(rand*NP);while((flag2==i)|(flag2==flag1))flag2=ceil(rand*NP);endX(i,:)=X(i,:)+alpha*(X(Bestp,:)-X(i,:))+beta*(X(flag1,:)-X(flag2,:));end%----------------- 交叉操作 ---------------------------for i=1:1:NPtemp=rand(1,D);for j=1:1:Dif temp(j)>CRX(i,j)=selfX(i,j);end                endend%----------------- 计算函数值 ---------------------------F=fun(X);%----------------- 选择操作 ---------------------------for i=1:1:NPif F(i)>=selfF(i)F(i)=selfF(i);X(i,:)=selfX(i,:);            endend%----------------- 迭代更新 ---------------------------for i=1:1:NPselfF(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)==0disp(sprintf('代数:%d -------- 结果:%f',gen,Bestfi));plot(time,result,'r');axis([1,Max_N,0,100]);xlabel('迭代步数');ylabel('优化结果');drawnow;pause(0.1);endif 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:DX(:,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_Ntime(gen)=gen;%----------------- 变异操作 ---------------------------for i=1:1:NPflag1=ceil(rand*NP);while(flag1==i)flag1=ceil(rand*NP);endflag2=ceil(rand*NP);while((flag2==i)|(flag2==flag1))flag2=ceil(rand*NP);endX(i,:)=X(i,:)+alpha*(X(Bestp,:)-X(i,:))+beta*(X(flag1,:)-X(flag2,:));end%----------------- 交叉操作 ---------------------------for i=1:1:NPtemp=rand(1,D);for j=1:1:Dif temp(j)>CRX(i,j)=selfX(i,j);end                endend%----------------- 计算函数值 ---------------------------F=fun(X);%----------------- 选择操作 ---------------------------for i=1:1:NPif F(i)>=selfF(i)F(i)=selfF(i);X(i,:)=selfX(i,:);            endend%----------------- 迭代更新 ---------------------------for i=1:1:NPselfF(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)==0disp(sprintf('代数:%d -------- 结果:%f',gen,Bestfi));plot(time,result,'r');axis([1,Max_N,0,100]);xlabel('迭代步数');ylabel('优化结果');drawnow;pause(0.1);endif 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);endfor j=1:1:size(X,2)-1temp(j)=100*(x(j+1)-x(j)^2)^2+(x(j)-1)^2;endF(i)=sum(temp);
end

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

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

相关文章

深入理解前端开发:从基础到实践

导语&#xff1a; 随着互联网技术的飞速发展&#xff0c;前端开发已经成为了Web开发中不可或缺的一部分。本文将带领大家深入了解前端开发的基础知识、技术栈和实践案例&#xff0c;帮助大家提升前端开发技能。 一、前端开发基础知识 1. HTML&#xff1a;网页的骨架 HTML&am…

KUKA机器人如何给IO信号或寄存器添加中文注释信息?

KUKA机器人如何给IO信号或寄存器添加中文注释信息? 如下图所示,首先,我们需要登录专家以上用户权限(默认密码KUKA), 如下图所示,点击“投入运行”—“网络配置”, 如下图所示,此时机器人的IP地址为192.168.1.10, 如下图所示,用一根网线连接机器人控制柜到笔记…

基于SpringBoot+Vue大学生兼职管理系统的设计与实现

目录 一、前言介绍 二、功能需求 三、功能结构设计 四、管理员功能实现 招聘单位管理 用户管理 论坛管理 公告信息管理 五、招聘单位功能实现 职位招聘管理 职位留言管理 简历投递管理 六、用户功能实现 在线论坛 职位招聘信息 简历投递 简历 七、部分核心代码 …

【C语言进阶】程序编译中的预处理操作

&#x1f4da;作者简介&#xff1a;爱编程的小马&#xff0c;正在学习C/C&#xff0c;Linux及MySQL.. &#x1f4da;以后会将数据结构收录为一个系列&#xff0c;敬请期待 ● 本期内容讲解C语言中程序预处理要做的事情 目录 1.1 预处理符号 1.2 #define 1.2.1 #define定义标识…

数据结构---线性表(顺序表)附代码

目录&#xff1a; 数据结构相关概念 1、什么是数据结构&#xff1f; 2、为什么需要数据结构&#xff1f; 顺序表 1、顺序表的概念及结构 1.1 线性表 1.2 顺序表 2、顺序表分类 3、动态顺序表的实现 什么是数据结构&#xff1f;&#xff1f; 数据结构是由 “数据”和 …

Unity 合并子物体获得简化Mesh

合并子物体获得简化Mesh &#x1f959;环境&#x1f96a;Demo &#x1f959;环境 PackageManager安装Editor Coroutines 导入插件&#x1f448; &#x1f96a;Demo 生成参数微调&#xff1a;Assets/EasyColliderEditor/Scripts/VHACDSettings/VHACDSettings.asset

需要同时控制几十台服务器?ansible帮助我们轻松搞定!

需要同时控制几十台服务器&#xff1f;ansible帮助我们轻松搞定&#xff01; 接到一个需求&#xff0c;需要到几十台目标服务器上执行测试任务&#xff0c;并汇总数据&#xff0c;想想看我们操作几台服务器还可以&#xff0c;几十台就有点效率低了&#xff0c;不要怕&#xff…

人工智能大模型开发之远程服务器编写代码IDE,我选Jetbrains Gateway,弃用VS Code

应用背景: 我们在大模型等抹模型训练的时候,需要Ubuntu服务器,或者Windows WSL子系统,这个时候你可能会考虑VS Code中的remote ssh插件来实现,但是VS Code的界面以及操作我不是很喜欢,但是使用Pycharm,我就觉得倍感亲切,而且最新版的2024.1版本的Jetbrains所有产品均支…

判断一个对象数组中的是否有属性为空

项目场景&#xff1a; 判断一个对象数组中的是否有属性为空 代码描述 hasEmptyProperty(objArray) {return Object.values(objArray).some(obj > {return Object.values(obj).some(value > value );});

Python 发送钉钉消息(markdown格式)

send.py import requests import json from config import *def sendDing():"""给钉钉发送消息&#xff0c;使用markdown格式在发送的消息后&#xff0c;需要手动一次"""text msg .join([f"{i}" for i in at_list])data {"m…

MATLAB数值类型

MATLAB 数值 MATLAB支持各种数字类&#xff0c;包括有符号和无符号整数以及单精度和双精度浮点数。默认情况下&#xff0c;MATLAB将所有数值存储为双精度浮点数。 您可以选择将任何数字或数字数组存储为整数或单精度数字。 所有数值类型都支持基本数组运算和数学运算。 转换…

pyqt拖入图片并显示

pyqt拖入图片并显示 介绍效果代码 介绍 像拖入文本一样&#xff0c;把图片拖入到窗体中显示。 效果 代码 import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout from PyQt5.QtGui import QPixmap, QDragEnterEvent, QDropEvent from PyQt5.Q…

顺序二叉树的删除(第二版本)

大家好我是新生小白&#xff0c;由于前面文章出版了bug所以在这个文章进行更新。主要错误地方为判断树里是否有要删除的元素的判断函数&#xff08;look&#xff09;出现错误&#xff0c;look里面循环条件出现错误&#xff01; 以下是全新代码&#xff1a; #include<iostr…

Ollama配置webui连接大预言模型

Ollama配置Web UI连接大预言模型 默认ollama安装后&#xff0c;chat对话只有命令行界面&#xff0c;交互体验较差。借助open-webui可以通过web界面连接ollama&#xff0c;从而实现类似chatgpt式的web交互体验。 使用家用PC实践记录如下&#xff1a; 1. 环境配置 本次使用的操作…

笔记-mathtype公式在PDF或打印出来显示不全

原文中的公式&#xff1a; 纸质版打印出来的公式有缺失 问题描述&#xff1a;mathtype公式编辑器所编辑的公式转成PDF或者打印出来有缺失 以下是解决方法的具体描述。 目录 一、准备工作二、操作步骤 一、准备工作 1、工具&#xff1a;mathtype、微软word 二、操作步骤 …

html如何实现按钮跳转,以及访问随机跳转

html如何实现按钮跳转&#xff0c;以及访问随机跳转。 <!DOCTYPE html> <html> <head><title>访问者跳转模拟</title><script type"text/javascript">function redirectToPort() {// 基于时间或随机数生成端口号var basePort …

数据可视化在不同行业中有哪些应用?

数据可视化即通过图表的形式将数据的内在信息有逻辑性地呈现给用户&#xff0c;使用户更容易发现数据中蕴藏的规律&#xff0c;找出问题&#xff0c;进而做出决策&#xff1b;另一方面&#xff0c;数据可视化项目也是一张重要的名片&#xff0c;是企业数字化建设效果的呈现。本…

el-select下拉框修改背景色

效果图&#xff1a; 1.el-select标签添加teleported属性&#xff0c;并设置为false 2.设置css样式

c++ 原子操作

虽然原子操作通常被称为“无锁”&#xff0c;但实际上它们在内部可能使用了锁来保证操作的原子性。然而&#xff0c;与传统的锁相比&#xff0c;原子操作通常具有更轻量级的实现&#xff0c;因为它们只涉及一个共享变量&#xff0c;而不需要对整个临界区进行加锁。 原子操作通…

go的反射操作reflect实践

通过反射机制&#xff0c;找到相应的Left或者Right广告 type SearchAdsObj struct {Left PositionAdsObj json:"left"Right PositionAdsObj json:"right" }func getFieldByName(obj SearchAdsObj, fieldName string) (interface{}, error) {fmt.Pr…