[算法] PSO

function [xm,fv,record] = PSO (fitness,N,c1,c2,w,M,D,bound)
% fitness为目标函数
% N种群规模
% c1,c2c1是学习因子1,c2是学习因子2
% w是惯性权重
% M是最大迭代次数
% D是搜索空间维数
% xm是目标函数取最小值时的自变量
% fv是目标函数最小值
% bound是上下界,Dx2,第一列为各个变量的下界,第二个为上界
% record迭代记录
format long;%有效数字16位
x=zeros(N,D);
v=zeros(N,D);
for i=1:N
  for j=1:D
      v(i,j)=randn; %随机初始化各个粒子速度
      if (bound(j,1)==-inf)&&(bound(j,2)==inf)
          x(i,j)=randn; %随机初始化各个粒子位置
      elseif (bound(j,1)==-inf)&&(bound(j,2)~=inf)
          x(i,j)=randn-1+bound(j,2); %随机初始化各个粒子位置
      elseif (bound(j,1)~=-inf)&&(bound(j,2)==inf)
          x(i,j)=randn+1+bound(j,1); %随机初始化各个粒子位置
      else 
          x(i,j)=bound(j,1)+rand*(bound(j,2)-bound(j,1));
      end
  end
end
disp(x)
%%%%%%%%%%先计算各个粒子适应度,并初始p(i)和pg%%%%%%
p=zeros(N,1);
y=zeros(N,D);
for i=1:N
  p(i)=fitness(x(i,:)); %各个粒子最优适应度,因为第一代,个体最优适应度就是其本身的适应度
  y(i,:)=x(i,:); %各个粒子的个体最优位置,因为为第一代,个体最位置就是其本身
end
pg=x(1,:); %随意初始化,pg为全局最优位置
bestFit=p(1);
for i=2:N %寻找全局最优位置
  if p(i)<bestFit
    pg=x(i,:);
    bestFit=p(i);
  end
end
%%%%进入主要循环,按照公式依次迭代,直到满足精度要求或者循环结束%%%%%%%%
record=zeros(M+1,1);
record(1,1)=bestFit;
for t=1:M
  for i=1:N
    v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:)); %优化粒子速度
    x(i,:)=x(i,:)+v(i,:); %优化粒子位置
    %防止越界,若越界,则取边界值,没有约束的话去掉这两个if语句
     for j=1:D
          if x(i,j)<bound(j,1)
            x(i,j)=bound(j,1); %随机初始化各个粒子位置
          end
          if x(i,j)>bound(j,2)
            x(i,j)=bound(j,2); %随机初始化各个粒子位置
          end
     end
     tempFit=fitness(x(i,:));
    if tempFit<p(i) %更新个体最优
      p(i)=tempFit;
      y(i,:)=x(i,:);
    end
    if p(i)<bestFit %更新全局最优
      pg=y(i,:);
      bestFit=p(i);
    end
  end
  record(t+1,1)=bestFit;
end
xm=pg';
fv=fitness(pg);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值