天天看點

粒子群算法(7)------粒子群算法局部版本的實作

最近要寫篇與粒子群算法有關的文章,是以不得不實作粒子群算法的局部版本。粒子群算法局部版本的實作思想已經在粒子群算法(3)----标準的粒子群算法(局部版本)中已經講述。主要分為3個函數。第一個函數為粒子群初始化函數LocalInitSwarm(SwarmSize......AdaptFunc)其主要作用是初始化粒子群的粒子,并設定粒子的速度、位置在一定的範圍内。本函數所采用的資料結構如下所示:

 表ParSwarm記錄的是粒子的位置、速度與目前的适應度值,我們用W來表示位置,用V來代表速度,用F來代表目前的适應度值。在這裡我們假設粒子個數為N,每個粒子的維數為D。

W1,1 W1,2 ... W1,D V1,1 V1,2 ... V1,D-1 V1,D F1 第1個粒子
W2,1 W2,2 ... W2,D V2,1 V2,2 ... V2,D-1 V2,D F2 第2個粒子
... ... ... ... ... ... ... ... ... ... .......
WN-1,1 WN-1,2 ... WN-1,D-1 VN-1,1 VN-1,2 ... VN-1,D-1 VN-1,D FN-1 第N-1個粒子
WN,1 WN,2 ... WN,D VN,1 VN,2 ... VN,D-1 VN,D FN 第N個粒子

表OptSwarm不但要記錄自身曆史最優解,還需要記錄每個粒子鄰域(采用環形鄰域)的最優解,以及全部粒子搜尋到的全局最優解。是以應該有2*N+1行,前SwarmSize行記錄粒子自己曆史最優解,後SwarmSize行記錄鄰域最優解。用Wg代表全局最優解,W.,1代表每個粒子的曆史最優解。粒子群初始化階段表OptSwarm的前N行與表ParSwarm中

的相同,而Wg的值為表ParSwarm中适應度值的最大值對應的行。

W1,1 Wj,2 ... Wj,D-1 Wj,D 第1個粒子的曆史最優解
W2,1 Wk,2 ... Wk,D-1 Wk,D 第2個粒子的曆史最優解
... ... ... ... ... ...
W(N-1),1 Wl,2 ... Wl,D-1 Wl,D 第N-1個粒子的曆史最優解
W(N),1 Wm,2 ... Wm,D-1 Wm,D 第N個粒子的曆史最優解
Wl,1 ... ... ... Wl,D 第一個粒子的鄰域最優解
Wl,2 ... ... ... Wl,D 第二個粒子的鄰域最優解
... ... ... ... ..... ....
Wl,N ... ... ... ... 第N個粒子的鄰域最優解
Wg,1 Wg,2 ... Wg,D-1 Wg,D 全局粒子的曆史最優解

根據這樣的思想MATLAB代碼如下:

function [ParSwarm,OptSwarm]=LocalInitSwarm(SwarmSize,ParticleSize,ParticleScope,AdaptFunc)
%功能描述:局部版本的粒子群算法,初始化粒子群,限定粒子群的位置以及速度在指定的範圍内
%[ParSwarm,OptSwarm,BadSwarm]=LocalInitSwarm(SwarmSize,ParticleSize,ParticleScope,AdaptFunc)
%
%輸入參數:SwarmSize:種群大小的個數
%輸入參數:ParticleSize:一個粒子的維數
%輸入參數:ParticleScope:一個粒子在運算中各維的範圍;
%         ParticleScope格式:
%           3維粒子的ParticleScope格式:
%                                   [x1Min,x1Max
%                                    x2Min,x2Max
%                                    x3Min,x3Max]
%
%輸入參數:AdaptFunc:适應度函數
%
%輸出:ParSwarm初始化的粒子群
%輸出:OptSwarm粒子群目前最優解與每個粒子鄰域的最優解,第一次初始化,鄰域的區域為0,即為粒子本身
%
%用法 [ParSwarm,OptSwarm,BadSwarm]=LocalInitSwarm(SwarmSize,ParticleSize,ParticleScope,AdaptFunc);
%
%異常:首先保證該檔案在Matlab的搜尋路徑中,然後檢視相關的提示資訊。
%
%編制人:XXX
%編制時間:2010.5.6
%參考文獻:無
%

%容錯控制
if nargin~=4
    error('輸入的參數個數錯誤。')
end
if nargout<2
    error('輸出的參數的個數太少,不能保證以後的運作。');
end

