粒子群演算法(5)-----標準粒子群演算法的實現
阿新 • • 發佈:2019-01-04
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
%參考文獻: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;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];
%功能描述:一個迴圈n次的PSO演算法完整過程,返回這次執行的最小與最大的平均適應度,以及線上效能與離線效能
%[Result,OnLine,OffLine,MinMaxMeanAdapt]=PsoProcess(SwarmSize,ParticleSize,ParticleScope
%輸入引數:SwarmSize:種群大小的個數
%輸入引數:ParticleSize:一個粒子的維數
%輸入引數:ParticleScope:一個粒子在運算中各維的範圍;
% ParticleScope格式:
% 3維粒子的ParticleScope格式:
% [x1Min,x1Max
% x2Min,x2Max
% x3Min
%
%輸入引數:InitFunc:初始化粒子群函式
%輸入引數:StepFindFunc:單步更新速度,位置函式
%輸入引數:AdaptFunc:適應度函式
%輸入引數:IsStep:是否每次迭代暫停;IsStep=0,不暫停,否則暫停。預設不暫停
%輸入引數:IsDraw:是否圖形化迭代過程;IsDraw=0,不圖形化迭代過程,否則,圖形化表示。預設不圖形化表示
%輸入引數:LoopCount:迭代的次數;預設迭代100次
%輸入引數:IsPlot:控制是否繪製線上效能與離線效能的圖形表示;IsPlot=0,不顯示;
% IsPlot=1;顯示圖形結果。預設IsPlot=
%
%返回值: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;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];