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