差分进化

差分进化算法(Differential Evolution)由 Storn和 Price 于1997年提出,算法包含三个参数:种群大小NP,变异放缩因子F,交叉概率CR。用向量 x i = [ x i 1 , x i 2 , … , x i , d i m ] x_i = \left[x_{i1},x_{i2},\dots,x_{i,dim}\right] xi=[xi1,xi2,,xi,dim]表示目标函数的一组候选解,通过不断的变异、交叉和选择在有限的迭代次数内得到满意解。算法流程图如下:

image-20210505205927666

1. 初始化

随机生成初始种群
x i j = x j , m i n + r a n d ∗ ( x j , m a x − x j , m i n ) x_{ij}=x_{j,min}+rand*(x_{j,max}-x_{j,min}) xij=xj,min+rand(xj,maxxj,min)
其中 x j , m a x x_{j,max} xj,max x j , m i n x_{j,min} xj,min分别表示在第 j j j维的上下限。

2. 变异操作

  1. DE/rand/1策略
    v i , G = x r 1 , G + F ⋅ ( x r 2 , G − x r 3 , G ) v_{i,G} = x_{r1,G} + F \cdot (x_{r_2,G} - x_{r_3,G}) vi,G=xr1,G+F(xr2,Gxr3,G)

  2. DE/rand/2策略
    v i , G = x r 1 , G + F ⋅ ( x r 2 , G − x r 3 , G ) + F ⋅ ( x r 4 , G − x r 5 , G ) v_{i,G} = x_{r1,G} + F \cdot (x_{r_2,G} - x_{r_3,G}) + F \cdot (x_{r_4,G} - x_{r_5,G}) vi,G=xr1,G+F(xr2,Gxr3,G)+F(xr4,Gxr5,G)

  3. DE/current to rand/1策略
    v i , G = x i , G + F ⋅ ( x r 2 , G − x i , G ) + F ⋅ ( x r 2 , G − x r 3 , G ) v_{i,G} = x_{i,G} + F \cdot (x_{r_2,G} - x_{i,G}) + F \cdot (x_{r_2,G} - x_{r_3,G}) vi,G=xi,G+F(xr2,Gxi,G)+F(xr2,Gxr3,G)

  4. DE/best/1策略
    v i , G = x b e s t , G + F ⋅ ( x r 1 , G − x r 2 , G ) v_{i,G} = x_{best,G} + F \cdot (x_{r_1,G} - x_{r_2,G}) vi,G=xbest,G+F(xr1,Gxr2,G)

  5. DE/best/2策略
    v i , G = x b e s t , G + F ⋅ ( x r 1 , G − x r 2 , G ) + F ⋅ ( x r 3 , G − x r 4 , G ) v_{i,G} = x_{best,G} + F \cdot (x_{r_1,G} - x_{r_2,G}) + F \cdot (x_{r_3,G} - x_{r_4,G}) vi,G=xbest,G+F(xr1,Gxr2,G)+F(xr3,Gxr4,G)

  6. DE/rand to best/1策略
    v i , G = x r 1 , G + F ⋅ ( x b e s t , G − x r 1 , G ) + F ⋅ ( x r 2 , G − x r 3 , G ) v_{i,G} = x_{r_1,G} + F \cdot (x_{best,G} - x_{r_1,G}) + F \cdot (x_{r_2,G} - x_{r_3,G}) vi,G=xr1,G+F(xbest,Gxr1,G)+F(xr2,Gxr3,G)

  7. DE/current to best/1策略
    v i , G = x i , G + F ⋅ ( x b e s t , G − x i , G ) + F ⋅ ( x r 1 , G − x r 2 , G ) v_{i,G} = x_{i,G} + F \cdot (x_{best,G} - x_{i,G}) + F \cdot (x_{r_1,G} - x_{r_2,G}) vi,G=xi,G+F(xbest,Gxi,G)+F(xr1,Gxr2,G)