[row,colum]=size(ParticleSize);
if row>1||colum>1
    error('輸入的粒子的維數錯誤,是一個1行1列的資料。');
end
[row,colum]=size(ParticleScope);
if row~=ParticleSize||colum~=2
    error('輸入的粒子的維數範圍錯誤。');
end

%初始化粒子群矩陣

%初始化粒子群矩陣,全部設為[0-1]随機數
%rand('state',0);
ParSwarm=rand(SwarmSize,2*ParticleSize+1);

%對粒子群中位置,速度的範圍進行調節
for k=1:ParticleSize
    ParSwarm(:,k)=ParSwarm(:,k)*(ParticleScope(k,2)-ParticleScope(k,1))+ParticleScope(k,1);
    %調節速度,使速度與位置的範圍一緻
    ParSwarm(:,ParticleSize+k)=ParSwarm(:,ParticleSize+k)*(ParticleScope(k,2)-ParticleScope(k,1))+ParticleScope(k,1);
end
    
%對每一個粒子計算其适應度函數的值

for k=1:SwarmSize
    ParSwarm(k,2*ParticleSize+1)=AdaptFunc(ParSwarm(k,1:ParticleSize));
end

%初始化粒子群最優解矩陣,共SwarmSize*2行,其中前SwarmSize行記錄粒子自己曆史最優解,後SwarmSize行記錄鄰域最優解
OptSwarm=zeros(SwarmSize*2+1,ParticleSize);
%粒子群最優解矩陣全部設為零
OptSwarm(1:SwarmSize,:)=ParSwarm(1:SwarmSize,1:ParticleSize);
%計算粒子鄰域為1的最優解
linyu=1;
    for row=1:SwarmSize
        if row-linyu>0&&row+linyu<=SwarmSize
            tempM =[ParSwarm(row-linyu:row-1,:);ParSwarm(row+1:row+linyu,:)];            
            [maxValue,linyurow]=max(tempM(:,2*ParticleSize+1));           
            OptSwarm(SwarmSize+row,:)=tempM(linyurow,1:ParticleSize);           
        else
            if row-linyu<=0
                %該行上面的部分突出了邊界,下面絕對不會突破邊界
                if row==1
                    tempM=[ParSwarm(SwarmSize+row-linyu:end,:);ParSwarm(row+1:row+linyu,:)];
                    [maxValue,linyurow]=max(tempM(:,2*ParticleSize+1));                     
                    OptSwarm(SwarmSize+row,:)=tempM(linyurow,1:ParticleSize);                   
                else
                    tempM=[ParSwarm(1:row-1,:);ParSwarm(SwarmSize+row-linyu:end,:);ParSwarm(row+1:row+linyu,:)];
                    [maxValue,linyurow]=max(tempM(:,2*ParticleSize+1));                    
                    OptSwarm(SwarmSize+row,:)=tempM(linyurow,1:ParticleSize);                  
                end
            else
                %該行下面的部分突出了邊界,上面絕對不會突破邊界
                if row==SwarmSize
                    tempM=[ParSwarm(SwarmSize-linyu:row-1,:);ParSwarm(1:linyu,:)];
                    [maxValue,linyurow]=max(tempM(:,2*ParticleSize+1));                     
                    OptSwarm(SwarmSize+row,:)=tempM(linyurow,1:ParticleSize);
                else
                    tempM=[ParSwarm(row-linyu:row-1,:);ParSwarm(row+1:end,:);ParSwarm(1:linyu-(SwarmSize-row),:)];  
                    [maxValue,linyurow]=max(tempM(:,2*ParticleSize+1));                    
                    OptSwarm(SwarmSize+row,:)=tempM(linyurow,1:ParticleSize);                    
                end
            end
        end
    end%for
[maxValue,row]=max(ParSwarm(:,2*ParticleSize+1));
%尋找适應度函數值最大的解在矩陣中的位置(行數)
OptSwarm(SwarmSize*2+1,:)=ParSwarm(row,1:ParticleSize);
           

下面的 函數LocalPsoProcessByCircle實作了局部版粒子群算法的單步更新位置速度的功能,其中把速度的範圍限制在每維範圍的0.5倍。這個跟以前的版本有些差別,經過試驗效果還可以。

