差分进化算法原理与matlab实现
姓名:邓霜意 学号:20021210598
转自:https://blog.csdn.net/zj1131190425/article/details/89438654(有删改)
【嵌牛导读】: 在自然界中,遗传,变异,选择的作用,使得生物体优胜略汰,不断由低级向高级进化,人们发现适者生存这一规律可以模式化,从而构成一些列优化算法。差分进化算法就是从这种模式中产生的一种智能优化算法。
【嵌牛鼻子】:差分进化算法
【嵌牛提问】:差分进化算法的原理是什么?差分进化算法的参数如何设置?
【嵌牛正文】:
差分进化算法原理介绍:
DE算法开始于一个随机选择的初始种群,主要过程包括变异、交叉和选择三个步骤。DE的主要思想是从某一组随机产生的初始种群开始,随机选择两个不同的个体向量相减生成差异向量,将差异向量赋予权值后与第三个随机选择的个体向量相加,产生变异向量。然后将变异向量与预先确定的父代个体向量按一定规则交叉产生试验向量。若试验向量的适应度优于父代个体向量的适应度值,则选用试验向量进入下一代,否则保留父代个体向量。通过不断进化保留优胜的个体,引导搜索过程像最优解靠逼近。
一、算法流程:
1. 初始化:
种群中的个体可以表示为:(种群大小为NP)
其中: i=1,2,....NP
初始种群一般在给定的约束边界内随机生成
2. 变异
对于种群中每个个体,差分进化算法的变异向量按照下面的方式产生:
其中:r1、r2、r3、在种群中随机选择且r1!=r2!=r3,参数F表示尺度变换因子,用于控制偏差的放大作用。
除此之外,偏差向量还可以由其他的方式产生:表示方法:DE/x/y/z, x当前被变异的向量是随机的还是最优的,y差向量的个数,z交叉程序的操作方法(bin)
DE/best/1/bin:
DE/rand-to-best/1/bin:
DE/best/2/bin:
DE/rand/2/bin:
3. 交叉
这里的交叉和遗传算法的交叉操作有所区别,这里的交叉操作是针对整个种群的某一维度,而遗传算法中的交叉是针对种群中的每一个个体。
4.选择:
差分进化算法按照贪婪准则,从实验种群u中选择个体作为下一代种群x中的个体,具体的选择方式是:
其中:fit(x)为x的适应度。
5. 边界条件处理:
对于这一类的算法,通常会对种群中的个体执行一些列的操作(如交叉,变异),这会导种群中个体的范围(即决策变量的范围)超出给定的范围,所以需要对上述操作后所得到种群进行边界条件检查和处理,对于边界之外的个体一般有两种处理方法:
A. 边界吸收:
假设x的范围是x_max, x_min, x'是经过变异或者交叉操作后所得的新的个体:则新个体的边界检查和处理规则为:
B. 重新随机生成新的个体:
基本差分进化算法的流程:
算法中的参数:
a. 种群大小NP一般为[4D,10D]
b. 变异算子F一般为[0.4,1]
c.交叉算子CR一般为[0.5,0.95]
d. 进化代数G
e.终止条件
二、matlab代码实现:
测试函数为:
取n=10,决策变量的范围为[-20,20]
matlab代码如下:
close all;
clear all;
clc;
NP=50;
D=10; % 染色体长度
G=200;
F0=0.4;
CR=0.1;
a=-20; % 寻优区间
b=20;
yz=10^-6;
x=zeros(NP,D); % 初始种群
v=zeros(NP,D); % 变异种群
u=zeros(NP,D); % 选择种群
% 种群怫初值
x=rand(NP,D)*(b-a)+a;
% 计算目标参数
fori=1:1:NP
ob(i)=sum(x(i,:).^2);
end
trace(1)=min(ob);
% 差分进化循环
forgen=1:G
% 变异操作
form=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==r1)||(r2==m)
r2=randi([1,NP],1,1);
end
r3=randi([1,NP],1,1);
while(r3==m)||(r3==r2)||(r3==r1)
r3=randi([1,NP],1,1);
end
% 产生不同的r1,r2,r3
v(m,:)=x(r1,:)+F0*(x(r2,:)-x(r3,:));
end
% 交叉操作
r=randi([1,D],1,1); % 这个变异是针对整个种群的变异,不正对单个个体
forn=1:D
cr=rand;
if(cr<=CR)||(n==r)
u(:,n)=v(:,n);
else
u(:,n)=x(:,n);
end
end
% 边界条件处理
form=1:NP
forn=1:D
ifu(m,n)
u(m,n)=a;
end
ifu(m,n)>b
u(m,n)=b;
end
end
end
% 自然选择
% 计算新的适应度
form=1:NP
ob_1(m)=sum(u(m,:).^2);
end
form=1:NP
ifob_1(m)
x(m,:)=u(m,:);
else
x(m,:)=x(m,:);
end
end
% 现在x为经过选择后的种群
form=1:NP
ob(m)=sum(x(m,:).^2);
end
trace(gen+1)=min(ob);
tt=min(ob);
end
x(1,:);
figure(1);
title(['差分进化算法(DE)','最小值: ', num2str(tt)]);
xlabel('迭代次数');
ylabel('目标函数值');
plot(trace);
寻优结果: