最近要寫篇與粒子群算法有關的文章,是以不得不實作粒子群算法的局部版本。粒子群算法局部版本的實作思想已經在粒子群算法(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