function [ParSwarm,OptSwarm]=LocalStepPsoByCircle(ParSwarm,OptSwarm,AdaptFunc,ParticleScope,MaxW,MinW,LoopCount,CurCount)
% 功能描述:局部版本:采用環形鄰域的方法。基本的粒子群算法的單步更新位置,速度的算法
%
%[ParSwarm,OptSwarm]=LocalStepPsoByCircle(ParSwarm,OptSwarm,AdaptFunc,ParticleScope,MaxW,MinW,LoopCount,CurCount)
%
% 輸入參數:ParSwarm:粒子群矩陣,包含粒子的位置,速度與目前的目标函數值
%輸入參數:OptSwarm:包含粒子群個體最優解與全局最優解的矩陣
%輸入參數:ParticleScope:一個粒子在運算中各維的範圍;
% 輸入參數:AdaptFunc:适應度函數
%輸入參數:LoopCount:疊代的總次數
%輸入參數:CurCount:目前疊代的次數
%
% 傳回值:含意同輸入的同名參數
%
%用法:[ParSwarm,OptSwarm]=LocalStepPsoByCircle(ParSwarm,OptSwarm,AdaptFunc,ParticleScope,MaxW,MinW,LoopCount,CurCount)
%
% 異常:首先保證該檔案在Matlab的搜尋路徑中,然後檢視相關的提示資訊。
%
%編制人:XXX
%編制時間:2010.5.6
%參考文獻:XXX
%參考文獻:XXX
%
%修改記錄
%----------------------------------------------------------------
%2010.5.6
%修改人:XXX
% 添加2*unifrnd(0,1).*SubTract1(row,:)中的unifrnd(0,1)随機數,使性能大為提高
%參照基于MATLAB的粒子群優化算法程式設計
%
% 總體評價:使用這個版本的調節系數,效果比較好
%

%容錯控制
if nargin~=8
    error('輸入的參數個數錯誤。')
end
if nargout~=2
    error('輸出的個數太少,不能保證循環疊代。')
end

%開始單步更新的操作

%*********************************************
%***** 更改下面的代碼,可以更改慣性因子的變化*****
%---------------------------------------------------------------------
% 線形遞減政策
w=MaxW-CurCount*((MaxW-MinW)/LoopCount);
%---------------------------------------------------------------------
%w 固定不變政策
%w=0.7;
%---------------------------------------------------------------------
% 參考文獻:陳貴敏,賈建援,韓琪,粒子群優化算法的慣性權值遞減政策研究,西安交通大學學報,2006,1
%w 非線形遞減,以凹函數遞減
%w=(MaxW-MinW)*(CurCount/LoopCount)^2+(MinW-MaxW)*(2*CurCount/LoopCount)+MaxW;
%---------------------------------------------------------------------
%w 非線形遞減,以凹函數遞減
%w=MinW*(MaxW/MinW)^(1/(1+10*CurCount/LoopCount));
%*****更改上面的代碼,可以更改慣性因子的變化*****
%*********************************************

% 得到粒子群群體大小以及一個粒子維數的資訊
[ParRow,ParCol]=size(ParSwarm);

%得到粒子的維數
ParCol=(ParCol-1)/2;
SubTract1=OptSwarm(1:ParRow,:)-ParSwarm(:,1:ParCol);%粒子自身曆史最優解位置減去粒子目前位置
SubTract2=OptSwarm(ParRow+1:end-1,:)-ParSwarm(:,1:ParCol);
%*********************************************
%***** 更改下面的代碼,可以更改c1,c2的變化*****
c1=2.05;
c2=2.05;
%---------------------------------------------------------------------
%con=1;
%c1=4-exp(-con*abs(mean(ParSwarm(:,2*ParCol+1))-AdaptFunc(OptSwarm(ParRow+1,:))));
%c2=4-c1;
%----------------------------------------------------------------------
%***** 更改上面的代碼,可以更改c1,c2的變化*****
%*********************************************
for row=1:ParRow   
   TempV=w.*ParSwarm(row,ParCol+1:2*ParCol)+c1*unifrnd(0,1).*SubTract1(row,:)+c2*unifrnd(0,1).*SubTract2(row,:);
   %限制速度的代碼
   for h=1:ParCol
       if TempV(:,h)>ParticleScope(h,2)/2.0
           TempV(:,h)=ParticleScope(h,2)/2.0;
       end
       if TempV(:,h)<-ParticleScope(h,2)/2.0
           TempV(:,h)=(-ParticleScope(h,2)+1e-10)/2.0;
           %加1e-10防止适應度函數被零除
       end
   end  
   
   % 更新速度
   ParSwarm(row,ParCol+1:2*ParCol)=TempV;
   
   %*********************************************
   %***** 更改下面的代碼,可以更改限制因子的變化*****
   %---------------------------------------------------------------------
   %a=1;
   %---------------------------------------------------------------------
   a=0.729;
   %***** 更改上面的代碼,可以更改限制因子的變化*****
   %*********************************************
   
   % 限制位置的範圍
   TempPos=ParSwarm(row,1:ParCol)+a*TempV;
   for h=1:ParCol
       if TempPos(:,h)>ParticleScope(h,2)
           TempPos(:,h)=ParticleScope(h,2);
       end
       if TempPos(:,h)<=ParticleScope(h,1)
           TempPos(:,h)=ParticleScope(h,1)+1e-10;           
       end
   end

   %更新位置 
   ParSwarm(row,1:ParCol)=TempPos;
   
   % 計算每個粒子的新的适應度值
   ParSwarm(row,2*ParCol+1)=AdaptFunc(ParSwarm(row,1:ParCol));
   if ParSwarm(row,2*ParCol+1)>AdaptFunc(OptSwarm(row,1:ParCol))
       OptSwarm(row,1:ParCol)=ParSwarm(row,1:ParCol);
   end
