引言
差分进化算法是基于群体智能理论的优化算法,是通过群体内个体间的合作与竞争而产生的智能优化搜索算法,它保留了基于种群的全局搜索策略,采用实数编码、基于差分的简单变异操作和“一对一”的竞争生存策略,降低了进化计算操作的复杂性。
差分进化算法的原理
差分进化算法是一种自组织最小化方法,利用种群中两个随机选择的不同向量来干扰现有向量,种群中的每一个向量都要进行干扰。
- 它通过把种群中的两个成员之间的加权差向量加到第三个成员上来产生新的参数向量,该操作成为“变异”。
- 将变异向量的参数与另外预先确定的目标向量参数按一定规则混合来产生实验向量,该操作成为“交叉”;
- 若实验向量的代价函数比目标想i昂的代价函数低,实验向量就在下一代中替代目标向量,该操作成为“选择”;
差分进化算法流程
具体步骤如下:
确定差分进化算法的控制参数和所要采用的具体策略。控制参数包括:种群数量、变异算子、交叉算子、最大进化代数、终止条件等。
随机产生初始种群,进化代数k=1;
对初始种群进行评价,即计算初始种群中每个个体的目标函数值。
判断是否达到终止条件或达到最大进化代数;若是,则进化终止,将此时的最佳个体作为解输出;否则,继续下一步操作。
进行变异操作和价差操作,对边界条件进行处理,得到临时种群。
对临时种群进行评价,计算临时种群中每个个体的目标函数值。
对临时种群中的个体和原种群中对应的个体,进行“一对一”的选择操作,得到新种群。
进化代数k=k+1,转步骤(4).
ANN简介
作为深度学习的基础,神经网络模型发挥着很重要的作用。
我们来看一下ANN的定义:
神经网络是由具有适应性的简单单元组成的广泛并行互联的网络,它的组织能够模拟生物神经系统对真实世界物体所作出交互反应。
我们知道,生物神经网络的简单单元由生物神经元组成,那么在ANN模型中,简单单元由什么组成呢?
在经典ANN模型中,简单单元,即M-P神经元模型。我们知道感知机和Logistic回归都是线性分类模型,它们的不同点在于分类函数的选取是不一样的。\ 我们令z=wTxz=wTx。感知机的分类决策函数:f(x)=g(z)=sign(z)f(x)=g(z)=sign(z)\ 其中sign(⋅)sign(⋅)为阶跃函数:sign(z)=1 ifz≥0 else 1sign(z)=1 ifz≥0 else 1\ Logistic回归的分类决策函数则是Sigmoid函数:f(x)=g(z)=11+e−zf(x)=g(z)=11+e−z,它表示的是将样本分类成正例和负例的几率比。也是一个阶跃函数的替代函数。
具体地请参考我的博客\ https://blog.csdn.net/wuyanxue/article/details/80205582
典型的M-P神经元模型的输入与输出和Logistic回归一样,不过在这里Sigmoid是作为激活函数而存在的。也就是说,Sigmoid表示的只是一个神经元的输出,不代表整个ANN的输出。一张图形象地表示该MP神经元:\
ANN是什么?
我们知道生物神经网络是由非常多的生物神经元连接而成。类似地,ANN也是由多个神经元模型按照一定的规则连接构成。下图展示了一个全连接(Full Connected)神经网络(FNN):\
``` clear all close all clc
format long; format compact; global N CY popsize; M=1; N=8; L=1; popsize=50; %初始化样本数 F=0.5; CR=0.9;
LB=-1;
UB=1;
CY=100; %节点数
maxG=2000; %进化种群代数
for tt=1:20
tt
tic
W1=UBones(N,M,popsize)-(UB-LB)rand(N,M,popsize); W2=UBones(L,N,popsize)-(UB-LB)rand(L,N,popsize); Q=UBones(popsize,N+L)-(UB-LB)rand(popsize,N+L); %初始化权重和阈值
end Q=newQ; W1=newW1; W2=newW2; ypp=ypp2; Ep=Ep2; end time(tt)=toc; Weight1(:,:,tt)=bestW1; Weight2(:,:,tt)=bestW2; threshold(tt,:)=bestQ; mse(tt,:)=bestEp; outputy(tt,:)=bestypp; %记录最优结果 end [bestWeights1,bestWeights2,bestthreshold,bestmse,bestypp]=best(Weight1,Weight2,threshold,mse,outputy); disp('最佳权重W1 ='); disp(bestWeights1); disp('最佳权重W2 ='); disp(bestWeights2); disp('最佳阈值Q ='); disp(bestthreshold); minmse=bestmse maxmse=max(mse) meanmse=mean(mse) sd=std(mse) cpu=mean(time)
t=1:CY; % x=2tpi/CY; % yp=sin(x); %%待测函数1
x=2t/CY; yp=(2x-1.6).^3-2*x+4; %%待测函数2
% x=-2+t4/CY; % yp=(1-x.^2).exp(-x.^2/2); %%待测函数3
% x=t/100; % yp(t)=exp(-x).sin(6pi*x); %%待测函数4
e=(yp-bestypp).^2; subplot(2,1,1) plot(x,yp,x,bestypp,'rx') xlabel('x'),ylabel('y') title('学习结果比较 ') legend('样本曲线图','学习曲线图') subplot(2,1,2) plot(x,e) xlabel('x'),ylabel('MSE') title('均方误差曲线图')
% x=x';y=yp';trainy=best_ypp';mse=e'; % save x.txt x -ASCII
% save y.txt y -ASCII % save trainy.txt trainy -ASCII % save mse.txt mse -ASCII ```