粒子群算法matlab代码实例使用与参数解读(二维数据)
粒子群算法與matlab代碼實(shí)例使用
- 粒子群算法介紹
- 粒子群算法使用場(chǎng)景
- 粒子群的優(yōu)缺點(diǎn)
- 實(shí)例編程分析
- 代碼分析
- 參數(shù)分析
- 更多應(yīng)用場(chǎng)景
在網(wǎng)絡(luò)中有很多的博客都已經(jīng)粒子群算法的算法本質(zhì)講解的非常清晰明了,但是經(jīng)本人在當(dāng)初實(shí)際編程和使用中發(fā)現(xiàn),對(duì)粒子群算法代碼的實(shí)際使用還是存在著調(diào)參不便,適應(yīng)度函數(shù)編輯不便等對(duì)新手較為不友好的現(xiàn)象,因此本文僅作于同樣是小白的各位同學(xué),以其達(dá)到交流學(xué)習(xí)的目的。
粒子群算法介紹
粒子群算法(也稱粒子群優(yōu)化算法(particle swarm optimization, PSO)),模擬鳥(niǎo)群隨機(jī)搜索食物的行為。粒子群算法中,每個(gè)優(yōu)化問(wèn)題的潛在解都是搜索空間中的一只鳥(niǎo),叫做“粒子”。所有的粒子都有一個(gè)由被優(yōu)化的函數(shù)決定的適應(yīng)值(fitness value),每個(gè)粒子還有一個(gè)速度決定它們“飛行”的方向和距離。
粒子群算法初始化為一群隨機(jī)的粒子(隨機(jī)解),然后根據(jù)迭代找到最優(yōu)解。每一次迭代中,粒子通過(guò)跟蹤兩個(gè)極值來(lái)更新自己:第1個(gè)是粒子本身所找到的最優(yōu)解,這個(gè)稱為個(gè)體極值;第2個(gè)是整個(gè)種群目前找到的最優(yōu)解,這個(gè)稱為全局極值。也可以不用整個(gè)種群,而是用其中的一部分作為粒子的鄰居,稱為局部極值。
通過(guò)形象化的理解可以理解成在高低不平的山脈上有一個(gè)最低點(diǎn)的谷底藏著豐富的食物,一群鳥(niǎo)禽隨機(jī)的分布在山脈的各個(gè)位置,所有鳥(niǎo)都不知道食物的方向,只知道據(jù)這些食物有多遠(yuǎn),只能隨機(jī)的進(jìn)行尋找和移動(dòng),好在他們之間可以相互通訊并交換自己在距離食物最近的位置,當(dāng)確認(rèn)距離食物最近的鳥(niǎo)的位置后,所有的鳥(niǎo)群都會(huì)朝著這個(gè)方向搜索,但是在搜索過(guò)程中會(huì)發(fā)現(xiàn)有別的鳥(niǎo)路過(guò)距離食物更近的位置,這個(gè)時(shí)候?yàn)榱俗尫较蚋訙?zhǔn)確,就對(duì)兩個(gè)位置進(jìn)行矢量相加,最后確定新的搜索方向。
粒子群算法使用場(chǎng)景
再將粒子群簡(jiǎn)化一下,將整個(gè)算法封裝成一個(gè)不知道的黑箱。
讓我們關(guān)注一下輸入和輸出:
輸入是一個(gè)關(guān)于因變量Y和自變量Xi(i=1,2,3…)的多元多次函數(shù),或者可以理解為一份地圖,或者一個(gè)下界的收斂曲線
而輸出是這個(gè)函數(shù)使得函數(shù)因變量值最小,即這份地圖或者曲線的最低點(diǎn)。
總而言之,粒子群算法是用于對(duì)一個(gè)有上界或者有下界的凸函數(shù)的最優(yōu)極值位置的定位函數(shù)。
粒子群的優(yōu)缺點(diǎn)
首先,粒子群算法的不需要大量調(diào)試參數(shù),也因此成為了廣大優(yōu)化算法中最為流行的幾種算法之一,其次粒子群算法是一種高效的并行搜索算法,有效的提高了算法復(fù)雜度,且其速度在實(shí)際操作中是優(yōu)于遺傳算法。
但是粒子群算法同樣具有不足,比如易于陷入局部最優(yōu)解,在后期收斂速度慢等問(wèn)題,需要具體場(chǎng)合進(jìn)行具體分析。
實(shí)例編程分析
假設(shè)我們已知加入水的量X與某化學(xué)試劑活性Y的關(guān)系函數(shù):
要求找到最合適的加水量X使得試劑活性Y最低
matlab代碼如下
clc; clear; close all;% 參數(shù)賦值 tic; E0=0.001; MaxNum=500; narvs=1; particlesize=100; c1=3; c2=2; w=0.6; vmax=0.8; x=8*rand(particlesize,narvs); v=10*rand(particlesize,narvs); fitness = @(x)exp(-x./3).*sin(3.*x); %定義適應(yīng)度函數(shù) f = zeros(1,particlesize); % 預(yù)分配 for i=1:particlesizefor j=1:narvsf(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<=MaxNumfor i=1:particlesizefor j=1:narvsf(i)=fitness(x(i,j));endif f(i)<personalbest_faval(i) personalbest_faval(i)=f(i);personalbest_x(i,:)=x(i,:);endend[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)>vmaxv(i,j)=vmax;elseif v(i,j)<-vmaxv(i,j)=-vmax;endendx(i,:)=x(i,:)+v(i,:);endif abs(globalbest_faval)<E0,break,endk=k+1; end Value1=globalbest_faval-1; Value1=num2str(Value1); disp(strcat('the min value','=',Value1)); %輸出最優(yōu)值所在的橫坐標(biāo)位置 Value2=globalbest_x; Value2=num2str(Value2); disp(strcat('the corresponding coordinate','=',Value2));x=0:pi/50:4*pi; y=exp(-x/3).*sin(3*x);plot(x,y,'r-','linewidth',3); hold on;x = str2num(Value2); y=exp(-x./3).*sin(3.*x);%定義適應(yīng)度函數(shù); plot( globalbest_x ,y,'kp','linewidth',4); legend('目標(biāo)函數(shù)','搜索到的最小值'); xlabel('x'); ylabel('y'); grid on; toc;運(yùn)行結(jié)果:
代碼分析
在使用代碼進(jìn)行修改完成實(shí)例的過(guò)程中需要注意修改以下代碼
fitness = @(x)exp(-x./3).*sin(3.*x); %定義適應(yīng)度函數(shù)這部分的代碼是定義需要進(jìn)行尋優(yōu),及是需要找到極值的函數(shù)
[globalbest_faval,i]=min(personalbest_faval);這里通過(guò)matlab自帶的min函數(shù)和max函數(shù)確定是進(jìn)行極大值尋優(yōu)還是極小值尋優(yōu)。
x=0:pi/50:4*pi; y=exp(-x/3).*sin(3*x);這部分代碼是根據(jù)自變量的范圍進(jìn)行曲線畫(huà)圖,在實(shí)際案例中,會(huì)出現(xiàn)自變量存在取值范圍的問(wèn)題,需要在代碼中具體考慮
x = str2num(Value2); y=exp(-x./3).*sin(3.*x);%定義適應(yīng)度函數(shù); plot( globalbest_x ,y,'kp','linewidth',4);這部分代碼中,str2num(Value2)是在之前算法中已經(jīng)找出的最有位置,及是使得試劑活性Y最低的加水量X,將它的值賦予x,并求取得到最低活性Y的值,在圖上通過(guò)黑色的五角星進(jìn)行標(biāo)記
參數(shù)分析
tic; %程序運(yùn)行計(jì)時(shí) E0=0.001; %允許誤差 MaxNum=500; %粒子最大迭代次數(shù) narvs=1; %目標(biāo)函數(shù)的自變量個(gè)數(shù) particlesize=100; %粒子群規(guī)模 c1=3; %每個(gè)粒子的個(gè)體學(xué)習(xí)因子,也稱為加速常數(shù) c2=2; %每個(gè)粒子的社會(huì)學(xué)習(xí)因子,也稱為加速常數(shù) w=0.6; %慣性因子 vmax=0.8; %粒子的最大飛翔速度 x=8*rand(particlesize,narvs); %粒子所在的位置 v=10*rand(particlesize,narvs); %粒子的飛翔速度在以上代碼參數(shù)中,需要重點(diǎn)注意的是慣性因子w,粒子所在位置x,以及粒子的飛翔速度v。當(dāng)尋優(yōu)結(jié)果陷入局部最優(yōu)值時(shí),可以調(diào)整這三個(gè)參數(shù)以實(shí)現(xiàn)找到全局最優(yōu)值
其中粒子的最大迭代次數(shù)MaxNum可以據(jù)適應(yīng)度函數(shù)的復(fù)雜度進(jìn)行增加或減少以優(yōu)化運(yùn)行時(shí)間。
需要注意的是當(dāng)適應(yīng)度函數(shù)變?yōu)槎鄠€(gè)自變量時(shí),除了在默認(rèn)參數(shù)的部分對(duì)narvs參數(shù)值進(jìn)行修改,在后面的運(yùn)算代碼同樣需要進(jìn)行修正。
如果只是單純的使用和同緯度數(shù)據(jù)實(shí)例求解,修改以上代碼可以達(dá)成目標(biāo)。但是還是有很多情況下有多個(gè)自變量,在自變量較少的情況下該算法同樣可以達(dá)到目標(biāo),當(dāng)自變量個(gè)數(shù)過(guò)多的情況下可以通過(guò)結(jié)合主成分分析等降維算法進(jìn)行尋優(yōu)。
更多應(yīng)用場(chǎng)景
受時(shí)間與篇幅影響,多維的和改進(jìn)的代碼就不在細(xì)講如果想進(jìn)行更多的交流和溝通,或者了解多個(gè)自變量的粒子群算法代碼與相關(guān)知識(shí),可以關(guān)注我建立的公眾號(hào)“狗頭的成長(zhǎng)日記”
總結(jié)
以上是生活随笔為你收集整理的粒子群算法matlab代码实例使用与参数解读(二维数据)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 人人都是产品经理之用Axure制作微信主
- 下一篇: 如何把一组计算机做成云,怎样才能把旧电脑