赞
踩
类似于其它进化算法范例,DE是一种基于群体的随机搜索算法,它采用变异、交
替换等算子指导群体进化。但是,DE执行简单,在收敛速度和搜索性能方面均占
有一定的优势。
在进化过程中,DE保持一个规模为NP的群体(也就是群体中包含NP个个体,每
个个体为搜索空间中的一个点),并且通过迭代的方式改善群体质量。它从当前群体
中提取方向和距离等信息用于产生下一代群体。目前,几乎所有的DE均采用以下算法
框架:
当我们构建一个实际问题时,会建模一个基于问题的目标函数,为求解目标函数的值引入了适应度的概念。适应度函数的值越小,适应度越好
构建一个种群,种群有8个个体
X代表个体,括号内的t代表迭代次数,左边的V代表变异个体,父代个体也叫做目标个体 ,r1,r2,r3表示从
8个个体中随机选出3个个体,对每个目标个体产生变异个体,例如对父代个体X1产生一个变异个体,Xr1,Xr2,Xr3只能在X2~X8中取,X1 ~X8中的每一个目标个体都通过变异操作产生一个变异个体,但一个个体包含多个维度,在变异操作时,应当对每个个体进行逐维的更新
CR是控制变异个体和父代个体在决策变量上交换的频率(交叉概率)
把变异之后的数据和变异之前的进行交换
计算目标个体和实验个体的适应度,选择适应度函数值小的个体
(1)确定差分进化算法的控制参数和所要采用的具体策略。差分进化算法的控制参数包括:种群数量、变异算子、交叉算子、最大进化代数、终止条件等。
(2)随机产生初始种群,进化代数k=1。
(3)对初始种群进行评价,即计算初始种群中每个个体的目标函数值。
(4)判断是否达到终止条件或达到最大进化代数:若是,则进化终止,将此时的最佳个体作为解输出;否则,继续下一步操作。
(5)进行变异操作和交叉操作,对边界条件进行处理,得到临时种群。
(6)对临时种群进行评价,计算临时种群中每个个体的目标函数值。
(7)对临时种群中的个体和原种群中对应的个体,进行“一对一”的选择操作,得到新种群。
(8)进化代数k=k+1,转步骤(4)。
算法控制参数
DE算法的控制参数主要有种群规模NP、缩放因子F以及交叉概率 CR.在经典DE算法中采用的是参数固定设置的方式,即参数在搜索之前预先设置好并且在整个迭代过程中保持不变。
clear;%删除工作区所有变量
close all;%关闭图形窗口
clc;%清除命令行窗口
Np=200;
F=0.5;%缩放因子,[0.4,0.95]之间,
%取大增大算法的搜索空间,提高种群多样性,有利于算法搜索最优解,但会降低收敛速率;取小提高算法开发能力,提高算法收敛的速度,增加早熟收敛风险
Cr=0.5;%交叉概率[0.3-0.9]之间,取大增强种群多样性,但后期收敛速度变慢,取小有利于分析个体各维可分离问题
it_max=100;%最大进化代数;
D=30;%染色体长度,种群中每个个体的维度
iter=1;%初代种群
%初始种群一般在给定的约束边界内随机生成
smin=-200;%上界
smax=200;%下界
1.种群初始化
%种群初始化,随机生成初始种群并计算种群的适应值
initpop=rand(Np,D)*(smax-smin)+smin;
for i =1:Np
fitness_1(i)=sum(initpop(i,:).^2);
end
trace(iter)=min(fitness_1);%计算初始种群中每个个体的目标函数值,取出其中最优个体
2.变异
对于种群中每个个体;,差分进化算法的变异向量按照下面的方式产生:
while(iter<it_max)
for w=1:Np
num = randperm(Np,4); %随机生成4个从1到NP的数
if num(1)==w,num(1)=num(4);
elseif num(2)==w,num(2)=num(4);%取初始种群的第num(n)行作为变异个体并命名为x_1,x_2,x_3;
elseif num(3)==w,num(3)=num(4);
end
variation(w,:)=initpop(num(1),:)+F*(initpop(num(2),:)-initpop(num(3),:));
3.修补染色体
for m = 1:D
if variation(w,m)<smin||variation(w,m)>smax
variation(w,m)=rand*(smax-smin)+smin;
end
end
4.交叉
for y=1:D
rnbr = randi([1,D],1,1)
cr=rand;
if (cr<Cr || y==rnbr)
trial(w,y)=variation(w,y);
else
trial(w,y)=initpop(w,y);
end
end
fitness_2(w)=sum(trial(w,:).^2);
end
5.选择
for f=1:Np
if fitness_2(f)<=fitness_1(f)
initpop(f,:)=trial(f,:);
end
fitness_1(f)=sum(initpop(f,:).^2);
end
iter=iter+1;
trace(iter)=min(fitness_1);
end
6.绘图
figure(1);
plot(trace);
xlabel(‘进化代数’);
ylabel(‘适应值’);
运行结果:
(过了很久以后……终于出了结果)
clear;%删除工作区所有变量 close all;%关闭图形窗口 clc;%清除命令行窗口 Np=200; F=0.5;%缩放因子,[0.4,0.95]之间, %取大增大算法的搜索空间,提高种群多样性,有利于算法搜索最优解,但会降低收敛速率;取小提高算法开发能力,提高算法收敛的速度,增加早熟收敛风险 Cr=0.5;%交叉概率[0.3-0.9]之间,取大增强种群多样性,但后期收敛速度变慢,取小有利于分析个体各维可分离问题 it_max=100;%最大进化代数; D=30;%染色体长度,种群中每个个体的维度 iter=1;%初代种群 %初始种群一般在给定的约束边界内随机生成 smin=-200;%上界 smax=200;%下界 %种群初始化,随机生成初始种群并计算种群的适应值 initpop=rand(Np,D)*(smax-smin)+smin; for i =1:Np fitness_1(i)=sum(initpop(i,:).^2); end trace(iter)=min(fitness_1);%计算初始种群中每个个体的目标函数值,取出其中最优个体 while(iter<it_max) for w=1:Np num = randperm(Np,4); %随机生成4个从1到NP的数 if num(1)==w,num(1)=num(4); elseif num(2)==w,num(2)=num(4);%取初始种群的第num(n)行作为变异个体并命名为x_1,x_2,x_3; elseif num(3)==w,num(3)=num(4); end variation(w,:)=initpop(num(1),:)+F*(initpop(num(2),:)-initpop(num(3),:)); %对变异种群的个体是否在解空间内做判断,修补操作 for m = 1:D if variation(w,m)<smin||variation(w,m)>smax variation(w,m)=rand*(smax-smin)+smin; end end for y=1:D rnbr = randi([1,D],1,1) cr=rand; if (cr<Cr || y==rnbr) trial(w,y)=variation(w,y); else trial(w,y)=initpop(w,y); end end fitness_2(w)=sum(trial(w,:).^2); end for f=1:Np if fitness_2(f)<=fitness_1(f) initpop(f,:)=trial(f,:); end fitness_1(f)=sum(initpop(f,:).^2); end iter=iter+1; trace(iter)=min(fitness_1); end figure(1); plot(trace); xlabel('进化代数'); ylabel('适应值');
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。