1.概念理解
Boid(bird-bid)模型:
①沖突避免(collision avoidance):群體在一定空間移動拨黔,個體有自己的移動意志舔示,但不能影響其他個體移動,避免碰撞與爭執(zhí)算行。
②速度匹配(velocity matching):個體必須配合中心移動速度努释,不管在方向、距離與速率上都必須相互配合疫鹊。
③群體中心(flock centering):個體將會向群體中心移動袖瞻,配合群體中心向目標前進。
粒子群算法(particle swarm optimization,PSO)就是依托該模型尋找最優(yōu)值的拆吆。
群鳥覓食與人類決策的過程很相似聋迎。人在決策的時候通常會綜合兩種重要的信息:①自己的經(jīng)驗②別人的經(jīng)驗。同樣的锈拨,群鳥在覓食的時候砌庄,每只鳥一開始都不知道食物在哪里羹唠,但是通過群內(nèi)信息共享和個體覓食經(jīng)驗的積累奕枢,它們會自發(fā)聚集成一個群落,每只鳥能記住自己找到的最好位置佩微,稱為“局部最優(yōu)”缝彬,還能記住群鳥整個整體能找到的最好位置,稱為“全局最優(yōu)”哺眯,整個鳥群的覓食中心都趨向全局最優(yōu)移動谷浅,這在生物學上稱之為“同步效應”。
在群鳥覓食模型中奶卓,每個個體都可以被看成一個粒子一疯,則鳥群可以被看成一個粒子群。
2.算法實現(xiàn)步驟
①初始化粒子群(速度和位置)夺姑、慣性因子墩邀、加速常數(shù)、最大迭代次數(shù)和算法終止的最小允許誤差盏浙。
②計算每個粒子的初始適應值眉睹。
③找出個體和群體最優(yōu)值和對應的位置。
④更新每個粒子的速度和位置废膘,分別依據(jù)公式(8-1)竹海、(8-2)
⑤比較當前各粒子的適應值是否比歷史局部最優(yōu)值好,如果好丐黄,就更新粒子的局部最優(yōu)值和對應位置斋配。
⑥找出當前粒子群眾的全局最優(yōu)值和對應的位置。
⑦重復步驟4~6,直到滿足設定的最小誤差或達到最大迭代次數(shù)艰争。
⑧輸出粒子群全局最優(yōu)值和對應位置十偶,以及各粒子的局部最優(yōu)值和對應位置。
3.舉例
function main()
clc;clear all;close all;
tic; %程序運行計時
E0=0.001; %允許誤差
MaxNum=100; %粒子最大迭代次數(shù)
narvs=1; %目標函數(shù)的自變量個數(shù)
particlesize=30; %粒子群規(guī)模
c1=2; %每個粒子的個體學習因子园细,也稱為加速常數(shù)
c2=2; %每個粒子的社會學習因子惦积,也稱為加速常數(shù)
w=0.6; %慣性因子
vmax=0.8; %粒子的最大飛翔速度
x=-5+10*rand(particlesize,narvs);%粒子所在的位置
v=2*rand(particlesize,narvs); %粒子的飛翔速度
%目標函數(shù)是:y=1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2))
fitness=@(x)1/(1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2))); %定義適應度函數(shù)
for i=1:particlesize
for j=1:narvs
f(i)=fitness(x(i,j));
end
end
personalbest_x=x;
personalbest_faval=f;
[globalbest_faval, i]=min(personalbest_faval);
globalbest_x=personalbest_x(i,:);
k=1;
while k<=MaxNum
for i=1:particlesize
for j=1:narvs
f(i)=fitness(x(i,j));
end
if f(i)<personalbest_faval(i) %判斷當前位置是否是歷史上最佳位置
personalbest_faval(i)=f(i);
personalbest_x(i,:)=x(i,:);
end
end
[globalbest_faval, i]=min(personalbest_faval);
globalbest_x=personalbest_x(i,:);
for i=1:particlesize %更新粒子群里每個個體的最新位置
v(i,:)=w*v(i,:)+c1*rand*(personalbest_x(i,:)-x(i,:))...
+c2*rand*(globalbest_x-x(i,:));
for j=1:narvs %判斷粒子的飛翔速度是否超過了最大飛翔速度
if v(i,j)>vmax
v(i,j)=vmax;
elseif v(i,j)<-vmax
v(i,j)=-vmax;
end
end
x(i,:)=x(i,:)+v(i,:);
end
if abs(globalbest_faval)<E0,break,end
k=k+1;
end
Value1=1/globalbest_faval-1; Value1=num2str(Value1);
% strcat指令可以實現(xiàn)字符的組合輸出
disp(strcat('the maximum value','=',Value1));
% 輸出最大值所在的橫坐標位置
Value2=globalbest_x; Value2=num2str(Value2);
disp(strcat('the corresponding coordinate','=',Value2));
x=-5:0.01:5;
y=2.1*(1-x+2*x.^2).*exp(-x.^2/2);
plot(x,y,'m-','linewidth',3);
hold on;
plot(globalbest_x,1/globalbest_faval-1,'kp','linewidth',4);
legend('目標函數(shù)','搜索到的最大值');xlabel('x');ylabel('y');grid on;
toc; %和上面的tic配合計算程序運行時間
輸出
the maximum value=5.1985
the corresponding coordinate=-1.1617
歷時 3.184141 秒。