R语言实现具体的粒子群优化算法

data=read.csv("Audata.csv",header = F)#读取电脑中的数据

train = sample(dim(data)[1], dim(data)[1]/1.5)#随机抽样,取2/3的数据
trainxy=data[train,]
testxy=data[-train,]

#适应度计算函数,即目标函数
fit=function(x) {

  x1=tez(32,1,x)
  svrfore=predict(model,x1)
  return (svrfore)
}

fit1=function(x) {
  x1=tez(32,dim(x)[1],x)
  svrfore=predict(model,x1)
  return (svrfore)
}

library(e1071)

#改进的粒子群算法
gspso<-function(d){

c1 =2.6           #学习因子1
c2 =1.7           #学习因子2
c=c1+c2           #总加速度
w =0.9           #惯性权重
maxw=0.9     #最大权重
minw=0.4     #最小权重
a<-0.79            #收缩因子
MaxDT <- 200      #最大迭代次数
D <-  d           #搜索空间维数(未知数个数)
M <- 30            #初始化群体个体数目
maxv=10#最大速度
gbestDelta=NULL #适应度变化初始值
alpha=0.0001#变化阈值
#初始化种群的个体(可以在这里限定位置和速度的范围)
x <- matrix(runif(M*D,-10,10),nrow = M,ncol = D,byrow = T)
v <- matrix(runif(M*D,-10,10),nrow = M,ncol = D,byrow = T)
#v <- matrix(rnorm(M*D),nrow = M,ncol = D,byrow = T)

#初始化pbest[i]和gbest
pbest <- x
gbest <- pbest[which.min(fit1(x)),] #gbest为全局最优

#进入主要循环,按照公式依次迭代,直到满足精度要求
for (t in 1:MaxDT)
{
 ss=2*(1-t/MaxDT)/(abs(2-c-sqrt(c^2-4*c)))
  for (i in 1:M)#第i个粒子
  {
    v[i, ] = ss*(w*v[i, ] + c1*runif(1)*(pbest [i, ] - x[i, ]) + c2*runif(1)*(gbest-x[i, ]))
#粒子速度约束
    l=1
      for(h in 1:D){
        if((x[i,h] + v[i,h])< (-10)||(x[i,h] + v[i,h])>10)
        {l=0
        break}
      }
       if(l==1)  
 #位置更新
       x[i, ] = x[i, ] + v[i, ]
 #粒子pBest更新
    x2=matrix(x[i,],nrow = 1,byrow = TRUE)
    pbest1=matrix(pbest[i,],nrow = 1,byrow = TRUE)
        if(fit(x2) >fit(pbest1))
        {     
          pbest[i,] <- x[i, ]
        }
#粒子gBest更新
    pbest2=matrix(pbest[i,],nrow = 1,byrow = TRUE)
    gbest1=matrix(gbest,nrow = 1,byrow = TRUE)
        if(fit(pbest2) >fit(gbest1))
        {
          gbest <- pbest[i, ]
          gbestDelta=abs(fit(gbest1)-fit(pbest2)) #粒子群适应度变化
        }
        if(!is.null(gbestDelta))
           if(gbestDelta<alpha)
        break                  
  }
  w=maxw-(t/MaxDT)*(maxw-minw)#惯性权重衰减
}
gbest
  
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值