找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2141|回复: 1
收起左侧

粒子群算法CCPSO2

[复制链接]
ID:375796 发表于 2018-7-20 13:38 | 显示全部楼层 |阅读模式

%function [gbest,gbestfit,bestfit]=ccpso2(x,popsize,dim,maxiter,fitness)
%popsize 粒子群大小,即粒子个数
%dim  粒子维度(未分群之前的总维度)
%k 粒子群的分群的个数
%s 每个分群的变量数,s*k=dim
%x 保存粒子群的各个粒子的当前位置
%y 保存粒子群的各个粒子的当前局部粒子最优
%gbest 保存全局最优粒子位置
%cc 状态参数,只能是整形数,c为0时,则说明粒子迭代后全局最优没有更新;否则粒子迭代后全局最优更新
%bestfit 保存每次迭代的最优解
%fitness 适应度函数
%t 程序运行时间
%gbest 全局最优解,gbestfit 全局最优解适应度值
%py 通过lbest ring topology手段得到的粒子局部最优
%
t=cputime;

popsize=100;
dim=150;
maxiter=10000;

%x=10.24*rand(popsize,dim)-5.12; %Rastrigrin
x=rand(popsize,dim);%Rosenbrock

y=x;
bestfit=zeros(1,maxiter);
gbestfit=inf;
for i=1:popsize
    B=fitness(x(i,:));
    if B<gbestfit
        gbestfit=B;
        gbest=x(i,:);
    end
end
gbestfit0=gbestfit;
% gbest1;
%S=[1,2,6,5,10,20,25,50];  %
S=[2,3,5,6,10,15,30];
cc=0;
pyfit=zeros(1,popsize);
py=zeros(popsize,dim);
for u=1:maxiter
    if cc==0                                %如果上一次迭代全局最优没有任何更新,则s值要更新
        s=S(round(6*rand)+1);
        k=dim/s;
    end
    cc=0;
    for j=1:k                              %分组,对于第j组执行
        p=(j-1)*s+1;
        q=j*s;                             
        for i=1:popsize                  
            gbest1=gbest;
            gbest1(p:q)=x(i,p:q);           %将全局最优的粒子的p到q个元素置换为分组的第i个粒子的p到q部分
            B=fitness(gbest1);              %计算置换后的粒子的适应度B
            gbest1(p:q)=y(i,p:q);           %将全局最优粒子的第p到q个元素置换为分组的第i个粒子的历史最优的p到q部分
            C=fitness(gbest1);              %计算置换后的粒子适应度C
            if B<C                          
                y(i,p:q)=x(i,p:q);          %更新个体最优
%                 gbest1(p:q)=gbest(i,p:q);
                D=fitness(gbest);
                if C<D                      %更新全局最优
                    gbest(p:q)=y(i,(p:q));
                    cc=cc+1;                %如果最优有更新则改变cc
                end
            end
        end
        for i=1:popsize                     %将gbest1的p到q部分置换为第i个个体最优的p到q部分,记录第i个置换结果的适应度记为pyfit(i)
            gbest1=gbest;
            gbest1(p:q)=y(i,p:q);
            pyfit(i)=fitness(gbest1);
        end
        for i=1:popsize
            if i==1                         %对于第一个粒子
                B=pyfit(popsize);           %将B定义为最后一个粒子的适应度
                b=popsize;
                D=pyfit(2);                 %将D定义为第二个粒子的适应度
                d=2;
            elseif i==popsize                %对于最后一个粒子
                B=pyfit(i-1);                %将B定义为前一个粒子的适应度
                b=i-1;
                D=pyfit(1);                   %将D定义为第一个粒子的适应度
                d=1;
            else                            %对于其他粒子
                B=pyfit(i-1);               %B为前一个粒子适应度
                b=i-1;
                D=pyfit(i+1);              %D为后一个粒子的适应度
                d=i+1;
            end
            C=pyfit(i);                    %C为该粒子的适应度
            c=i;
            if B<C&&B<D                   %求本地最优粒子
                py(i,p:q)=y(b,p:q);
            elseif C<B&&C<D
                py(i,p:q)=y(c,p:q);
            else
                py(i,p:q)=y(d,p:q);
            end
        end
    end
    for j=1:k                               %生成新粒子群
        p=(j-1)*s+1;
        q=j*s;
        for i=1:popsize
            if rand<=0.5
                x(i,p:q)=y(i,p:q)+(tan(pi*(rand-0.5)))*abs(y(i,p:q)-py(i,p:q));        %柯西分布更新规则
            else
                x(i,p:q)=py(i,p:q)+normrnd(0,1)*abs(y(i,p:q)-py(i,p:q));               %高斯分布更新规则
            end
        end
    end
    gbestfit=fitness(gbest);
    bestfit(u)=gbestfit;
end
bestfit=[gbestfit0,bestfit];
plot (bestfit,'-b');
title('D=150,Rosenbrock','fontsize',12);
xlabel('迭代次数','fontsize',12);ylabel('适应度','fontsize',12)
t=cputime-t;



回复

使用道具 举报

ID:405372 发表于 2019-7-14 09:45 | 显示全部楼层
楼主还有更多关于粒子群的资料吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表