1 算法介紹
粒子群優(yōu)化算法(Particle Swarm Optimization,PSO)是一種經(jīng)典的群智能算法,該算法靈感源自于鳥類飛行和覓食的社會活動,鳥群通過個體之間的信息交互來尋找全局最優(yōu)點。PSO算法具有原理簡單、較少的參數(shù)設置和容易實現(xiàn)等優(yōu)點,因此近年來受到學者們的廣泛關(guān)注和研究。
粒子群算法模擬鳥群的捕食過程,將待優(yōu)化問題看作是捕食的鳥群,解空間看作是鳥群的飛行空間,空間的每只鳥的位置即是粒子群算法在解空間的一個粒子,也就是待優(yōu)化問題的一個解。
粒子群算法有以下幾點假設:
-
粒子被假定為沒有體積沒有質(zhì)量,本身的屬性只有速度和位置。
-
每個粒子在解空間中運動,它通過速度改變其方向和位置。
-
通常粒子將追蹤當前的最優(yōu)粒子以經(jīng)過最少代數(shù)的搜索到最優(yōu)解。
在算法的進化過程中,粒子一直都跟蹤兩個極值:一個是到個體歷史最優(yōu)位置,一個是種群歷史最優(yōu)位置。
2 算法模型
粒子群算法的核心思想是利用群體中的個體對信息的共享,從而使整個群體的運動在問題求解空間中產(chǎn)生從無序到有序的演化過程,從而獲得問題的最優(yōu)解。
粒子群算法的個體位置變化按兩個基本公式:
v i d t + 1 = ω v i d t + c 1 r 1 ( p i d t ? x i d t ) + c 2 r 2 ( p g d t ? x i d t ) x i d t + 1 = x i d t + v i d t + 1 \begin{aligned} v_{i d}^{t+1} &=\omega v_{i d}^{t}+c_{1} r_{1}\left(p_{i d}^{t}-x_{i d}^{t}\right)+c_{2} r_{2}\left(p_{g d}^{t}-x_{i d}^{t}\right) \\ x_{i d}^{t+1} &=x_{i d}^{t}+v_{i d}^{t+1} \end{aligned} vidt+1?xidt+1??=ωvidt?+c1?r1?(pidt??xidt?)+c2?r2?(pgdt??xidt?)=xidt?+vidt+1??
式中,r1和r2是介于(0,1)之間的隨機數(shù),c1和c2代表學習因子,取值一般為c1=c2=2。
根據(jù)速度更新公式可知,粒子的速度由三個部分構(gòu)成:第一部分是對粒子之前速度的繼承,體現(xiàn)了粒子運動的慣性;第二部分是自我認知,表示粒子自身之前的飛行經(jīng)驗對之后飛行方向的影響;第三部分是社會認知,表示種群中所有粒子的飛行經(jīng)驗對每個粒子之后飛行方向的影響。
3 實現(xiàn)步驟
Step1:初始化種群:包括搜索空間的上限和下限,兩個學習因子c1,c2,算法的最大迭代次數(shù)T,每個粒子速度的上限和下限。隨機初始化種群中每個粒子的位置和速度.
Step2:根據(jù)適應度函數(shù)計算每個粒子的適應值fitness,保存每個粒子的最優(yōu)位置,保存?zhèn)€體最佳適應度值和群體迄今的最好位置.
Step3:根據(jù)速度、位置更新公式來更新速度和位置.
Step4:計算更新后每個粒子的適應度值,將每個粒子的最佳適應度值與其歷史最優(yōu)位置時的適應度值比較,如果較好,則將其當前的位置作為該粒子的最優(yōu)位置.
Step5:對每個粒子,將它的最優(yōu)位置對應的適應度值與種群最佳適應度值對比,如果更優(yōu),則更新種群最優(yōu)位置和最佳適應度值.
Step6:判斷搜索到的結(jié)果是否滿足停止條件(達到最大迭代次數(shù)或滿足精度要求),若滿足停止條件則輸出最優(yōu)值,否則轉(zhuǎn)到Step3繼續(xù)運行直到滿足條件為止.
4 MATLAB代碼實現(xiàn)PSO算法
優(yōu)化問題:求解函數(shù)最小值。
F = ∑ i = 1 D x i 2 F=\sum_{i=1}^{D} x_{i}^{2} F=i=1∑D?xi2?
4.1. main.m
復制以下代碼,粘貼到MATLAB,可直接運行出結(jié)果文章來源:http://www.zghlxwxcb.cn/news/detail-401788.html
% 主程序 PSO
clear
close all
clc
SearchAgents_no = 30 ; % 種群規(guī)模
dim = 10 ; % 粒子維度
Max_iter = 1000 ; % 迭代次數(shù)
ub = 5 ;
lb = -5 ;
c1 = 1.5 ; % 學習因子1
c2 = 1.5 ; % 學習因子2
w = 0.8 ; % 慣性權(quán)重
vmax = 3 ; % 最大飛行速度
pos = lb + rand(SearchAgents_no,dim).*(ub-lb) ; % 初始化粒子群的位置
v = - vmax +2*vmax* rand(SearchAgents_no,dim) ; % 初始化粒子群的速度
% 初始化每個歷史最優(yōu)粒子
pBest = pos ;
pbestfit = zeros(SearchAgents_no,1);
for i = 1:SearchAgents_no
pbestfit(i) = sum(pos(i,:).^2) ;
end
%初始化全局歷史最優(yōu)粒子
[gBestfit,index] = min(pbestfit) ;
gBest = pos(index,:) ;
Convergence_curve = zeros(Max_iter,1);
for t=1:Max_iter
for i=1:SearchAgents_no
% 更新個體的位置和速度
v(i,:) = w*v(i,:)+c1*rand*(pBest(i,:)-pos(i,:))+c2*rand*(gBest-pos(i,:)) ;
pos(i,:) = pos(i,:)+v(i,:) ;
% 邊界處理
v(i,:) = min(v(i,:), vmax);
v(i,:) = max(v(i,:), -vmax);
pos(i,:) =min(pos(i,:), ub);
pos(i,:) =max(pos(i,:), lb);
% 更新個體最優(yōu)
f1 = sum(pos(i,:).^2);
if f1<pbestfit(i)
pBest(i,:) = pos(i,:) ;
pbestfit(i) = f1;
end
% 更新全局最優(yōu)
if pbestfit(i) < gBestfit
gBest = pBest(i,:) ;
gBestfit = pbestfit(i) ;
end
end
% 每代最優(yōu)解對應的目標函數(shù)值
Convergence_curve(t) = gBestfit;
disp(['Iteration = ' num2str(t) ', Evaluations = ' num2str(gBestfit)]);
end
figure('unit','normalize','Position',[0.3,0.35,0.4,0.35],'color',[1 1 1],'toolbar','none')
subplot(1,2,1);
x = -5:0.1:5;y=x;
L=length(x);
f=zeros(L,L);
for i=1:L
for j=1:L
f(i,j) = x(i)^2+y(j)^2;
end
end
surfc(x,y,f,'LineStyle','none');
xlabel('x_1');
ylabel('x_2');
zlabel('F')
title('Objective space')
subplot(1,2,2);
semilogy(Convergence_curve,'Color','r','linewidth',1.5)
title('Convergence_curve')
xlabel('Iteration');
ylabel('Best score obtained so far');
axis tight
grid on
box on
legend('PSO')
display(['The best solution obtained by PSO is : ', num2str(gBest)]);
display(['The best optimal value of the objective funciton found by PSO is : ', num2str(gBestfit)]);
4.2. 運行結(jié)果
文章來源地址http://www.zghlxwxcb.cn/news/detail-401788.html
The best solution obtained by PSO is : -5.9693e-08 4.4549e-07 -1.8445e-08 -1.4353e-07 -2.0883e-07 -2.622e-08 2.743e-08 -1.0503e-08 -7.5957e-08 -6.4972e-07
The best optimal value of the objective funciton found by PSO is : 6.9603e-13
>>
到了這里,關(guān)于粒子群優(yōu)化算法(PSO)附代碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!