二进制学习差分进化算法(BLDE)的R语言实现

    二进制学习差分进化算法(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)

    如有错误,欢迎指正!
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值