end
%for循環結束
%确定鄰域的範圍
linyurange=fix(ParRow/2);
%确定目前疊代的鄰域範圍
jiange=ceil(LoopCount/linyurange);
linyu=ceil(CurCount/jiange);
    for row=1:ParRow
        if row-linyu>0&&row+linyu<=ParRow
            tempM =[ParSwarm(row-linyu:row-1,:);ParSwarm(row+1:row+linyu,:)];
            
            [maxValue,linyurow]=max(tempM(:,2*ParCol+1));
            if maxValue>AdaptFunc(OptSwarm(ParRow+row,:))
                OptSwarm(ParRow+row,:)=tempM(linyurow,1:ParCol);
            end
        else
            if row-linyu<=0
                %該行上面的部分突出了邊界,下面絕對不會突破邊界
                if row==1
                    tempM=[ParSwarm(ParRow+row-linyu:end,:);ParSwarm(row+1:row+linyu,:)];
                    [maxValue,linyurow]=max(tempM(:,2*ParCol+1));
                     if maxValue>AdaptFunc(OptSwarm(ParRow+row,:))
                        OptSwarm(ParRow+row,:)=tempM(linyurow,1:ParCol);
                     end
                else
                    tempM=[ParSwarm(1:row-1,:);ParSwarm(ParRow+row-linyu:end,:);ParSwarm(row+1:row+linyu,:)];
                    [maxValue,linyurow]=max(tempM(:,2*ParCol+1));
                     if maxValue>AdaptFunc(OptSwarm(ParRow+row,:))
                        OptSwarm(ParRow+row,:)=tempM(linyurow,1:ParCol);
                     end
                end
            else
                %該行下面的部分突出了邊界,上面絕對不會突破邊界
                if row==ParRow
                    tempM=[ParSwarm(ParRow-linyu:row-1,:);ParSwarm(1:linyu,:)];
                    [maxValue,linyurow]=max(tempM(:,2*ParCol+1));
                     if maxValue>AdaptFunc(OptSwarm(ParRow+row,:))
                        OptSwarm(ParRow+row,:)=tempM(linyurow,1:ParCol);
                     end
                else
                    tempM=[ParSwarm(row-linyu:row-1,:);ParSwarm(row+1:end,:);ParSwarm(1:linyu-(ParRow-row),:)];  
                    [maxValue,linyurow]=max(tempM(:,2*ParCol+1));
                     if maxValue>AdaptFunc(OptSwarm(ParRow+row,:))
                        OptSwarm(ParRow+row,:)=tempM(linyurow,1:ParCol);
                     end
                end
            end
        end
    end%for
    %尋找适應度函數值最大的解在矩陣中的位置(行數),進行全局最優的改變 
[maxValue,row]=max(ParSwarm(:,2*ParCol+1));
if AdaptFunc(ParSwarm(row,1:ParCol))>AdaptFunc(OptSwarm(ParRow*2+1,:))
    OptSwarm(ParRow*2+1,:)=ParSwarm(row,1:ParCol);
end
  
           

這兩個函數給出以後,需要一個函數來把這兩個函數組裝起來,以此實作一個完整的粒子群算法,這個函數就是LocalPsoProcessByCircle

