🌞欢迎来到智能优化算法差分进化算法的世界
🌈博客主页:卿云阁💌欢迎关注🎉点赞👍收藏⭐️留言📝
🌟本文由卿云阁原创!
🌠本阶段属于筑基阶段之一,希望各位仙友顺利完成突破
📆首发时间:🌹2021年12月11日🌹
✉️希望可以和大家一起完成进阶之路!
🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!
目录
0️⃣✨✨✨基本原理✨✨✨
差分进化算法是一种随机的启发式搜索算法,简单应用,有较强的鲁棒性和应用能力,从数学角度看是随机搜索算法,从工程角度看是一种自适应的迭代寻优过程.除了具有较好的收敛性外,差分进化算法算法非常易于理解与执行.它只包括不多的几个控制参数并且在整个迭代过程中这些参数的值可以保持不变. 在DE算法寻优的过程中,首先,从父代个体间选择两个个体进行向量做差生成差分矢量;其次,选择另外一个个体与差分矢量求和生成实验个体;然后,对父代个体与相应的实验个体进行交叉操作,生成新的子代个体;最后在父代个体和子代个体之间进行选择操作,将符合要求的个体保存到下一代群体中去。
1️⃣✨✨✨基本流程✨✨✨
Step1:参数设置及种群初始化;
Step2:终止条件判断,若未达到终止条件,则转到Step3;
Step3:变异;轮盘赌选择;
Step4:交叉;
Step5:边界条件处理;
Step6:计算目标函数;
Step7:轮盘赌选择;
Step8:输出结果,转到Step2。
2️⃣✨✨✨主要步骤✨✨✨
初始化
每个个体是一个n为向量(每一个分量可以想象成一个基因):
Xi,j(t)
(Lj,Uj)
第t代的第i个个体的第j个分量。每个个体代表解空间内的某一个解,而基因代表解的各个分量(和遗传算法一样,遗传算法的每个个体的染色体二进制码在一起代表了一个解)。
Xs=20; Xx=-20; x=zeros(5,10); x=rand(5,10)*(Xs-Xx)+Xx;
每一行代表一个个体。 每个体有是十个分量。
计算目标函数
Xs=20; Xx=-20; x=zeros(5,10); x=rand(5,10)*(Xs-Xx)+Xx; for m=1:5 Ob(m)=func1(x(:,m)); end function result=func1(x) summ=sum(x.^2); result=summ; end
变异操作
F
[0,2]是一个实常数因数
交叉
边界条件处理
在由边界约束得问题中必须保证产生新个体的参数值位于问题的可行域中。
3️⃣✨✨✨代码部分✨✨✨
%%%%%%%%%%%%%%%%%差分进化算法求函数极值%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%% clear all; %清除所有变量 close all; %清图 clc; %清屏 NP=50; %个体数目 D=10; %变量的维数 G=200; %最大进化代数 F0=0.4; %初始变异算子 CR=0.1; %交叉算子 Xs=20; %上限 Xx=-20; %下限 yz=10^-6; %阈值 %%%%%%%%%%%%%%%%%%%%%%%%%赋初值%%%%%%%%%%%%%%%%%%%%%%%% x=zeros(D,NP); %初始种群%20201001lu注:D行NP列 v=zeros(D,NP); %变异种群 u=zeros(D,NP); %选择种群 x=rand(D,NP)*(Xs-Xx)+Xx; %赋初值 trace=zeros(2,G+1); %%%%%%%%%%%%%%%%%%%%计算目标函数%%%%%%%%%%%%%%%%%%%% for m=1:NP Ob(m)=func1(x(:,m)); end trace(1)=min(Ob); trace(2,1)=sum(Ob)/length(Ob); %%%%%%%%%%%%%%%%%%%%%%%差分进化循环%%%%%%%%%%%%%%%%%%%%% for gen=1:G %%%%%%%%%%%%%%%%%%%%%%变异操作%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%自适应变异算子%%%%%%%%%%%%%%%%%%% lamda=exp(1-G/(G+1-gen)); F=F0*2^(lamda); %%%%%%%%%%%%%%%%%r1,r2,r3和m互不相同%%%%%%%%%%%%%%%% for m=1:NP %r1=randint(1,1,[1,NP]); r1=randi([1,NP],1,1); while (r1==m) r1=randi([1,NP],1,1); end r2=randi([1,NP],1,1); while (r2==m)|(r2==r1) r2=randi([1,NP],1,1); end r3=randi([1,NP],1,1); while (r3==m)|(r3==r1)|(r3==r2) r3=randi([1,NP],1,1); end v(:,m)=x(:,r1)+F*(x(:,r2)-x(:,r3)); end %%%%%%%%%%%%%%%%%%%%%%交叉操作%%%%%%%%%%%%%%%%%%%%%%% r=randi([1,D],1,1); for n=1:D cr=rand(1); if (cr<=CR)|(n==r) u(n,:)=v(n,:); else u(n,:)=x(n,:); end end %%%%%%%%%%%%%%%%%%%边界条件的处理%%%%%%%%%%%%%%%%%%%%% for n=1:D for m=1:NP if (u(n,m)<Xx)|(u(n,m)>Xs) u(n,m)=rand*(Xs-Xx)+Xx; end end end %%%%%%%%%%%%%%%%%%%%%%选择操作%%%%%%%%%%%%%%%%%%%%%%% for m=1:NP Ob1(m)=func1(u(:,m)); end for m=1:NP if Ob1(m)<Ob(m) x(:,m)=u(:,m); end end for m=1:NP Ob(m)=func1(x(:,m)); end sumf=sum(Ob); trace(1,gen+1)=min(Ob); trace(2,gen+1)=sumf/length(Ob); if min(Ob(m))<yz break end end [SortOb,Index]=sort(Ob); x=x(:,Index); X=x(:,1) %最优变量 Y=min(Ob) %最优值 %%%%%%%%%%%%%%%%%%%%%%%%%画图%%%%%%%%%%%%%%%%%%%%%%%%%% figure(1); plot(trace(1,:)); xlabel('迭代次数') ylabel('目标函数值') title('适应度进化曲线') figure(2); plot(trace(2,:)); xlabel('迭代次数') ylabel('目标均值') title('均值变化曲线') %%%%%%%%%%%%%%%%%%%%%%%适应度函数%%%%%%%%%%%%%%%%%%%%%%%% function result=func1(x) summ=sum(x.^2); result=summ; end
ss
s