基于粒子群优化算法的函数寻优算法
文章目錄
- 一、理論基礎(chǔ)
- 二、案例背景
- 1、問題描述
- 2、解題思路及步驟
- 三、MATLAB程序?qū)崿F(xiàn)
- 1、PSO算法參數(shù)設(shè)置
- 2、種群初始化
- 3、尋找初始極值
- 4、迭代尋優(yōu)
- 5、結(jié)果分析
- 四、慣性權(quán)重
- 1、慣性權(quán)重的選擇
- 2、ω\omegaω變化的算法性能分析
- 五、參考文獻(xiàn)
一、理論基礎(chǔ)
粒子群算法(particle swarm optimization,PSO)是計算智能領(lǐng)域一種群體智能的優(yōu)化算法。該算法最早由Kennedy和Eberhart在1995年提出的。PSO算法源于對鳥類捕食行為的研究,鳥類捕食時,找到食物最簡單有效的策略就是搜尋當(dāng)前距離食物最近的鳥的周圍區(qū)域。PSO算法就是從這種生物種群行為特征中得到啟發(fā)并用于求解優(yōu)化問題的,算法中每個粒子都代表問題的一個潛在解,每個粒子對應(yīng)一個由適應(yīng)度函數(shù)決定的適應(yīng)度值。粒子的速度決定了粒子移動的方向和距離,速度隨自身及其他粒子的移動經(jīng)驗進(jìn)行動態(tài)調(diào)整,從而實(shí)現(xiàn)個體在可解空間中的尋優(yōu)。
假設(shè)在一個DDD維的搜索空間中,由nnn個粒子組成的種群X=(X1,X2,?,Xn)\boldsymbol{X}=(X_1,X_2,\dotsm,X_n)X=(X1?,X2?,?,Xn?),其中第iii個粒子表示為一個DDD維的向量Xi=(Xi1,Xi2,?,XiD)T\boldsymbol{X_i}=(X_{i1},X_{i2},\dotsm,X_{iD})^TXi?=(Xi1?,Xi2?,?,XiD?)T,代表第iii個粒子在DDD維搜索空間中的位置,亦代表問題的一個潛在解。根據(jù)目標(biāo)函數(shù)即可計算出每個粒子位置Xi\boldsymbol{X_i}Xi?對應(yīng)的適應(yīng)度值。第iii個粒子的速度為V=(Vi1,Vi2,?,ViD)T\boldsymbol{V}=(V_{i1},V_{i2},\dotsm,V_{iD})^TV=(Vi1?,Vi2?,?,ViD?)T,其個體最優(yōu)極值為Pi=(Pi1,Pi2,?,PiD)T\boldsymbol{P_i}=(P_{i1},P_{i2},\dotsm,P_{iD})^TPi?=(Pi1?,Pi2?,?,PiD?)T,種群的群體最優(yōu)極值為Pg=(Pg1,Pg2,?,PgD)T\boldsymbol{P_g}=(P_{g1},P_{g2},\dotsm,P_{gD})^TPg?=(Pg1?,Pg2?,?,PgD?)T。
在每次迭代過程中,粒子通過個體極值和群體極值更新自身的速度和位置,即Vidk+1=ωVidk+c1r1(Pidk?Xidk)+c2r2(Pgdk?Xidk)(1)V_{id}^{k+1}=\omega V_{id}^k+c_1r_1(P_{id}^k-X_{id}^k)+c_2r_2(P_{gd}^k-X_{id}^k)\tag{1}Vidk+1?=ωVidk?+c1?r1?(Pidk??Xidk?)+c2?r2?(Pgdk??Xidk?)(1)Xidk+1=Xidk+Vk+1id(2)X_{id}^{k+1}=X_{id}^k+V_{k+1_{id}}\tag {2}Xidk+1?=Xidk?+Vk+1id??(2)其中,ω\omegaω為慣性權(quán)重;d=1,2,?,nd=1,2,\dotsm,nd=1,2,?,n;kkk為當(dāng)前迭代次數(shù);VidV_{id}Vid?為粒子的速度;c1c_1c1?和c2c_2c2?是非負(fù)的常數(shù),稱為加速度因子;r1r_1r1?和r2r_2r2?是分布于[0,1][0,1][0,1]區(qū)間的隨機(jī)數(shù)。為防止粒子的盲目搜索,一般建議將其位置和速度限制在一定的區(qū)間[?Xmax,Xmax][-X_{max},X_{max}][?Xmax?,Xmax?]、[?Vmax,Vmax][-V_{max},V_{max}][?Vmax?,Vmax?]。
二、案例背景
1、問題描述
本案例尋優(yōu)的非線性函數(shù)為f(x,y)=sinx2+y2x2+y2+ecos2πx+cos2πy2?2.71289(3)f(x,y)=\frac{sin\sqrt{x^2+y^2}}{\sqrt{x^2+y^2}}+e^{\frac{cos2\pi x+cos2\pi y}{2}}-2.71289\tag{3}f(x,y)=x2+y2?sinx2+y2??+e2cos2πx+cos2πy??2.71289(3)函數(shù)圖形如圖1所示。
圖1 函數(shù)圖形從函數(shù)圖形可以看出,該函數(shù)有很多局部極大值點(diǎn),而極限位置為(0,0)(0,0)(0,0),在(0,0)(0,0)(0,0)附近取得極大值,極大值約為1.0054。
2、解題思路及步驟
基于PSO算法的函數(shù)極值尋優(yōu)算法流程圖如圖2所示。
其中,粒子和速度初始化是隨機(jī)初始化粒子速度和粒子位置;根據(jù)式(3)計算粒子適應(yīng)度值;根據(jù)初始粒子適應(yīng)度值確定個體極值和群體極值;根據(jù)式(1)與式(2)更新粒子速度和位置;根據(jù)新種群中粒子適應(yīng)度值更新個體極值和群體極值。
本案例中,適應(yīng)度函數(shù)為函數(shù)表達(dá)式,適應(yīng)度值為函數(shù)值。種群粒子數(shù)為20,每個粒子的維數(shù)為2,算法迭代進(jìn)化次數(shù)為300。
三、MATLAB程序?qū)崿F(xiàn)
1、PSO算法參數(shù)設(shè)置
設(shè)置PSO算法的運(yùn)行參數(shù),程序代碼如下:
%% 清空環(huán)境 clc clear%% 參數(shù)初始化 % 速度更新參數(shù) c1 = 1.49445; c2 = 1.49445;maxgen = 300; % 進(jìn)化次數(shù) sizepop = 20; % 種群規(guī)模% 個體和速度的最大最小值 popmax=2; popmin=-2; Vmax=0.5; Vmin=-0.5;2、種群初始化
隨機(jī)初始化粒子位置和粒子速度,并根據(jù)適應(yīng)度函數(shù)計算粒子適應(yīng)度值。程序代碼如下:
%% 隨機(jī)產(chǎn)生初始粒子和速度 for i = 1:sizepop% 隨機(jī)產(chǎn)生一個種群pop(i, :) = 2*rands(1, 2); % 初始種群V(i, :) = 0.5*rands(1, 2); % 初始化速度% 計算適應(yīng)度fitness(i) = fun(pop(i, :)); % 染色體的適應(yīng)度 end適應(yīng)度函數(shù)如下:
function y = fun(x) % 函數(shù)用于計算粒子適應(yīng)度值 % x input 輸入粒子 % y output 粒子適應(yīng)度值 y=sin( sqrt(x(1).^2+x(2).^2) )./sqrt(x(1).^2+x(2).^2)+...exp((cos(2*pi*x(1))+cos(2*pi*x(2)))/2)-2.71289;3、尋找初始極值
根據(jù)初始粒子適應(yīng)度值尋找個體極值和群體極值。
%% 個體極值和群體極值 [bestfitness, bestindex] = max(fitness); zbest = pop(bestindex, :); % 全局最佳 gbest = pop; % 個體最佳 fitnessgbest = fitness; % 個體最佳適應(yīng)度值 fitnesszbest = bestfitness; % 全局最佳適應(yīng)度值4、迭代尋優(yōu)
根據(jù)式(1)與式(2)更新粒子位置和速度,并且根據(jù)新粒子的適應(yīng)度值更新個體極值和群體極值。程序代碼如下:
%% 迭代尋優(yōu) for i=1:maxgen% 粒子位置和速度更新for j=1:sizepop% 速度更新V(j,:) = V(j,:) + c1*rand*(gbest(j, :) - pop(j, :)) + c2*rand*(zbest - pop(j, :));V(j, find(V(j, :) > Vmax)) = Vmax;V(j, find(V(j, :) < Vmin)) = Vmin;% 種群更新pop(j, :) = pop(j, :)+V(j, :);pop(j, find(pop(j, :) > popmax)) = popmax;pop(j, find(pop(j, :) < popmin)) = popmin;% 適應(yīng)度值fitness(j) = fun(pop(j, :)); end%% 個體和群體極值更新for j = 1:N% 個體最優(yōu)更新if fitness(j) < fitnesspbest(j)pbest(j, :) = X(j, :);fitnesspbest(j) = fitness(j);end% 群體最優(yōu)更新if fitnesspbest(j) > fitnessgbestgbest = pbest(j, :);fitnessgbest = fitnesspbest(j);endend% 每代最優(yōu)值記錄到y(tǒng)y數(shù)組中yy(i) = fitnesszbest; end5、結(jié)果分析
PSO算法反復(fù)迭代300次,畫出每代最優(yōu)個體適應(yīng)度值變化圖象。程序代碼如下:
%% 畫出每代個體最優(yōu)適應(yīng)度值 disp(['最優(yōu)位置:', num2str(zbest)]); disp(['最優(yōu)極值:', num2str(fitnesszbest)]); plot(yy) title('最優(yōu)個體適應(yīng)度', 'fontsize', 12); xlabel('進(jìn)化代數(shù)', 'fontsize', 12); ylabel('適應(yīng)度', 'fontsize', 12);Command Window中顯示的結(jié)果為:
最優(yōu)位置:-0.00015399 -0.00068763 最優(yōu)極值:1.0054最優(yōu)個體適應(yīng)度值變化如圖3所示。
最終得到的最優(yōu)個體適應(yīng)度值為1.0054,對應(yīng)的粒子位置為(-0.00015399,-0.00068763),PSO算法尋優(yōu)得到最優(yōu)值接近函數(shù)實(shí)際最優(yōu)值,說明PSO算法具有較強(qiáng)的函數(shù)極值尋優(yōu)能力。
四、慣性權(quán)重
1、慣性權(quán)重的選擇
慣性權(quán)重ω\omegaω體現(xiàn)的是粒子繼承先前的速度的能力,Shi.Y最先將慣性權(quán)重ω\omegaω引入PSO算法中,并分析指出一個較大的慣性權(quán)值有利于全局搜索,而一個較小的慣性權(quán)值則更利于局部搜索。為了更好地平衡算法的全局搜索與局部搜索的能力,Shi.Y提出了線性遞減慣性權(quán)重(Linear decreasing inertia weight,LDIW),即ω(k)=ωstart?(ωstart?ωend)(Tmax?k)/Tmax(4)\omega(k)=\omega_{start}-(\omega_{start}-\omega_{end})(T_{max}-k)/T_{max}\tag{4}ω(k)=ωstart??(ωstart??ωend?)(Tmax??k)/Tmax?(4)其中,ωstart\omega_{start}ωstart?為初始慣性權(quán)重;ωend\omega_{end}ωend?為迭代至最大迭代次數(shù)時的慣性權(quán)重;kkk為當(dāng)前迭代次數(shù);TmaxT_{max}Tmax?為最大迭代次數(shù)。一般來說,慣性權(quán)重ωstart=0.9,ωend=0.4\omega_{start}=0.9,\omega_{end}=0.4ωstart?=0.9,ωend?=0.4時算法性能最好。這樣,隨著迭代次數(shù)的增大,慣性權(quán)重由0.9線性遞減至0.4,迭代初期較大的慣性權(quán)重使得算法保持了較強(qiáng)的全局搜索能力,而迭代后期較小的慣性權(quán)重有利于算法進(jìn)行更精準(zhǔn)的局部搜尋。線性慣性權(quán)重只是一種經(jīng)驗做法,常用的慣性權(quán)重的選擇還包括以下幾種:ω(k)=ωstart?(ωstart?ωend)(kTmax)2(5)\omega(k)=\omega_{start}-(\omega_{start}-\omega_{end})(\frac{k}{T_{max}})^2\tag{5}ω(k)=ωstart??(ωstart??ωend?)(Tmax?k?)2(5)ω(k)=ωstart+(ωstart?ωend)[2kTmax?(kTmax)2](6)\omega(k)=\omega_{start}+(\omega_{start}-\omega_{end})[\frac{2k}{T_{max}}-(\frac{k}{T_{max}})^2]\tag{6}ω(k)=ωstart?+(ωstart??ωend?)[Tmax?2k??(Tmax?k?)2](6)ω(k)=ωend(ωstartωend)1/(1+ck/Tmax)(7)\omega(k)=\omega_{end}(\frac{\omega_{start}}{\omega_{end}})^{1/(1+ck/T_{max})}\tag{7}ω(k)=ωend?(ωend?ωstart??)1/(1+ck/Tmax?)(7)幾種ω\omegaω的動態(tài)變化如圖4所示。
2、ω\omegaω變化的算法性能分析
算法參數(shù)設(shè)置:種群規(guī)模20,進(jìn)化300代。每個實(shí)驗設(shè)置運(yùn)行100次,將100次的平均值作為最終結(jié)果。
在上述的參數(shù)設(shè)置下,運(yùn)用5種ω\omegaω取值方法對函數(shù)進(jìn)行求解,并比較所得解的平均值、失效次數(shù)和接近最優(yōu)值的次數(shù),來分析其收斂精度、收斂速度等性能。
每種ω\omegaω的算法進(jìn)化曲線如圖5所示。
本案例中,將距離最優(yōu)解1.0054誤差為0.01的解視為接近最優(yōu)解,將0.8477及更小的解視為陷入局部最優(yōu)解。
由圖5和表1可以看出,慣性權(quán)重ω\omegaω不變的粒子群優(yōu)化算法雖然具有較快的收斂速度,但其后期容易陷入局部最優(yōu),求解精度低;而幾種ω\omegaω動態(tài)變化的算法雖然在算法初期收斂稍慢,但在后期局部搜索能力強(qiáng),利于算法跳出局部最優(yōu)而求的最優(yōu)解,提高了算法的求解精度。
式(5)ω\omegaω動態(tài)變化方法,前期ω\omegaω變化較慢,取值較大,維持了算法的全局搜索能力;后期ω\omegaω變化較快,極大地提高了算法的局部搜索能力,從而取得了很好的求解效果。
五、參考文獻(xiàn)
[1] J. Kennedy, R. Eberhart. Particle swarm optimization[C]. Proceedings of ICNN’95 - International Conference on Neural Networks, 1995, 4: 1942-1948.
[2] 張選平, 杜玉平, 秦國強(qiáng), 等. 一種動態(tài)改變慣性權(quán)的自適應(yīng)粒子群算法[J]. 西安交通大學(xué)學(xué)報, 2005(10): 1039-1042.
[3] 郁磊, 史峰, 王輝, 等. MATLAB智能算法30個案例分析(第2版)[M]. 北京: 北京航空航天大學(xué)出版社, 2015.
總結(jié)
以上是生活随笔為你收集整理的基于粒子群优化算法的函数寻优算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Microsoft SQL Server
- 下一篇: 粒子群优化算法