【控制】粒子群优化(PSO,Particle Swarm Optimization)算法及 Matlab 仿真实现
文章目錄
- 定義
- 對比模擬捕食
- 通俗解釋
- 粒子抽象
- 關于速度和位置
- 速度和位置的更新
- 標準PSO算法流程
- 標準PSO算法的流程
- PSO流程圖解
- 學習因子 c1、c2c_1、c_2c1?、c2? 分析
- 仿真(Matlab)
- 仿真1
- 仿真2
- Ref.
定義
粒子群優化算法(Particle Swarm optimization,PSO)又翻譯為粒子群算法、微粒群算法、或微粒群優化算法。是通過模擬鳥群覓食行為而發展起來的一種基于群體協作的隨機搜索算法。通常認為它是群集智能 (Swarm intelligence, SI) 的一種。它可以被納入多主體優化系統(Multiagent Optimization System, MAOS)。粒子群優化算法是由Eberhart博士和kennedy博士發明。
對比模擬捕食
PSO模擬鳥群的捕食行為。一群鳥在隨機搜索食物,在這個區域里只有一塊食物。所有的鳥都不知道食物在那里。但是他們知道當前的位置離食物還有多遠。那么找到食物的最優策略是什么呢。最簡單有效的就是搜尋離食物最近的鳥的周圍區域。
PSO從這種模型中得到啟示并用于解決優化問題。PSO中,每個優化問題的解都是搜索空間中的一只鳥。我們稱之為“粒子”。所有的粒子都有一個由被優化的函數決定的適應值(fitnessvalue),每個粒子還有一個速度決定他們飛翔的方向和距離。然后粒子們就追隨當前的最優粒子在解空間中搜索。
PSO初始化為一群隨機粒子(隨機解),然后通過迭代找到最優解,在每一次迭代中,粒子通過跟蹤兩個“極值”來更新自己。第一個就是粒子本身所找到的最優解,這個解叫做個體極值 pbestp^{best}pbest,另一個極值是整個種群找到的最優解,這個極值是全局極值 gbestg^{best}gbest。另外也可以不用整個種群而只是用其中一部分最優粒子的鄰居,那么在所有鄰居中的極值就是局部極值。
通俗解釋
粒子群算法的基本思想是通過群體中個體之間的協作和信息共享來尋找最優解。如上的情景。試著想一下一群鳥在尋找食物,在這個區域中只有一只蟲子,所有的鳥都不知道食物在哪。但是它們知道自己的當前位置距離食物有多遠,同時它們知道離食物最近的鳥的位置。想一下這時候會發生什么?
同時各只鳥在位置不停變化時候離食物的距離也不斷變化,所以每個鳥一定有過離食物最近的位置,這也是它們的一個參考。
粒子抽象
關于速度和位置
粒子群算法通過設計一種無質量的粒子來模擬鳥群中的鳥,粒子僅具有兩個屬性:速度 vvv 和位置 ppp,速度代表移動的快慢,位置代表移動的方向。
鳥被抽象為沒有質量和體積的微粒(點),并延伸到 NNN 維空間,粒子 iii 在 NNN 維空間的位置表示為矢量 Xi=(x1,x2,?,xN)X_i=(x_1,x_2,\cdots,x_N)Xi?=(x1?,x2?,?,xN?),飛行速度表示為矢量 Vi=(v1,v2,?,vN)V_i=(v_1,v_2,\cdots,v_N)Vi?=(v1?,v2?,?,vN?)。每個粒子都有一個由目標函數決定的適應值(fitness value),并且知道自己到目前為止發現的最好位置( pbestp^{best}pbest )和現在的位置 XiX_iXi?。這個可以看作是粒子自己的飛行經驗。除此之外,每個粒子還知道到目前為止整個群體中所有粒子發現的最好位置(gbestg^{best}gbest)(gbestg^{best}gbest 是 pbestp^{best}pbest 中的最好值),這個可以看作是粒子同伴的經驗。粒子就是通過自己的經驗和同伴中最好的經驗來決定下一步的運動。
已知條件包括:
速度和位置的更新
PSO初始化為一群隨機粒子(隨機解)。然后通過迭代找到最優解。在每一次的迭代中,粒子通過跟蹤兩個“極值”(pbest,gbest)來更新自己。在找到這兩個最優值后,粒子通過下面的公式來更新自己的速度和位置。
速度更新公式:
Vi=Vi?記憶項+c1?rand()?(pbest?Xi)?自身認知項+c2?rand()?(gbest?Xi)?群體認知項(1)V_i = \underbrace{\red{V_i}}_{記憶項} + \underbrace{\green{c_1 * \text{rand}() * (p^{best} - X_i)}}_{自身認知項} + \underbrace{\blue{c_2 * \text{rand}() * (g^{best} - X_i)}}_{群體認知項} \tag{1}Vi?=記憶項Vi???+自身認知項c1??rand()?(pbest?Xi?)??+群體認知項c2??rand()?(gbest?Xi?)??(1)
ViV_iVi?: 粒子 iii 的速度;
rand()\text{rand}()rand(): 介于 (0,1) 之間的隨機數;
XiX_iXi?: 粒子 iii 的位置;
c1,c2c_1, c_2c1?,c2?: 學習因子,通常 c1=c2=2c_1 = c_2 = 2c1?=c2?=2;
VmaxV_{max}Vmax?: 為ViV_iVi? 的最大值(>0),如果 Vi>VmaxV_i > V_{max}Vi?>Vmax?,則 Vi=VmaxV_i = V_{max}Vi?=Vmax?。
位置更新公式:
Xi=Xi+Vi(2)X_i = X_i + V_i \tag{2}Xi?=Xi?+Vi?(2)
上述公式(1)(2)為 PSO 的標準形式。
以上面兩個公式為基礎,再來看一個公式:
Vi=ω?Vi+c1?rand()?(pbest?Xi)+c2?rand()?(gbest?Xi)(3)V_i = \omega * \red{V_i} + \green{c_1 * \text{rand}() * (p^{best} - X_i)} + \blue{c_2 * \text{rand}() * (g^{best} - X_i)} \tag{3}Vi?=ω?Vi?+c1??rand()?(pbest?Xi?)+c2??rand()?(gbest?Xi?)(3)
ω\omegaω: 慣性因子,值為非負 (≥0\ge0≥0)。
其值較大,則全局尋優能力強,局部尋優能力弱;
其值較小,則全局尋優能力弱,局部尋優能力強。
動態 ω\omegaω 能獲得比固定值更好的尋優效果。動態 ω\omegaω 可在 PSO 搜索過程中線性變化,也可以根據 PSO 性能的某個測度函數動態改變。
目前采用較多的線性遞減權值(Linearly Decreasing Weight, LDW)策略。
ω(t)=(ωini?ωgnd)(Gk?g)/Gk+ωgnd\omega^{(t)} = (\omega_{ini} - \omega_{gnd}) (G_k - g) / G_k + \omega_{gnd}ω(t)=(ωini??ωgnd?)(Gk??g)/Gk?+ωgnd?
GkG_kGk?: 最大迭代次數;
ωini\omega_{ini}ωini?: 初始慣性權值;
ωgnd\omega_{gnd}ωgnd?: 迭代至最大進化代數時的慣性權值
典型權值:ωini=0.9,ωgnd=0.4\omega_{ini} = 0.9, \omega_{gnd} = 0.4ωini?=0.9,ωgnd?=0.4。
ω\omegaω 的引入,使 PSO 算法性能有了很大的提高,針對不同的搜索問題,可以調整全局和局部搜索能力,也使 PSO 算法有成功地應用于很多實際問題。
公式(2)和 公式(3)被視為標準PSO算法。
標準PSO算法流程
標準PSO算法的流程
1)初始化一群微粒(群體規模為 NNN ),包括隨機位置和速度;
2)評價每個微粒的適應度;
3)對每個微粒,將其適應值與其經過的最好位置 pbestp^{best}pbest作比較,如果較好,則將其作為當前的最好位置 pbestp^{best}pbest;
4)對每個微粒,將其適應值與其經過的最好位置 gbestg^{best}gbest 作比較,如果較好,則將其作為當前的最好位置 gbestg^{best}gbest;
5)根據公式(2)、(3)調整微粒速度和位置;
6)未達到結束條件則轉第2)步。
迭代終止條件根據具體問題一般選為最大迭代次數 GkG_kGk? 或(和)微粒群迄今為止搜索到的最優位置滿足預定最小適應閾值。
PSO流程圖解
學習因子 c1、c2c_1、c_2c1?、c2? 分析
公式(2)和(3)中 pbestp^{best}pbest 和 gbestg^{best}gbest 分別表示微粒群的局部和全局最優位置。
當 c1=0c_1=0c1?=0 時,則粒子沒有了認知能力,變為只有社會的模型(social-only):
稱為全局PSO算法。粒子有擴展搜索空間的能力,具有較快的收斂速度,但由于缺少局部搜索,對于復雜問題比標準PSO 更易陷入局部最優。
當 c2=0c_2=0c2?=0 時,則粒子之間沒有社會信息,模型變為只有認知(cognition-only)模型:
稱為局部PSO算法。由于個體之間沒有信息的交流,整個群體相當于多個粒子進行盲目的隨機搜索,收斂速度慢,因而得到最優解的可能性小。
仿真(Matlab)
仿真1
% PSO % Author: Zhao-Jichao % Date: 2021-10-06 clc clear%% Target Function x = 1:0.01:2; y = sin(10 * pi * x) ./ x; figure(1) plot(x, y) hold on title("目標函數曲線");%% Parameters Initialized X = zeros(10,1); V = zeros(10,1); fun=@(x) sin(10 * pi * x) ./ x; % 定義被優化函數 fitness = zeros(10,1); % 由被優化的函數決定的適應值c1 = 1.49445; % 學習因子 c2 = 1.49445;Gk = 50; % 進化次數 N = 10; % 種群規模Vmax = 0.5; % 速度的范圍,超過則用邊界值。 Vmin = -0.5; Nmax = 2; % 個體的變化范圍 Nmin = 1;%% 產生初始粒子和速度 for i = 1:N% 隨機產生一個種群X(i,:) = (rands(1) + 1) / 2 + 1; % 初始種群位置,rands產生(-1,1),調整到(1,2)V(i,:) = 0.5 * rands(1); % 初始化速度fitness(i) = fun(X(i,:)); % 計算適應度 end%% 個體極值和群體極值 [bestfitness, bestindex] = max(fitness); gbest = X(bestindex,:); % 全局最佳 pbest = X; % 個體最佳 fitnessgbest = bestfitness; % 全局最佳適應度值 fitnesspbest = fitness; % 個體最佳適應度值%% VI. 迭代尋優 for i = 1:Gkfor j = 1:N% 速度更新V(j,:) = V(j,:) + c1*rand*(pbest(j,:)-X(j,:)) + c2*rand*(gbest-X(j,:));V(j,V(j,:)>Vmax) = Vmax;V(j,V(j,:)<Vmin) = Vmin;% 種群更新X(j,:) = X(j,:) + V(j,:);X(j,X(j,:)>Nmax) = Nmax;X(j,X(j,:)<Nmin) = Nmin;% 適應度值更新fitness(j) = fun(X(j,:)); endfor j = 1:N % 個體最優更新if fitness(j) > fitnesspbest(j)pbest(j,:) = X(j,:);fitnesspbest(j) = fitness(j);end% 群體最優更新if fitness(j) > fitnessgbestgbest = X(j,:);fitnessgbest = fitness(j);endend yy(i) = fitnessgbest; end%% 輸出結果并繪圖 [gbest, fitnessgbest] plot(gbest, fitnessgbest,'r*')figure(2) plot(yy) title('最優個體適應度','fontsize',12); xlabel('進化代數','fontsize',12);ylabel('適應度','fontsize',12);仿真2
fun = @(x)x(1)*exp(-norm(x)^2);rng default % For reproducibility nvars = 2; x = particleswarm(fun,nvars)fsurf(@(x,y)x.*exp(-(x.^2+y.^2)))Ref.
總結
以上是生活随笔為你收集整理的【控制】粒子群优化(PSO,Particle Swarm Optimization)算法及 Matlab 仿真实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【RL】快速强化学习实战案例
- 下一篇: 【控制】贪心算法(GA,Greedy A