[Matlab科学计算] 粒子群优化算法原理和简单应用
1. 簡介
? ? ? ?粒子群優(yōu)化算法(PSO)是一種基于群體智能的進(jìn)化計(jì)算技術(shù),其思想來源于人工生命和進(jìn)化計(jì)算理論,最早在1995年由美國的Kennedy教授和Eberhart教授受鳥群覓食行為的啟發(fā)提出的。它同遺傳算法類似,通過個(gè)體間的協(xié)作和競爭實(shí)現(xiàn)全局搜索。系統(tǒng)初始化為一組隨機(jī)解,稱之為粒子。通過粒子在搜索空間的飛行完成尋優(yōu),,它沒有遺傳算法的交叉以及變異算子,而是粒子在解空間追隨最優(yōu)的粒子進(jìn)行搜索。粒子群算法采用實(shí)數(shù)求解,并且需要調(diào)整的參數(shù)較少,易于實(shí)現(xiàn),是一種通用的全局搜索算法。
2. 算法原理
? ? ? ?在粒子群優(yōu)化算法中,每個(gè)優(yōu)化問題的潛在解都可以想象成n維搜索空間上的一個(gè)點(diǎn),稱之為“粒子”。粒子在搜索空間中以一定的速度飛行,這個(gè)速度是根據(jù)自身的飛行經(jīng)驗(yàn)和同伴的飛行經(jīng)驗(yàn)來動(dòng)態(tài)調(diào)整的,所有的粒子都有一個(gè)被目標(biāo)函數(shù)決定的適應(yīng)度值,并且知道自己到目前為止發(fā)現(xiàn)的最好位置和當(dāng)前位置,這個(gè)可以看做是粒子自己的飛行經(jīng)驗(yàn),然后每個(gè)粒子還知道目前為止整個(gè)群體中所有粒子發(fā)現(xiàn)的最好位置,這個(gè)可以看做是粒子的同伴的飛行經(jīng)驗(yàn)。
? ? ? 每個(gè)粒子使用下列信息改變自己的當(dāng)前位置:
? ? ? ?粒子群中粒子的初始位置是在搜索區(qū)域內(nèi)隨機(jī)產(chǎn)生,每個(gè)粒子群的初始速度也是隨機(jī)給定的,在搜索的過程中,粒子群和每個(gè)粒子所經(jīng)歷的最好位置及相應(yīng)的適應(yīng)度值分別被記憶下來。粒子群優(yōu)化算法最基本的概念在于加速每個(gè)粒子朝它自己所經(jīng)歷的和群體所經(jīng)歷的最好位置移動(dòng)。
? ? ? ?基本粒子群優(yōu)化算法中,粒子群有m個(gè)粒子組成,每個(gè)粒子的位置代表優(yōu)化問題在n維搜索空間中的潛在解。粒子根據(jù)如下3條原則來更新自身狀態(tài):1)保持自身慣性;2)按自身的最優(yōu)位置來改變狀態(tài);3)按群體的最優(yōu)位置來改變狀態(tài)。
? ? ? ?假設(shè)在一個(gè)n維的搜索空間中,由m個(gè)粒子組成的種群,其中第i個(gè)粒子位置為,其速度為。它的個(gè)體極值為,種群的全局極值為。粒子找到上述兩個(gè)極值后,就根據(jù)下面的公式來更新自己的速度和位置:
其中,稱為學(xué)習(xí)因子或者加速常數(shù),是介于(0,1)之間的隨機(jī)數(shù),分別是粒子i在第k次迭代中第d維的速度和位置,是粒子i在第d維的個(gè)體極值的位置,是群體在第d維的全局極值的位置。調(diào)節(jié)粒子飛向自身最好位置方向的步長,調(diào)節(jié)粒子向全局最好位置飛行的步長。為了減少在優(yōu)化過程中粒子離開搜索空間,或者通常限定于一定范圍內(nèi)。
3. 算法流程
算法流程圖如下所示
4. 應(yīng)用舉例-求解非線性函數(shù)的最大值(取之于網(wǎng)上,抱歉記不得網(wǎng)址了)
clc;clear all; close all; tic; % 程序運(yùn)行計(jì)時(shí) E0 = 0.001; % 允許誤差 MaxNum = 100; % 粒子最大迭代次數(shù) narvs = 1; % 目標(biāo)函數(shù)的自變量個(gè)數(shù) particlesize = 30; % 粒子群規(guī)模 c1 = 2; % 個(gè)體經(jīng)驗(yàn)學(xué)習(xí)因子 c2 = 2; % 社會(huì)經(jīng)驗(yàn)學(xué)習(xí)因子 w =0.6; % 慣性因子 vmax = 0.8; % 粒子的最大飛翔速度 x = -5 + 10 * rand(particlesize, narvs);% 粒子所在的位置 (rand產(chǎn)生的大小為0,1),規(guī)模是 粒子群數(shù)和參數(shù)需求數(shù) 設(shè)置了x的取值范圍[-5,5] v = 2*rand(particlesize,narvs); % 粒子的飛翔速度 生成每個(gè)粒子的飛翔速度,由于是只有一個(gè)變量,所以速度是一維的 %定義函數(shù) fitness = @(x)1/(1+(2.1*(1 - x + 2 * x.^2).*exp(-x.^2/2))); for i= 1:particlesizef(i) = fitness(x(i,1)); end % 完成了對每一個(gè)粒子,在各自位置上的適應(yīng)值 % 粒子開始學(xué)習(xí) personalbest_x=x; % 用于存儲(chǔ)對于每一個(gè)粒子最佳經(jīng)歷點(diǎn)的x值 personalbest_faval=f; % 同時(shí)存儲(chǔ)對于每一個(gè)粒子的最佳經(jīng)歷點(diǎn)的數(shù)值,用于更改 [globalbest_faval,i] = min(personalbest_faval); % min函數(shù)返回的第一個(gè)是最小值,還有一個(gè)就是最小值的下標(biāo),這里就是告訴了是在哪個(gè)粒子上 globalbest_x = personalbest_x(i,:); % 這個(gè)是必定是全局最優(yōu)點(diǎn)的位置 k = 1; % 開始迭代計(jì)數(shù) while k <= MaxNum % 當(dāng)?shù)螖?shù)達(dá)到設(shè)定的最大值的時(shí)候,就不要再進(jìn)行迭代了for i = 1:particlesize % 對于每一個(gè)粒子f(i) = fitness(x(i,1)); % 得到每個(gè)粒子的當(dāng)前位置 在函數(shù)上的適應(yīng)值 if f(i) < personalbest_faval(i) % 如果這個(gè)值是小于個(gè)人最優(yōu)解的位置的時(shí)候,就更新,我們經(jīng)過轉(zhuǎn)換,所以只用考慮求最小值的情況personalbest_faval(i) = f(i); % 將第i個(gè)粒子的個(gè)人最優(yōu)解設(shè)置為personalbest_x(i,:) = x(i,:); % 同時(shí)更改最有地址的位置endend [globalbest_faval,i] = min(personalbest_faval); globalbest_x = personalbest_x(i,:); % 更新全局 全局信息由個(gè)體信息描述組成for i = 1:particlesizev(i,:) = w*v(i,:) + c1*rand*(personalbest_x(i,:) - x(i,:)) + c2*rand*(globalbest_x -x(i,:)); % 由個(gè)人和全局的最佳信息數(shù)據(jù)進(jìn)行更新移動(dòng)速度% 上面中rand會(huì)隨機(jī)生成一個(gè)rand(0,1)然后會(huì)隨機(jī)的降低學(xué)習(xí)因子的比例for j = 1:narvs % 這個(gè)個(gè)循環(huán)確定了每個(gè)自變量上的速度,有沒有超過對應(yīng)的最大值if v(i,j) > vmaxv(i,j) = vmax;elseif v(i,j) < -vmaxv(i,j) = -vmax;endend x(i,:) = x(i,:) + v(i,:); % 通過速度更新位置endif abs(globalbest_faval) < E0,break,end k = k + 1; end Value1 = 1/globalbest_faval - 1; % 還記得上面做了一個(gè)加1,求倒數(shù)的操作么? Value1 = num2str(Value1); disp(strcat('the maximum value',' = ', Value1)); % 主要是在這進(jìn)行了展示 Value2 = globalbest_x; % 得到了全局最優(yōu)解的位置 Value2 = num2str(Value2); disp(strcat('the maximum x = ', Value2));% 繪圖 x = -5:0.01:5; y = 2.1*(1 - x + 2 * x.^2).*exp(-x.^2/2); plot(x,y,'m','linewidth',3); % m表示的是粉紅色,-是表示的是連續(xù)的曲線線 hold on; plot(globalbest_x, 1/globalbest_faval-1,'kp','linewidth',4); legend('目標(biāo)函數(shù)','搜索到的最大值'); xlabel('x'); % 給x軸貼標(biāo)簽 ylabel('y'); % 給y軸貼標(biāo)簽程序運(yùn)行結(jié)果如上圖所示,求得最大值和最大值位置為:the maximum value =5.1985? ? ? ? the maximum x =-1.1617
?
總結(jié)
以上是生活随笔為你收集整理的[Matlab科学计算] 粒子群优化算法原理和简单应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2013计算机系统导论,【精选】2013
- 下一篇: 推荐20款基于 jQuery CSS