function [Result,OnLine,OffLine,MinMaxMeanAdapt,BestofStep]=LocalPsoProcessByCircle(SwarmSize,ParticleSize,ParticleScope,InitFunc,StepFindFunc,AdaptFunc,IsStep,IsDraw,LoopCount,IsPlot)
% 功能描述:一個循環n次的局部PSO算法完整過程,傳回這次運作的最小與最大的平均适應度,以及線上性能與離線性能
%[Result,OnLine,OffLine,MinMaxMeanAdapt]=PsoProcess(SwarmSize,ParticleSize,ParticleScope,InitFunc,StepFindFunc,AdaptFunc,IsStep,IsDraw,LoopCount,IsPlot)
% 輸入參數:SwarmSize:種群大小的個數
%輸入參數:ParticleSize:一個粒子的維數
%輸入參數:ParticleScope:一個粒子在運算中各維的範圍;
%         ParticleScope格式:
%           3維粒子的ParticleScope格式:
%                                   [x1Min,x1Max
%                                    x2Min,x2Max
%                                    x3Min,x3Max]
%
% 輸入參數:InitFunc:初始化粒子群函數
%輸入參數:StepFindFunc:單步更新速度,位置函數
%輸入參數:AdaptFunc:适應度函數
%輸入參數:IsStep:是否每次疊代暫停;IsStep=0,不暫停,否則暫停。預設不暫停
%輸入參數:IsDraw:是否圖形化疊代過程;IsDraw=0,不圖形化疊代過程,否則,圖形化表示。預設不圖形化表示
%輸入參數:LoopCount:疊代的次數;預設疊代100次
%輸入參數:IsPlot:控制是否繪制線上性能與離線性能的圖形表示;IsPlot=0,不顯示;
%                 IsPlot=1;顯示圖形結果。預設IsPlot=1
%
%傳回值:BestofStep:每次疊代,全局最優值.
% 傳回值:Result為經過疊代後得到的最優解
%傳回值:OnLine為線上性能的資料
%傳回值:OffLine為離線性能的資料
% 傳回值:MinMaxMeanAdapt為本次完整疊代得到的最小與最大的平均适應度
%
%用法[Result,OnLine,OffLine,MinMaxMeanAdapt]=PsoProcess(SwarmSize,ParticleSize,ParticleScope,InitFunc,StepFindFunc,AdaptFunc,IsStep,IsDraw,LoopCount,IsPlot);
%
%異常:首先保證該檔案在Matlab的搜尋路徑中,然後檢視相關的提示資訊。
%
%編制人:XXX
% 編制時間:2007.3.26
%參考文獻:XXXXX%

%修改記錄:
%添加MinMaxMeanAdapt,以得到性能評估資料
%修改人:XXX
%修改時間:2007.3.27
%參考文獻:XXX.

%容錯控制
if nargin<4
    error(' 輸入的參數個數錯誤。')
end

[row,colum]=size(ParticleSize);
if row>1||colum>1
    error('輸入的粒子的維數錯誤,是一個1行1列的資料。');
end
[row,colum]=size(ParticleScope);
if row~=ParticleSize||colum~=2
    error('輸入的粒子的維數範圍錯誤。 ');
end

%設定預設值
if nargin<7
    IsPlot=1;
    LoopCount=100;
    IsStep=0;
    IsDraw=0;
end
if nargin<8
    IsPlot=1;
    IsDraw=0;
    LoopCount=100;
end
if nargin<9
    LoopCount=100;
    IsPlot=1;
end
if nargin<10
    IsPlot=1;
end

%控制是否顯示2維以下粒子維數的尋找最優的過程
if IsDraw~=0 
    figure
    clf
    %DrawObjGraphic(ParticleSize,ParticleScope,AdaptFunc);
    DrawObjGraphic();
    view(0,90);
end

%初始化種群       
[ParSwarm,OptSwarm]=InitFunc(SwarmSize,ParticleSize,ParticleScope,AdaptFunc);

% 在<a href="http://lib.csdn.net/base/softwaretest" target="_blank" rel="external nofollow"  class='replace_word' title="軟體測試知識庫" target='_blank' style='color:#df3434; font-weight:bold;'>測試</a>函數圖形上繪制初始化群的位置
if IsDraw~=0
    if 1==ParticleSize
        for ParSwarmRow=1:SwarmSize
            plot([ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,1)],[ParSwarm(ParSwarmRow,3),0],'r*-','markersize',8);
            text(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,3),num2str(ParSwarmRow));
        end
    end

    if 2==ParticleSize
        for ParSwarmRow=1:SwarmSize
            hold on
            stem3(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,2),ParSwarm(ParSwarmRow,5),'white*','markersize',8);
        end         
    end
