姓名:王巖星蜓谋;學(xué)號(hào):20021210896锋八;學(xué)院:電子工程學(xué)院
轉(zhuǎn)自:https://wenku.baidu.com/view/65c600b9294ac850ad02de80d4d8d15abe230048.html
題目:優(yōu)化算法之粒子群算法
【嵌牛導(dǎo)讀】粒子群優(yōu)化算法(PSO:Particle swarm optimization) 是一種進(jìn)化計(jì)算技術(shù)(evolutionary computation)。
【嵌牛提問】什么是粒子群算法莉给?它的特點(diǎn)是什么吗垮?
【嵌牛鼻子】粒子群(PSO)
【嵌牛正文】
一.粒子群算法的概念
????????粒子群優(yōu)化算法(PSO:Particle swarm optimization) 是一種進(jìn)化計(jì)算技術(shù)(evolutionary computation)。源于對(duì)鳥群捕食的行為研究残腌。粒子群優(yōu)化算法的基本思想:是通過群體中個(gè)體之間的協(xié)作和信息共享來尋找最優(yōu)解.
??PSO的優(yōu)勢(shì):在于簡(jiǎn)單容易實(shí)現(xiàn)并且沒有許多參數(shù)的調(diào)節(jié)。目前已被廣泛應(yīng)用于函數(shù)優(yōu)化贫导、神經(jīng)網(wǎng)絡(luò)訓(xùn)練抛猫、模糊系統(tǒng)控制以及其他遺傳算法的應(yīng)用領(lǐng)域。
二. 粒子群算法分析
1孩灯、基本思想
??粒子群算法通過設(shè)計(jì)一種無質(zhì)量的粒子來模擬鳥群中的鳥闺金,粒子僅具有兩個(gè)屬性:速度和位置,速度代表移動(dòng)的快慢峰档,位置代表移動(dòng)的方向败匹。每個(gè)粒子在搜索空間中單獨(dú)的搜尋最優(yōu)解,并將其記為當(dāng)前個(gè)體極值讥巡,并將個(gè)體極值與整個(gè)粒子群里的其他粒子共享掀亩,找到最優(yōu)的那個(gè)個(gè)體極值作為整個(gè)粒子群的當(dāng)前全局最優(yōu)解,粒子群中的所有粒子根據(jù)自己找到的當(dāng)前個(gè)體極值和整個(gè)粒子群共享的當(dāng)前全局最優(yōu)解來調(diào)整自己的速度和位置欢顷。下面的動(dòng)圖很形象地展示了PSO算法的過程:
2槽棍、更新規(guī)則
????????PSO初始化為一群隨機(jī)粒子(隨機(jī)解)。然后通過迭代找到最優(yōu)解抬驴。在每一次的迭代中炼七,粒子通過跟蹤兩個(gè)“極值”(pbest,gbest)來更新自己怎爵。在找到這兩個(gè)最優(yōu)值后特石,粒子通過下面的公式來更新自己的速度和位置。
公式(1)的第一部分稱為【記憶項(xiàng)】鳖链,表示上次速度大小和方向的影響;公式(1)的第二部分稱為【自身認(rèn)知項(xiàng)】墩莫,是從當(dāng)前點(diǎn)指向粒子自身最好點(diǎn)的一個(gè)矢量芙委,表示粒子的動(dòng)作來源于自己經(jīng)驗(yàn)的部分;公式(1)的第三部分稱為【群體認(rèn)知項(xiàng)】狂秦,是一個(gè)從當(dāng)前點(diǎn)指向種群最好點(diǎn)的矢量灌侣,反映了粒子間的協(xié)同合作和知識(shí)共享。粒子就是通過自己的經(jīng)驗(yàn)和同伴中最好的經(jīng)驗(yàn)來決定下一步的運(yùn)動(dòng)裂问。以上面兩個(gè)公式為基礎(chǔ)侧啼,形成了PSO的標(biāo)準(zhǔn)形式牛柒。
公式(2)和 公式(3)被視為標(biāo)準(zhǔn)PSO算法。
3痊乾、PSO算法的流程和偽代碼
4皮壁、PSO算法舉例
5、PSO算法matlab實(shí)現(xiàn)
clc
clear
close all
E=0.000001;
maxnum=800;%最大迭代次數(shù)
narvs=2;%目標(biāo)函數(shù)的自變量個(gè)數(shù)
particlesize=50;%粒子群規(guī)模
c1=2;%每個(gè)粒子的個(gè)體學(xué)習(xí)因子哪审,加速度常數(shù)
c2=2;%每個(gè)粒子的社會(huì)學(xué)習(xí)因子蛾魄,加速度常數(shù)
w=0.6;%慣性因子
vmax=5;%粒子的最大飛翔速度
v=2*rand(particlesize,narvs);%粒子飛翔速度
x=-300+600*rand(particlesize,narvs);%粒子所在位置
%定義適應(yīng)度函數(shù)
fitness=inline('(x(1)^2+x(2)^2)/10000','x');
for i=1:particlesize
f(i)=fitness(x(i,:));
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
f(i)=fitness(x(i,:));
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
? ? ff(k)=globalbest_faval;
? ? if globalbest_faval<E
? ? ? ? break
? ? end
%? ? ? figure(1)
%? ? ? for i= 1:particlesize
%? ? ? plot(x(i,1),x(i,2),'*')
%? ? ? end
k=k+1;
end
xbest=globalbest_x;
figure(2)
set(gcf,'color','white');
plot(1:length(ff),ff)