找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3041|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

粒子群算法CCPSO2

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:375796 發(fā)表于 2018-7-20 13:38 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式

%function [gbest,gbestfit,bestfit]=ccpso2(x,popsize,dim,maxiter,fitness)
%popsize 粒子群大小,即粒子個數(shù)
%dim  粒子維度(未分群之前的總維度)
%k 粒子群的分群的個數(shù)
%s 每個分群的變量數(shù),s*k=dim
%x 保存粒子群的各個粒子的當(dāng)前位置
%y 保存粒子群的各個粒子的當(dāng)前局部粒子最優(yōu)
%gbest 保存全局最優(yōu)粒子位置
%cc 狀態(tài)參數(shù),只能是整形數(shù),c為0時,則說明粒子迭代后全局最優(yōu)沒有更新;否則粒子迭代后全局最優(yōu)更新
%bestfit 保存每次迭代的最優(yōu)解
%fitness 適應(yīng)度函數(shù)
%t 程序運(yùn)行時間
%gbest 全局最優(yōu)解,gbestfit 全局最優(yōu)解適應(yīng)度值
%py 通過lbest ring topology手段得到的粒子局部最優(yōu)
%
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                                %如果上一次迭代全局最優(yōu)沒有任何更新,則s值要更新
        s=S(round(6*rand)+1);
        k=dim/s;
    end
    cc=0;
    for j=1:k                              %分組,對于第j組執(zhí)行
        p=(j-1)*s+1;
        q=j*s;                             
        for i=1:popsize                  
            gbest1=gbest;
            gbest1(p:q)=x(i,p:q);           %將全局最優(yōu)的粒子的p到q個元素置換為分組的第i個粒子的p到q部分
            B=fitness(gbest1);              %計(jì)算置換后的粒子的適應(yīng)度B
            gbest1(p:q)=y(i,p:q);           %將全局最優(yōu)粒子的第p到q個元素置換為分組的第i個粒子的歷史最優(yōu)的p到q部分
            C=fitness(gbest1);              %計(jì)算置換后的粒子適應(yīng)度C
            if B<C                          
                y(i,p:q)=x(i,p:q);          %更新個體最優(yōu)
%                 gbest1(p:q)=gbest(i,p:q);
                D=fitness(gbest);
                if C<D                      %更新全局最優(yōu)
                    gbest(p:q)=y(i,(p:q));
                    cc=cc+1;                %如果最優(yōu)有更新則改變cc
                end
            end
        end
        for i=1:popsize                     %將gbest1的p到q部分置換為第i個個體最優(yōu)的p到q部分,記錄第i個置換結(jié)果的適應(yīng)度記為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定義為最后一個粒子的適應(yīng)度
                b=popsize;
                D=pyfit(2);                 %將D定義為第二個粒子的適應(yīng)度
                d=2;
            elseif i==popsize                %對于最后一個粒子
                B=pyfit(i-1);                %將B定義為前一個粒子的適應(yīng)度
                b=i-1;
                D=pyfit(1);                   %將D定義為第一個粒子的適應(yīng)度
                d=1;
            else                            %對于其他粒子
                B=pyfit(i-1);               %B為前一個粒子適應(yīng)度
                b=i-1;
                D=pyfit(i+1);              %D為后一個粒子的適應(yīng)度
                d=i+1;
            end
            C=pyfit(i);                    %C為該粒子的適應(yīng)度
            c=i;
            if B<C&&B<D                   %求本地最優(yōu)粒子
                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));        %柯西分布更新規(guī)則
            else
                x(i,p:q)=py(i,p:q)+normrnd(0,1)*abs(y(i,p:q)-py(i,p:q));               %高斯分布更新規(guī)則
            end
        end
    end
    gbestfit=fitness(gbest);
    bestfit(u)=gbestfit;
end
bestfit=[gbestfit0,bestfit];
plot (bestfit,'-b');
title('D=150,Rosenbrock','fontsize',12);
xlabel('迭代次數(shù)','fontsize',12);ylabel('適應(yīng)度','fontsize',12)
t=cputime-t;



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:405372 發(fā)表于 2019-7-14 09:45 | 只看該作者
樓主還有更多關(guān)于粒子群的資料嗎
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表