目录
0 引言
差分进化算法(Differential Evolution,DE)是1995年Storn等人为了解决切比雪夫多项式问题提出进化算法,在后续发展发现其更适用解决复杂优化问题。DE算法主要通过父代个体进行交叉变异生成差分矢量和子代个体;利用选择操作,将符合误差要求个体保留至下一代。
1 数学模型
DE数学模型包括前期对种群个体编码、父代之间交叉和变异、父子代个体之间选择,从而生成优势个体。具体模型如下:
1)初始化:在初始化过程中,生成一组均匀分布的总体如下:
式中j为种群个数,G迭代,Xlow,Xupp为问题维度边界。
2)变异:在突变过程中,我们为每个目标载体𝑋𝑗𝐺在第𝐺代生成一个突变载体𝑉𝑗𝐺,如下式所示:
式中F为突变系数;突变方案如下:
3)交叉:突变后,通过父代之间进行交叉生成一个新的向量为子代。如下式:
式中Cr为交叉系数,交叉示意图如下:
4)选择:对交叉和变异及原来个体进行适应度比较,采用轮盘赌等策略进行优势个体选拔:
式中f为适应度函数
2 优化方式
前篇对BP神经网络原理讲解(BP神经网络原理及Matlab代码复现-CSDN博客),从BP神经网络原理讲解中可以发现预测值主要受权值和阈值调整修正完成。因此结合上述DE原理介绍,可以将BP神经网络权值和阈值作为种群个体位置,每一个个体位置对应BP神经网络的预测值,将这个预测值作为适应度进行上述编码、交叉、变异和选择操作,得到更符合误差需求个体生成。
3 Matlab代码
3.1 伪代码
3.2 DE主函数
%% 开始循环
for time = 1 :de_Maxiter
for i = 1: de_pop
%变异
r = randperm(de_pop, 5);
mutantpos = Sol(r(1),:)+ F* (Sol(r(2),:)-Sol(r(3),:))...
+ F* (Sol(r(4),:)-Sol(r(5),:));
% 交叉
jj = randi(dim);
for d = 1:dim
if rand()< CR || d ==jj
crossoverpos(d) = mutantpos(d);
else
crossoverpos(d) = Sol(i,d);
end
end
% 检查是否越界
crossoverpos(crossoverpos>ub) = ub(crossoverpos>ub);
crossoverpos(crossoverpos<lb) = lb(crossoverpos<lb);
% 选择
new_fitness = fun(crossoverpos);
if new_fitness < Fitness(i)
Sol(i,:) = crossoverpos;
Fitness(i) = new_fitness;
end
end
[de_best, bestindex] = min(Fitness);
de_Sol = Sol(bestindex,:);
de_Fitness = de_best;
% 适应度
Fitnesstime(time) = de_best;
disp(['第' num2str(time), '代:' num2str(de_best)]);
en
3.3 DE-BP
单输出回归预测模型、多输出回归预测模型、分类模型和时间序列模型代码: