来源书本包子阳《智能算法以及matlab实现》
代码:
%差分进化求函数极值
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); %初始化种群
v = zeros(D,NP); %变异种群
u = zeros(D,NP); %选择种群
x = rand(D,NP)*(Xs-Xx)+Xx; %赋初值
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%计算目标函数%%%%%%%%%%%%%%%%%%%
for m = 1:NP
Ob(m) = func1(x(:,m));
end
trace(1) = min(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]);
while (r1==m)
r1 = randint(1,1,[1,NP]);
end
r2 = randint(1,1,[1,NP]);
while (r2==m) | (r2==r1)
r2 = randint(1,1,[1,NP]);
end
r3 = randint(1,1,[1,NP]);
while (r2==m) | (r2==r1)|(r3==r2)
r1 = randint(1,1,[1,NP]);
end
v(:,m) = x(:,r1)+F*(x(:,r2)-x(:,r3));
end
%%%%%%%%%%%%%%%%交叉操作%%%%%%%%%%%%%%%
r = randint(1,1,[1,D]);
for n = 1:D
cr = rand(1);
if (cr<= CR) |(n==r)
u(n,:) = v(n,:);
else
u(n,:)= v(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
trace(gen+1) = min(Ob);
if min(Ob(m))<yz
break
end
end
[SortOb, Index] = sort (Ob);
x = x(:,Index); %最优变量
X = x(:,1);
Y = min(Ob);
%%%%%%%%%%%%%%%%%%%%%%%%%%%画图%%%%%%%%%%%
figure
plot(trace);
xlabel('迭代次数');
ylabel('目标函数值');
title('DE 目标函数曲线');
适应函数:
%%%%%%%%%%%%%%%%%%%适应度函数%%%%%%%%%
function result= func1(x)
summ = sum(x.^2);
result = summ;
end
不过感觉这个代码时间复杂度应该不小吧