end
    
%暫停讓抓圖
if IsStep~=0
    disp(' 開始疊代,按任意鍵:')
    pause
end

%開始更新算法的調用
for k=1:LoopCount
    %顯示疊代的次數:
    disp('----------------------------------------------------------')
    TempStr=sprintf(' 第 %g 次疊代',k);
    disp(TempStr);
    disp('----------------------------------------------------------')
    
    % 調用一步疊代的算法
    [ParSwarm,OptSwarm]=StepFindFunc(ParSwarm,OptSwarm,AdaptFunc,ParticleScope,0.95,0.4,LoopCount,k);
    
    % 在目标函數的圖形上繪制2維以下的粒子的新位置
    if IsDraw~=0
        if 1==ParticleSize
            for ParSwarmRow=1:SwarmSize
                plot([ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,1)],[ParSwarm(ParSwarmRow,3),0],'r*-','markersize',8);
                text(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,3),num2str(ParSwarmRow));
            end
        end

        if 2==ParticleSize
            for ParSwarmRow=1:SwarmSize
                stem3(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,2),ParSwarm(ParSwarmRow,5),'white.','markersize',8);
            end
        end
    end
    
    XResult=OptSwarm(SwarmSize*2+1,1:ParticleSize);
    YResult=AdaptFunc(XResult);    
    if IsStep~=0
        XResult=OptSwarm(SwarmSize*2+1,1:ParticleSize);
        YResult=AdaptFunc(XResult);    
        str=sprintf('%g步疊代的最優目标函數值%g',k,YResult);
        disp(str);
        disp(' 下次疊代,按任意鍵繼續');
        pause
    end
    
    %記錄每一步的平均适應度
    MeanAdapt(1,k)=mean(ParSwarm(:,2*ParticleSize+1));
    BestofStep(1,k)=YResult;
end
%for循環結束标志

%記錄最小與最大的平均适應度
MinMaxMeanAdapt=[min(MeanAdapt),max(MeanAdapt)];
% 計算離線與線上性能
for k=1:LoopCount
    OnLine(1,k)=sum(MeanAdapt(1,1:k))/k;
    OffLine(1,k)=max(MeanAdapt(1,1:k));
end

for k=1:LoopCount
    OffLine(1,k)=sum(OffLine(1,1:k))/k;
end

%繪制離線性能與線上性能曲線
if 1==IsPlot
    figure
    hold on
    title('離線性能曲線圖')
    xlabel(' 疊代次數');
    ylabel('離線性能');
    grid on
    plot(OffLine);

    figure
    hold on
    title(' 線上性能曲線圖')
    xlabel('疊代次數');
    ylabel('線上性能');
    grid on
    plot(OnLine);
end

%記錄本次疊代得到的最優結果
XResult=OptSwarm(SwarmSize*2+1,1:ParticleSize);
YResult=AdaptFunc(XResult);
Result=[XResult,YResult];
           

這裡給出一個使用的例子代碼,并分别解釋各參數的含義:

%粒子的維數限制範圍
Scope=[
        -10 10;
        -10 10;
        -10 10;
        -10 10;
        -10 10;
        -10 10;
        -10 10;
        -10 10;
        -10 10;
        -10 10];
%粒子群種群規模
qun=20;
%粒子的維數
lizi=10;
[Result,OnLine,OffLine,MinMaxMeanAdapt,BestofStep]=LocalPsoProcessByCircle(qun,lizi,Scope,@LocalInitSwarm,@LocalStepPsoByCircle,@Rastrigin,1,0,1000,1);
           

在上面的代碼中函數 LocalPsoProcessByCircle 中的qun代表粒子群的規模為20個,lizi代表每個粒子的維數為10,Scope是粒子的每一維的範圍,同時也是速度的範圍的二倍,@localinitswarm 是初始化函數的句柄,@localsteppsobycircle是單步更新的函數句柄,@Rastrigin是适應度評價函數的句柄,1000代表真個算法循環1000次終止,其他參數參見說明文檔。

補充一點:上面主函數中給出的适應度函數可以參考粒子群算法(6)-----幾個适應度評價函數或者自己寫。

附注:本文為轉載文章,歡迎交流。 原文出處:http://blog.csdn.net/niuyongjie/article/details/5601882 作者:niuyongjie

繼續閱讀