二进制学习差分进化算法(BLDE)是笔者在做论文的时候用到的一种优化算法,其依概率全局收敛于最优解,且收敛速度相对比较快,是为数不多的优秀二进制差分进化算法。由Yu Chen等2014年在一篇文章中提出,大家可以在谷歌学术上搜这篇文章看一下A binary differential evolution algorithm learning from explored solutions,里面有详细的算法步骤和原理证明。本文首先给出BLDE的R语言实现,然后给出一个求平方和的例子,极大化该函数,且打印出迭代过程。
#####二进制差分进化算法的R语言实现
#产生初始种群
funcmatrix<-function(i,j){
x<-matrix(sample(c(0,1),i*j,replace=T),nrow=i,ncol=j)
return(x)
}
#发现精英个体
findmaxfunc<-function(x){
l<-apply(x,1,funcv)
#有可能最优个体不止一个
j<-x[sample(which(l==max(l)),1),]
return(j)
}
#比较个体
winfunc<-function(x,y){
if(funcv(x)>funcv(y)){
z<-x } else
z<-y
return(z)
}
#BLDE 核心 function
funcB<-function(x,y){
m<-findmaxfunc(x)
for(q in 1:nrow(x)){
s=sample(1:nrow(x),2,replace=T)
g=sample(1:nrow(y),1)
i<-x[s[1],]
j<-x[s[2],]
k<-y[g,]
tx<-winfunc(j,k)
for(p in 1:length(i)){
if(j[p]==k[p]){if(m[p]!=i[p]){
tx[p]=m[p] }
else if(runif(1,min=0,max=1)<=0.05){
tx[p]=sample(c(0,1),1) }
}
}
if(funcv(tx)>=funcv(x[q,])){
x[q,]=tx }
}
return(x)
}
#产生下一代种群以及Archive
funcxy<-function(x,y){
B<-x
A<-funcB(x,y)
return(cbind(A,B))
}
#进化过程
BLDEfunc<-function(popula_size,chrom_size,Gmax){
A<-funcmatrix(popula_size,chrom_size)
B<-funcmatrix(popula_size,chrom_size)
V<-matrix(0,nrow=2,ncol=Gmax)
for(h in 1:Gmax){
print(h)
V[1,h]<-h
A<-funcxy(A,B)[,1:chrom_size]
V[2,h]<-funcv(A[1,])
B<-funcxy(A,B)[,(chrom_size+1):(2*chrom_size)]
if(V[2,h]>96) break
}
plot(V[1,],V[2,],type="l")
l<-apply(A,1,funcv)
h<-A[sample(which(l==max(l)),1),]
print(h)
return(funcv(h))
}
#####一个例子
###BLDE所要优化的目标函数,函数维度为length(x)
funcv<-function(x){
return(sum(x^2))
}
BLDEfunc(50,100,400)
如有错误,欢迎指正!