问题描述
仿真过程
matlab源码
%适应度函数命名为func1.m
%该函数为sphere函数
%%%%%%%%%%%%%%%%%%%%%%%适应度函数%%%%%%%%%%%%%%%%%%%%%%%%
function result=func1(x)
summ=sum(x.^2);
result=summ;
%20200928lu注:该matlab代码成功在matlabR2019a运行
%%%%%%%%%%%%%%%%%差分进化算法求函数极值%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
NP=50; %个体数目
D=10; %变量的维数
G=200; %最大进化代数
F0=0.4; %初始变异算子
CR=0.1; %交叉算子
%20201001lu注:CR控制着一个试验向量参数来自于随机选择的变异向量而不是原来向量的概率。较大的CR通常会加速收敛
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); %20201001lu注:2行G+1列;1行储存目标函数值,2行储存目标函数均值(种群各个体目标函数值之和除以种群数)
%%%%%%%%%%%%%%%%%%%%计算目标函数%%%%%%%%%%%%%%%%%%%%
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
%%%%%%%%%%%%%%%%%%%%%%变异操作%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%自适应变异算子%%%%%%%%%%%%%%%%%%%
%20201001lu注:在算法开始时该自适应变异算子为2F0,具有较大值,在初期保持个体多样性避免早熟;到后期变异率接近F0,避免最优解遭到破坏
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) %20201001lu注:| 计算逻辑 OR
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;%20201001lu注:遍历各个个体的每个维度,如果超过边界就用一个边界内的数值替换
end
end
end
%%%%%%%%%%%%%%%%%%%%%%选择操作%%%%%%%%%%%%%%%%%%%%%%%
for m=1:NP
Ob1(m)=func1(u(:,m));
end
for m=1:NP
if Ob1(m)<Ob(m)%20201001lu注: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 %20201001lu注:达到预设精度停止
break
end
end
[SortOb,Index]=sort(Ob);%20201001lu注:sort 对数组元素排序
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('均值变化曲线')
中 智能优化算法及其MATLAB实例(第二版)[包子阳,余继周][电子工业出版社][2018年01月][9787121330308]
经过调试,随书所有代码均可以在matlabR2019a上成功运行https://mianbaoduo.com/o/bread/YZyVlp9v