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