粒子群优化算法的实现
文章目錄
- 1 算法基本概念
- 2 算法的MATLAB實現
- 2.1 算法的基本程序
- 2.2 適應度函數
- 示例
- 2.3 免疫粒子群算法的MATLAB應用
- 3 粒子群算法的權重控制
- 3.1 線性遞減法
- 3.2 自適應法
- 3.2.1 根據全局最優點距離進行調整
- 3.2.2 依據早熟收斂程度和適應值進行調整權重
- 4 混合粒子群算法
- 參考文獻
1 算法基本概念
粒子群優化算法屬于進化算法的一種,通過追隨當前搜索到的最優值來尋找全局最優。粒子群算法也稱粒子群優化算法(Particle Swarm Optimization,PSO),PSO有幾個關鍵概念:粒子、優化函數、適值(Fitness Value)、飛行方向、飛行距離。
粒子群優化算法實現容易、精度高、收斂快,在解決實際問題中展示了其優越性。粒子群算法通用性較好,適合處理多種類型的目標函數和約束,并且容易與傳統的優化方法結合,從而改進自身的局限性,更高效地解決問題。因此,將粒子群算法應用于解決多目標優化問題上具有很大的優勢。
2 算法的MATLAB實現
基本粒子群算法使用固定長度的二進制符號串來表示群體中的個體,其等位基因是由二值符號集 {0,1}\{0,1\}{0,1} 所組成。初始群體中各個個體的基因值可用均勻分布的隨機數來生成。
2.1 算法的基本程序
基本粒子群(PSO)算法描述如下:
beginInitalize; %包括初始化粒子群數,粒子初始速度和位置[x,xd] = judge(x,pop_size); %調用judge函數,初始化第一次值fornum=2:最大迭代次數wk=wmax-num*(wmax-wmin)/max_gen; %計算慣性權重r1= ; r2= %隨機產生加速權重PSO算法迭代求vk,xk;While 判斷 vk 是否滿足條件再次重新生成加速權重系數r1;r2PSO算法再次迭代求vk,xk數值end調用[x,xd] = judge(x,pop_size); 重新計算出目標函數值判斷并重新生成pj數值;判斷并重新生成pjd數值if 迭代前數值 > 迭代后的數值累加迭代次數值end輸出隨機數種子、進度、最優迭代次數、每個函數的數值和目標函數的數值用ASCII保存粒子位移的數值用ASCII保存粒子速度的數值 end在MATLAB中,編程實現的基本粒子群算法基本函數為PSO,其調用格式如下:
[xm, dv] = PSO(fitness, N, c1, c2, w, M, D)其中,fitness為待優化的目標函數(適應度函數),N是粒子數目,c1是學習因子 111,c2是學習因子 222,w是慣性權重,M是最大迭代次數,D是自變量個數,xm是目標函數取最小值時自變量,fv是目標函數最小值。
使用MATLAB實現基本粒子群(PSO)算法代碼如下:
function[xm,fv]=PSO(fitness, N, c1, c2, w, M, D) %%%%%%%給定初始化條件%%%%%%% % c1 學習因子1 % c2 學習因子2 % w 慣性權重 % M 最大迭代次數 % D 搜索空間維數 % N 初始化群體個體數目 %%%%%%%初始化種群個體(限定位置和速度范圍)%%%%%%% format long; for i = 1: Nfor j = 1: Dx(i,j) = randn; % 隨機初始化位置v(i,j) = randn; % 隨機初始化速度end end %%%%%%%先計算各個粒子的適應度,并初始化Pi和Pg%%%%%%% for i = 1: Np(i) = fitness(x(i,:));y(i,:) = x(i,:); end pg = x(N,:); % pg為全局最優 for i = 1:(N-1)if fitness(x(i,:)) < fitness(pg)pg = x(i,:);end end %%%%%%%進入主循環,按照公式依次迭代,知道滿足精度要求%%%%%%% for t = 1:Mfor i = 1:N % 更新速度和位移v(i,:) = w * v(i,:) + c1 * rand * (y(i,:)-x(i,:)) + c2 * rand * (pg - x(i,:));x(i,:) = x(i,:) + v(i,:);if fitness(x(i,:)) < p(i)p(i) = fitness(x(i,:));y(i,:) = x(i,:);endif p(i) < fitness(pg)pg = y(i,:);endendPbest(t) = fitness(pg); end %%%%%%%最后給出計算結果%%%%%%% disp('***********************') disp('目標函數取最小值時自變量:') xm = pg' disp('目標函數最小值為:') fv = fitness(pg) disp('***********************')2.2 適應度函數
適應度表示個體 xxx 對環境的適應程度,分為針對被優化目標函數優化行適應度和 針對約束函數的約束型適應度。粒子群算法使用的適應度函數多樣, GWGWGW 函數和 RARARA 函數是兩類經典的適應度函數。
- 優化型適應度
Fobj(X)=f(x)F_{obj}(X)=f(x) Fobj?(X)=f(x) - 約束型適應度
Fi(X)={0,gi(X)≤0gi(X),gi(X)≥0F_{i}(X)=\left\{ \begin{matrix} 0,\qquad g_i(X)\leq0\\ \\ g_i(X),\quad g_i(X)\geq0\\ \end{matrix} \right. Fi?(X)=????0,gi?(X)≤0gi?(X),gi?(X)≥0?
示例
利用基本粒子群算法求解函數 f(x)=∑i=110(xi2+2xi?3)f(x)=\sum_{i=1}^{10}(x_i^2+2x_i-3)f(x)=∑i=110?(xi2?+2xi??3) 最小值。
解析
利用PSO求解最小值,需要確認迭代次數對結果的影響。設定題中函數最小點均為 000,粒子群規模為 404040,慣性權重為 0.60.60.6,學習因子1為 1.21.21.2,學習因子2為 2.22.22.2,迭代次數為 100100100 和 300300300。
基本粒子群PSO算法代碼見上。
目標函數代碼如下:
function F = fitness(x) F = 0; for i = 1: 10F = F + x(i)^2 + 2 * x(i) - 3; end求解函數最小值代碼如下:
- 迭代次數為100
結果如下:
*********************** 目標函數取最小值時自變量:xm =-0.991104610834485-0.997666388064225-0.993499168365228-0.995209292046358-0.997319510025391-0.997398011693752-0.997812988297172-1.003889705997851-0.999468835940385-1.006062399124978目標函數最小值為:fv =-39.999779311591290***********************- 迭代次數為300
結果如下:
*********************** 目標函數取最小值時自變量:xm =-1.005827335897396-1.003735840310715-1.001088656877167-1.001724852313095-1.003933895880758-1.002330669862129-1.001909424295409-0.996959460575888-0.993648871189404-1.001008751197640目標函數最小值為:fv =-39.999872772608128***********************PSO算法是一種隨機算法,同樣的參數也會算出不同結果,且迭代次數越大,獲得解的精度不一定越高。在粒子群算法中,要想獲得精度高的解,關鍵各個參數之間的合理搭配。
2.3 免疫粒子群算法的MATLAB應用
使用基于模擬退火的混合粒子群算法求解 f(x)=cosx12?x22?3[2+(x12+x22)]2+0.8f(x)=\frac{cos\sqrt{x_1^2-x_2^2}-3}{[2+(x_1^2+x_2^2)]^2}+0.8f(x)=[2+(x12?+x22?)]2cosx12??x22???3?+0.8 最小值,其中 ?10≤xi≤10-10 \leq x_i \leq 10?10≤xi?≤10 ,粒子數為 606060,學習因子均為 1.21.21.2,退火常數為 0.80.80.8,迭代次數為 800800800。
解析
免疫粒子群算法代碼如下:
function [x,y,Result]=PSO_immu(func,N,c1,c2,w,MaxDT,D,eps,DS,replaceP,minD,Psum) format long; %%%%%%給定初始化條件%%%%%%%%%%%%%%%%%%%%%%%%%%% c1=1.2; %學習因子1 c2=1.2; %學習因子2 w=0.8; %慣性權重 MaxDT=800; %最大迭代次數 D=2; %搜索空間維數(未知數個數) N=60; %初始化群體個體數目 eps=10^(-10); %設置精度(在已知最小值時候用) DS=8; %每隔DS次循環就檢查最優個體是否變優 replaceP=0.5; %粒子的概率大于replaceP將被免疫替換 minD=1e-10; %粒子間的最小距離 Psum=0; %個體最佳的和 range=100; count = 0; %%%%%%初始化種群的個體%%%%%%%%%%%%%%%%%%%%%%%%%%% for i=1:Nfor j=1:Dx(i,j)=-range+2*range*rand; %隨機初始化位置v(i,j)=randn; %隨機初始化速度end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%先計算各個粒子的適應度,并初始化Pi和Pg%%%%%%%%%%%%%%%%%%% for i=1:N p(i)=feval(func,x(i,:));y(i,:)=x(i,:); end pg=x(1,:); %Pg為全局最優 for i=2:Nif feval(func,x(i,:))<feval(func,pg) pg=x(i,:);end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%主循環,按照公式依次迭代,直到滿足精度要求%%%%%%% for t=1:MaxDTfor i=1:Nv(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));x(i,:)=x(i,:)+v(i,:);if feval(func,x(i,:))<p(i) p(i)=feval(func,x(i,:)); y(i,:)=x(i,:);endif p(i)<feval(func,pg) pg=y(i,:);subplot(1,2,1); bar(pg,0.25); axis([0 3 -40 40 ]) ;title (['Iteration ', num2str(t)]); pause (0.1);subplot(1,2,2); plot(pg(1,1),pg(1,2),'rs','MarkerFaceColor','r', 'MarkerSize',8)hold on;plot(x(:,1),x(:,2),'k.');set(gca,'Color','g')hold off;grid on;axis([-100 100 -100 100 ]) ;title(['Global Min = ',num2str(p(i))]);xlabel(['Min_x= ',num2str(pg(1,1)),' Min_y= ',num2str(pg(1,2))]);endendPbest(t)=feval(func,pg) ; % if Foxhole(pg,D)<eps %如果結果滿足精度要求則跳出循環 % break; % end %%%%%開始進行免疫%%%%%%%%%%%%%%%%%if t>DSif mod(t,DS)==0 && (Pbest(t-DS+1)-Pbest(t))<1e-020 %如果連續DS代數,群體中的最優沒有明顯變優,則進行免疫.%在函數測試的過程中發現,經過一定代數的更新,個體最優不完全相等,但變化非常非常小,for i=1:N %先計算出個體最優的和Psum=Psum+p(i);endfor i=1:N %免疫程序 for j=1:N %計算每個個體與個體i的距離distance(j)=abs(p(j)-p(i));endnum=0; for j=1:N %計算與第i個個體距離小于minD的個數if distance(j)<minDnum=num+1;endendPF(i)=p(N-i+1)/Psum; %計算適應度概率PD(i)=num/N; %計算個體濃度a=rand; %隨機生成計算替換概率的因子PR(i)=a*PF(i)+(1-a)*PD(i); %計算替換概率endfor i=1:Nif PR(i)>replacePx(i,:)=-range+2*range*rand(1,D);count=count+1;endendendend end%%%%%%%最后給出計算結果%%%%%%%%%%%%%%%%%%%% x=pg(1,1); y=pg(1,2); Result=feval(func,pg); %%%%%%%%%%算法結束%%%%%%%%%%%%%%%%%% function probabolity(N,i) PF=p(N-i)/Psum;%適應度概率 disp(PF); for jj=1:Ndistance(jj)=abs(P(jj)-P(i)); end num=0; for ii=1:Nif distance(ii)<minDnum=num+1;end end PD=num/N; %個體濃度 PR=a*PF+(1-a)*PD; %替換概率目標函數代碼如下:
function y = imF(x)y = (cos(x(1)^2-x(2)^2)-3)/((2+(x(1)^2+x(2)^2))^2)+0.8; end目標函數最小值計算代碼如下:
clear all clc x=zeros(1,10); [x1,x2,f] = PSO_im(@imF,60,2,2,0.8,800,5,0.0000001,10,0.6,0.0000000000000000001,0); % 得到出計算結果 disp('*************************************************'); disp('目標函數取最小值時的自變量:'); x1 x2 disp('目標函數的最小值為:') f disp('**************************************************');結果如下所示:
************************************************* 目標函數取最小值時的自變量:x1 =-9.576147568073508e-09x2 =4.596695783685527e-09目標函數的最小值為:f =0.300000000000000**************************************************3 粒子群算法的權重控制
慣性權重控制前一變化量對當前變化量的影響。www 較大,全局搜索能力較強;www 較小,局部搜索能力較強。常見的PSO算法有自適應權重法、隨機權重法、線性遞減權重法等。
3.1 線性遞減法
針對PSO算法容易早熟及后期容易在全局最優解附近產生振蕩的現象,提出了線性遞減權重法。即慣性權重依照線性從大到小遞減,其變化公式為
w=wmax?t?(wmax?wmin)tmaxw = w_{max}-\frac{t * (w_{max}-w_{min})}{t_{max}} w=wmax??tmax?t?(wmax??wmin?)?
其中,wmaxw_{max}wmax? 表示慣性權重最大值,wminw_{min}wmin? 表示慣性權重最小值,ttt 表示當前迭代步數。
3.2 自適應法
3.2.1 根據全局最優點距離進行調整
目前大多采用非線性動態慣性權重系數公式,如下:
w={wmin?(wmax?wmin)?(f?fmin)favg?fmin,f≤favgwmax,f>favgw=\left\{ \begin{matrix} w_{min}-\frac{(w_{max}-w_{min})*(f-f_{min})}{f_{avg}-f_{min}},\quad f \leq f_{avg}\\ \\ w_{max},\quad f>f_{avg}\\ \end{matrix} \right. w=????wmin??favg??fmin?(wmax??wmin?)?(f?fmin?)?,f≤favg?wmax?,f>favg??
其中,fff 表示粒子實時的目標函數值,favgf_{avg}favg? 和 fminf_{min}fmin? 分別表示當前所有粒子的平均值和最小目標值。
從上面公式可以看出,慣性權重隨著粒子目標函數值的改變而改變。當粒子目標值分散時,減小慣性權重;粒子目標值一致時,增加慣性權重。
3.2.2 依據早熟收斂程度和適應值進行調整權重
根據群里的早熟收斂程度和個體適應值,可以確定慣性權重的變化。
設定粒子 pip_ipi? 的適應值為 fif_ifi?,最優粒子適應度為 fminf_{min}fmin?,則粒子群的平均適應值是 favg=1n∑i=1nfif_{avg}=\frac{1}{n} \sum_{i=1}^{n}f_ifavg?=n1?∑i=1n?fi?,將優于平均適應值的粒子適應值求平均(記為 favg′f_{avg}^{'}favg′?),定義 Δ=∣fm?favg′∣\Delta=|f_m-f_{avg}^{'}|Δ=∣fm??favg′?∣。
依據 fif_ifi?、fmf_mfm?、favgf_{avg}favg? 將群體分為 333 個子群,分別進行不同的自適應操作。其慣性權重的調整如下:
(1)如果 fif_ifi? 優于 favg′f_{avg}^{'}favg′?,那么 w=w?(w?wmin)?∣fi?favg′fm?favg′∣w=w-(w-w_{min})*|\frac{f_i-f_{avg}^{'}}{f_m-f_{avg}^{'}}|w=w?(w?wmin?)?∣fm??favg′?fi??favg′??∣
(2)如果 fif_ifi? 優于 favg′f_{avg}^{'}favg′?,且次于 fmf_mfm?,則慣性權重不變。
(3)如果 fif_ifi? 次于 favg′f_{avg}^{'}favg′?,那么 w=1.5?11+k1?exp(?k2?Δ)w=1.5-\frac{1}{1+k_1*exp(-k_2*\Delta)}w=1.5?1+k1??exp(?k2??Δ)1?。
其中,k1k_1k1?、k2k_2k2? 為控制參數,k1k_1k1? 用來控制 www 的上限,k2k_2k2? 主要用來控制 w=1.5?11+k1?exp(?k2?Δ)w=1.5-\frac{1}{1+k_1*exp(-k_2*\Delta)}w=1.5?1+k1??exp(?k2??Δ)1? 的調節能力。
當算法停止時,如果粒子的分布分散,則 Δ\DeltaΔ 比較大,www 變小,此時算法局部搜索能力加強,從而使得群體趨于收斂;若粒子的分布聚集,則 Δ\DeltaΔ 比較小,www 變大,使粒子具有較強的探查能力,從而有效地跳出局部最優。
4 混合粒子群算法
混合策略PSO就是將其他進化算法或傳統優化算法或其他技術應用到PSO中,用于提高局部開發能力、增強收斂速度與精度,或者提高粒子多樣性、增強粒子地全局探索能力。包括基于模擬退火的混合粒子群算法、基于雜交的混合粒子群算法等。下面以基于的混合粒子群算法為例。
基于的混合粒子群算法是借鑒遺傳算法中雜交的概念,在每次迭代中,根據雜交率選取指定數量的粒子放入雜交池內,池內的粒子隨機兩兩雜交,產生同樣數目的子代粒子(nnn),并用子代粒子替代父代粒子(mmm)。子代位置由父代位置進行交叉得到
nx=i?mx(1)+(1?i)?mx(2)nx=i*mx(1)+(1-i)*mx(2) nx=i?mx(1)+(1?i)?mx(2)
其中,mxmxmx 表示父代粒子的位置,nxnxnx 表示子代粒子的位置,iii 是 000 到 111 之間的隨機數。子代的速度由下式計算:
nv=mv(1)+mv(2)∣mv(1)+mv(2)∣∣mv∣nv=\frac{mv(1)+mv(2)}{|mv(1)+mv(2)|}|mv| nv=∣mv(1)+mv(2)∣mv(1)+mv(2)?∣mv∣
其中,mvmvmv 表示父代粒子的速度,nvnvnv 表示子代粒子的速度。
參考文獻
[1] MATLAB優化算法/科學與工程計算技術叢書
總結
以上是生活随笔為你收集整理的粒子群优化算法的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 清除浮动的7种方法
- 下一篇: 西门子STEP7 OPC SERVER的