其中 { i , r 1 , r 2 , r 3 , r 4 , r 5 } ⊂ { 1 , 2 , . . . , N P } \{i,r_1,r_2,r_3,r_4,r_5\} \subset \{1,2,...,NP\} {i,r1,r2,r3,r4,r5}{1,2,...,NP} x b e s t , G x_{best,G} xbest,G表示在第G代种群中的最优个体, x i , G x_{i,G} xi,G表示在第G代种群中的第 i i i

个体, F ∈ ( 0 , 2 ) F\in \left(0,2\right) F(0,2)表示放缩因子。

3. 交叉操作

u i j = { v i j i f ( r a n d < C R ) o r j = r n b r ( i ) x i j o t h e r w i s e u_{ij} = \left\{ \begin{aligned} v_{ij} \quad & if(rand<CR)\quad or \quad j = rnbr(i)\\ x_{ij} \quad & otherwise \end{aligned} \right. uij={vijxijif(rand<CR)orj=rnbr(i)otherwise

其中 C R ∈ [ 0 , 1 ] CR\in [0,1] CR[0,1]表示变异概率, r n b r ( i ) rnbr(i) rnbr(i) 表示从维度集合中随机选取的常数,以确保 u i j u_{ij} uij中至少有一个元素来源于 v i j v_{ij} vij

4. 选择操作

x i , G + 1 = { u i , G i f ( f ( u i , G ) ≤ f ( x i , G ) ) x i , G o t h e r w i s e x_{i,G+1} = \left\{ \begin{aligned} u_{i,G} \quad & if(f(u_{i,G}) \le f(x_{i,G}))\\ x_{i,G} \quad & otherwise \end{aligned} \right. xi,G+1={ui,Gxi,Gif(f(ui,G)f(xi,G))otherwise

5. 测试函数

f ( x ) = ∑ i = 1 d i m i ⋅ x i 2 f(x) = \sum_{i=1}^{dim}i \cdot x_{i}^{2} f(x)=i=1dimixi2

6. 代码实现

function [fitbest,xbest,fit_curve] = DE(NP,F,CR,Gm)
%input
%NP: 种群规模,F:放缩因子,CR:交叉概率,Gm:最大迭代数
%output
%bestfit: 寻优最佳适应度,fit_curve:收敛曲线
LB = -100;
UB = 100;
dim = 30;  
X = zeros(NP,dim);
U = zeros(NP,dim);
V = zeros(NP,dim);
fitX = zeros(NP,1);
fitV = zeros(NP,1);
fit_curve = zeros(1,Gm);
%% 种群初始化
for m = 1 : NP
	X(m,:) = LB + rand(1,dim) * (UB - LB);
	fitX(m) = test(X(m,:));
end
%% 主循环
G = 1;
while G <= Gm
	%% 变异
	for i = 1 : NP
		r = randperm(NP,3);
		while ismember(i,r)
			r(r == i) = randi(NP);
		end
		U(i,:) = X(r(1),:) + F * ( X(r(2),:) - X(r(3),:) );
	end
	U(U < LB) = LB;%边界吸收处理
	U(U > UB) = UB;
	%% 交叉
	for j = 1 : NP
		randIndex = randi(dim);
		for k = 1 : dim
			if rand <= CR || randIndex == k
				V(j,k) = X(j,k);
			else
				V(j,k) = U(j,k);
			end
		end
		fitV(j) = test(V(j,:));
	end
	%% 选择
	betterIndex = fitV < fitX;
	X(betterIndex,:) = V(betterIndex,:);
	fitX(betterIndex) = fitV(betterIndex);
	%% 记录每一代的最优解
	[fitbest,Index] = min(fitX);
	xbest = X(Index,:);
	fit_curve(G) = fitbest;
	G = G + 1;
end
%% 绘图
figure;
plot(fit_curve);
title('适应度收敛曲线');
xlabel('迭代次数');
ylabel('适应度');
%% 测试函数
function fvalue = test(x)
y = 1:length(x);
fvalue=sum(y.*(x.^2)) ;
end
end
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值