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://xiahunao.cn/news/2979664.html

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

相关文章

RD77MS2 三菱iQ-R系列2轴简单运动模块(SSCNETⅢ/H型)

RD77MS2 三菱iQ-R系列2轴简单运动模块(SSCNETⅢ/H型) RD77MS2用户手册,RD77MS2外部连接,RD77MS2规格。RD77MS2参数说明&#xff1a;2轴;SSCNETⅢ/H连接&#xff0c;位置控制、同步控制、速度.转矩控制、轨迹控制;控制单位mm、inch、degree、pulse;定位数据600数据轴。 RD77MS2图…

导出JVM的线程信息

1. 查询出Java应用的进程的PID ps -ef|grep java 此时的PID是 33 2. 使用JDK自带的工具jstack导出日志 jstack -l 33 > 2022jstack.log 3.然后直接下载

Python 基础、流程、容器、函数

一、基础语法 1.1 前言 1.1.1 Python简介 Python是一门编程语言&#xff0c;Python的作者是Guido van Rossum&#xff08;龟叔&#xff09; Python优点&#xff1a;简单易学 Python与嵌入式、集成电路行业 强大的库和工具生态系统&#xff1a;Python拥有广泛而强大的库和…

免费GPU Google Colab保姆级使用攻略,实现数据集快速下载

Colab&#xff08;Colaboratory&#xff09;是一个基于云的交互式开发环境&#xff0c;专为数据科学、机器学习和人工智能任务设计。Colab 由 Google 提供&#xff0c;允许用户在浏览器中直接编写、运行、共享和协作处理 Python代码&#xff0c;特别是那些涉及大数据处理、计算…

semaphore信号量使用+原理分析

1.概述 Semaphore 信号量&#xff0c;相当于一个计数器&#xff0c;通常用来限制线程的数量。 每个线程操作前会先获取一个许可证&#xff0c;逻辑处理完成之后就归还这个许可证。 通俗的解释&#xff1a;相当于一个停车场&#xff0c;有10个停车位&#xff0c;进来一个车&am…

比较器仿真PSS+PNOISE测噪声

没有目录标题 一、参考二、PSSPnoise测输入噪声电压三、具体步骤&#xff1a;1.设置PSS&#xff1a;2.设置pnoise&#xff1a;3.根据仿真结果计算输出噪声电压 4.计算比较器的gain和输入噪声电压4.1 计算gain的方式一和对应的输入噪声电压4.2 计算gain的方式二和对应的输入噪声…

电脑提示msvcp110.dll是什么意思?7个实测有效方法教你搞定

在使用Windows操作系统的过程中&#xff0c;用户难免会遭遇与动态链接库&#xff08;DLL&#xff09;文件相关的问题&#xff0c;其中MSVCP110.dll便是其中之一。作为Microsoft Visual C Redistributable Package的重要组成部分&#xff0c;MSVCP110.dll对于许多基于C开发的应用…

【MySQL 数据宝典】【磁盘结构】- 005 Undo log 撤销日志

一、基本介绍 ​ 每当我们要对一条记录做改动时&#xff08;这里的改动可以指 INSERT 、 DELETE 、 UPDATE &#xff09;&#xff0c;都需要留一手 -> 把回滚时所需的东西都给记下来 ​ 你插入一条记录时&#xff0c;至少要把这条记录的主键值记下来&#xff0c;之后回滚的…

用于便携可穿戴设备的RX8130CE

用于便携可穿戴设备的时钟芯片模块:RX8130CE。时钟芯片模块RX8130CE&#xff0c;其特点是3225小尺寸和电池控制&#xff0c;可应用于可穿戴设备RX8130CE具有自动电源切换功能&#xff0c;可监视电源电压&#xff0c;并通过自动操作切换到备用电源&#xff0c;备用电源的开关电压…

PPT设置日期随改动而更新

点击插入——点击日期和时间 弹出的新窗口中勾选自动更新日期和时间

电脑上怎么调照片尺寸?这几个方法方便又好用

平时我们在制作幻灯片演示时&#xff0c;调整图片的大小可以确保图片适应幻灯片的布局&#xff0c;并提供清晰的展示效果&#xff0c;单张处理起来的话就比较浪费时间&#xff0c;但是通常我们需要批量去修改图片尺寸大小&#xff0c;这就需要用到比较专业的图片处理工具了&…

40-50W 1.5KVDC 隔离 宽电压输入 DC/DC 电源模块 ——TP40(50)DC 系列

TP40(50)DC系列电源模块额定输出功率为40-50W、应用于2:1、4&#xff1a;1电压输入范围 9V-18V、18V-36V、36V-75V、9V-36V、18V-75V的输入电压环境&#xff0c;输出电压精度可达1%&#xff0c;可广泛应用于通信、铁路、自动化以及仪器仪表等行业。

视频不够清晰怎么办?教你几种有效方法

在我们日常生活中&#xff0c;有时候我们会遇到不清晰的视频&#xff0c;这给我们带来了很多不便。那么&#xff0c;怎么将不清晰的视频变清晰呢&#xff1f;本文将为您介绍一些常用的软件工具&#xff0c;帮助您提升视频的清晰度。 方法一&#xff1a;使用AI技术 AI技术可以通…

Python写个二维码

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、进入官网下载二、下载一下三.输入代码 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、进入官网下载 官网 pip insta…

【C++庖丁解牛】C++11---右值引用和移动语义

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1 左值引用和右值引用2 左…

牛客NC179 长度为 K 的重复字符子串【simple 哈希,滑动窗口 C++、Java、Go、PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/eced9a8a4b6c42b79c95ae5625e1d5fd 思路 哈希统计每个字符出现的次数。没在窗口内的字符要删除参考答案C class Solution {public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c…

Day08-Java进阶-递归异常及其处理自定义异常

1. 递归 package com.itheima.recursion;public class RecursionDemo3 {/*不死神兔(斐波那契额数列)*/public static void main(String[] args) {int sum getSum(20);System.out.println(sum);}public static int getSum(int n) {if (n 1 || n 2) {return 1;} else {return …

【nginx】nginx启动显示80端口占用问题的解决方案

目录 &#x1f305;1. 问题描述 &#x1f30a;2. 解决方案 &#x1f305;1. 问题描述 在启动nginx服务的时候显示内容如下&#xff1a; sudo systemctl status nginx 问题出现原因&#xff1a; 根据日志显示&#xff0c;Nginx 服务启动失败&#xff0c;主要原因是无法绑定…

day1c++基础

const char*p;//值不可以改变&#xff0c;地址可以改变 const &#xff08;char*&#xff09;p; //值不可以改变&#xff0c;地址可以改变 char* const p; //值可以改变&#xff0c;地址不可以改变 const char* const p; //值不可以改变&#xff0c;地址不可以改变 char co…

【C++】封装、继承和多态

引言 在现代软件开发中&#xff0c;面向对象编程&#xff08;Object Oriented Programming&#xff09;已经成为一种广泛应用的编程范式。C作为一种支持面向对象编程的语言&#xff0c;在封装、继承和多态方面提供了强大的特性。本文将介绍C中的封装、继承和多态概念&#xff…