1. 程式人生 > >粒子群演算法(5)-----標準粒子群演算法的實現

粒子群演算法(5)-----標準粒子群演算法的實現

function [Result,OnLine,OffLine,MinMaxMeanAdapt]=PsoProcess(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
%
%返回值:Result為經過迭代後得到的最優解
%返回值:OnLine為線上效能的資料
%返回值:OffLine為離線效能的資料
%返回值:MinMaxMeanAdapt為本次完整迭代得到的最小與最大的平均適應度
%
%用法[Result
,OnLine,OffLine,MinMaxMeanAdapt]=PsoProcess(SwarmSize,ParticleSize,ParticleScope,InitFunc,StepFindFunc,AdaptFunc,IsStep,IsDraw,LoopCount,IsPlot);
%
%異常:首先保證該檔案在Matlab的搜尋路徑中,然後檢視相關的提示資訊。
%
%編制人:XXX
%編制時間:
2007.3.26
%參考文獻:XXX
XX%

%修改記錄:
%新增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;endif nargin<8
    IsPlot
=1;
    IsDraw
=0;
    LoopCount
=100;endif nargin<9
    LoopCount
=100;
    IsPlot
=1;endif nargin<10
    IsPlot
=1;end

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

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

%在測試函式圖形上繪製初始化群的位置
if IsDraw~=0if1==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));endendif2==ParticleSize
        
for ParSwarmRow=1:SwarmSize
            stem3
(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,2),ParSwarm(ParSwarmRow,5),'r.','markersize',8);endendend
    
%暫停讓抓圖
if IsStep~=0
    disp
('開始迭代,按任意鍵:')pauseend

%開始更新演算法的呼叫
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~=0if1==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));endendif2==ParticleSize
            
for ParSwarmRow=1:SwarmSize
                stem3
(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,2),ParSwarm(ParSwarmRow,5),'r.','markersize',8);endendend
    
    XResult
=OptSwarm(SwarmSize+1,1:ParticleSize);
    YResult
=AdaptFunc(XResult);if IsStep~=0
        XResult
=OptSwarm(SwarmSize+1,1:ParticleSize);
        YResult
=AdaptFunc(XResult);    
        str
=sprintf('%g步迭代的最優目標函式值%g',k,YResult);
        disp
(str);
        disp
('下次迭代,按任意鍵繼續');pauseend
    
    %記錄每一步的平均適應度
    MeanAdapt
(1,k)=mean(ParSwarm(:,2*ParticleSize+1));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));endfor k=1:LoopCount
    OffLine
(1,k)=sum(OffLine(1,1:k))/k;end

%繪製離線效能與線上效能曲線
if1==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+1,1:ParticleSize);
YResult
=AdaptFunc(XResult);
Result
=[XResult,YResult];