粒子群优化算法(PSO)
先簡單介紹一下粒子群優化算法(Particle Swarm Optimization),后邊會介紹一些改進的粒子群算法。
1.背景知識
????????受到鳥群覓食行為的啟發(鳥群覓食,通過信息共享使種群找到最優的覓食點),由社會心理學家JamesKennedy和電氣工程師RussellEberhart于1995年提出,用于解決科學工程領域的非線性,非凸性,組合優化問題;在函數優化,圖像處理也有廣泛的應用。
????????粒子群優化算法是一種基于數值的優化算法,粒子群優化算法的基礎是“信息共享”。具有收斂速度快,參數少,算法簡單易于實現的優點(對于高維度比遺傳算法更快)。存在早熟收斂,維數災難,陷入局部最優的問題。
? ? ? ? 場景,一群鳥隨機搜尋食物,一片森林只有一塊地方有食物,所有鳥都不知道食物在哪里,只知道自己和其他鳥距離食物的位置,尋找食物的策略就是所有鳥尋找當前距離食物最近的鳥。
粒子群優化算法的相關發展方向:
- 調整PSO的參數來平衡算法算法的全局探索和局部開采能力
- 設計不同類型的拓撲結構,改變粒子學習模式,從而提高種群多樣性
- 將PSO與其他優化算法結合,形成混合PSO算法
- 采用小生境技術。小生境是模擬生態平衡的一種仿生技術,適用于多峰函數和多目標函數的優化問題
2.粒子群優化算法思想
????????用粒子來描述鳥類個體,每個粒子在搜索空間中搜索,飛行過程為搜索過程,飛行速度可以根據粒子歷史最優位置和種群歷史最優位置動態調整,粒子當前位置就是對應優化問題的一個候選解?,稱為個體極值,粒子群中的最優的個體極值稱為全局最優解。不斷地迭代,粒子更新速度和我位置,最終滿足條件的全局最優解即為所求目標。
| 鳥群覓食 | 粒子群算法 |
| 鳥 | 粒子 |
| 森林 | 求解空間 |
| 食物的量 | 目標函數值(適應值) |
| 每只鳥所在位置 | 空間中的一個解(粒子位置) |
| 食物量最多的位置 | 全局最優解 |
3.粒子群優化算法流程
?MATLAB偽代碼
FOR each particle(粒子) iFOR each dimension(維度) d初始化粒子位置 Xid 為允許的隨機數初始化粒子速度 Vid 為允許的隨機數END FOR END FORIteration k=1 %迭代次數 DO % 找到每個粒子的最優適應值FOR each particle i計算適應值IF 這個適應值比歷史的最優適應值好SET 當前的適應值為最優的適應值END IFEND FOR挑選出最優適應值的粒子就是當前迭代次數的群體最優值FOR each particle iFOR each dimension d計算更新粒子速度 % 速度更新公式計算更新位置 % 位置更新公式END FOREND FORk=k+1 While 當滿足最大迭代次數或者兩次迭代之間的適應值誤差滿足目標時停止迭代(1)初始化:設置最大迭代次數,目標函數的自變量個數,粒子的最大速度,位置信息為整個搜索空間,我們在速度區間和搜索空間上隨機初始化速度和位置,設置粒子群規模為N,每個粒子隨機初始化一個飛翔速度。
假設在D維空間中:
- 第i個粒子的位置為:? Xid=(xi1,xi2,.xiD)
- 第i個粒子的速度(粒子移動的方向)為:? Vid=(vi1,vi2,.viD)
- 第i個粒子搜索到的最優位置(個體最優解)為:? Pid,pbest=(pi1,pi2,.piD),其中p指的是Particle(粒子)
- 群體中搜索到的最優位置(群體最優解)為:? Pid,gbest=(p1,gbest, p2,gbest,...pD,gbest), 其中g指的是Group(群體)
- 第i個粒子搜索到的最優位置的適應值(優化目標函數的值)為:? fp——個體歷史最優適應值
- 群體中搜索到的最優位置的適應值為:? fg——群體歷史最優適應值
其他參數:
- 給所有粒子限制位置:?
- 給所有粒子限制速度:??
- 設置迭代次數iter?
- 設置粒子們自我學習因子C1,調節粒子移動步長受自我影響的因素大小
- 設置粒子們群體學習因子C2,調節粒子移動步長受群體影響的因素大小
- 設置粒子們慣性權重為W,非負,體現繼承上一刻自己速度的能力
(2)定義適應度函數
即需要優化的目標函數
(3)更新速度公式
說明:
- 慣性權重:由慣性權重和粒子自身速度構成,表示粒子對先前自身運動狀態的信任。
- 認知部分:表示粒子本身的思考,即粒子自己經驗的部分,可理解為粒子當前位置與自身歷史最優位置之間的距離和方向。
- 社會部分:表示粒子之間的信息共享與合作,即來源于群體中其他優秀粒子的經驗,可理解為粒子當前位置與群體歷史最優位置之間的距離和方向。
速度方向更新示意圖?
公式定義參考:
- N--粒子規模;i--粒子序號,i=1,2,..N;
- D--粒子維度;d--粒子維度序號,d=1,2,..D;
- k--迭代次數;w--慣性因子;c1--個體學習因子;c2--群體學習因子;
- r1,r2--區間 [0-1] 的隨機數,增加搜索的隨機性
- ?--粒子 i 在第 k 次迭代中第 d 維的速度向量
- ?--粒子 i 在第 k 次迭代中第 d 維的位置向量
- ?--粒子 i?在第 k?次迭代中第 d 維的歷史最優位置,即在第 k?次迭代后,第 i?個粒子(個體)搜索得到的最優解;
- ?--群體在第 k?次迭代中第 d?維的歷史最優位置,即在第 k?次迭代后,整個粒子群體中的最優解。
(4)更新位置公式
(5)終止條件
- 達到設定的迭代次數
- 代數之間差值滿足最小界限(精度達到要求)?
(6)算法參數解釋?
粒子群規模N:推薦取值范圍 [20-1000] ,簡單問題取20-40;較難問題取100-200。較小的種群規模容易陷入局部最優,較大的會提高收斂性(迭代計算量大),種群規模達到一定水平,再增大不會再有顯著作用。
粒子維度D:粒子搜索的空間維度數(自變量的個數)
迭代次數K:推薦取值 [50-100] ,典型取值60,70,100,迭代次數太小解不穩定,太大浪費資源,沒必要。?
慣性因子(慣性權重):w 值較大,全局尋優能力強。參數意義:使粒子保持運動慣性,使其有搜索擴展空間的趨勢,?w 越大,探索新的區域的能力越強。也表示粒子對當前自身運動狀態的信任,依據自身的速度進行慣性運動。?較大的 w?有利于跳出局部極值,而較小的 w?有利于算法收斂。大慣性權重有利于全局搜索,不至于陷入局部最優,小慣性權重有利于在局部搜索,可以快速收斂得到最優解。推薦取值 [0.4-2],典型取值0.9, 1.2, 1.5,1.8
- w=1,基本粒子群算法
- w=0,失去對粒子自身經驗的思考
改善w:解決實際優化問題時,往往希望先采用全局搜索,使搜索空間快速收斂于某一區域,然后采用局部精細化搜索獲得高精度的解。提出了自適應調整的策略,即隨著迭代次數,線性的減小 w 的值。常用方法:線性變化策略:隨著迭代次數的增加,慣性權重 w 不斷減,從而使得粒子群算法在初期具有較強的全局收斂能力,在后期具有較強的局部收斂能力。
學習因子C1,C2:也稱為加速系數或加速因子
- c1 表示粒子下一步動作來源于自己經驗部分所占的比重
- c2 表示粒子下一步動作來源于其他粒子所占的比重
- c1 表示將粒子推向個體最優位置Pid,pbest 的加速權重
- c2 表示將粒子推向群體最優位置?的加速權重
- 學習因子較小,使粒子在目標區域外徘徊,而高的值導致粒子越過目標區域
- c1=0, 無私型粒子群算法,迅速喪失群體多樣性,易陷入局部最優而無法跳出
- c2=0, 自我認知型粒子群算法,完全沒有信息的社會共享,導致算法收斂速度緩慢?
- c1,c2不為0,完全型粒子群算法,保持收斂速度和全局搜索效果的均衡
- 推薦取值 [0-4] ,典型取值c1=c2=2;c1=1.6,c2=1.8; c1=1.6,c2=2; 試湊法
(7)粒子群算法的一些技巧
適應值:即優化目標函數的值,用來評價粒子位置的好壞程度,決定是否更新粒子個體的歷史最優位置和群體的歷史最優位置,保證粒子朝著最優解的方向搜索。
位置限制:限制粒子搜索的空間,即自變量的取值范圍,對于無約束問題此處可以省略。
速度限制:為了平衡算法探索能力與開發能力,需要設定一個合理的速度范圍,限制粒子的最大速度。粒子飛行速度快,探索能力強,但粒子容易飛過最優解。粒子飛行速度快。飛行速度慢,開發能力強,但是收斂速度慢,且容易陷入局部最優解。一般設為每維變量變化范圍的10%~20%。
初始化:如果粒子的初始化范圍選擇得好的話可以縮短優化的收斂時間,需要根據具體的問題進行分析。如果根據經驗判斷出最優解一定在某個范圍內,則就在這個范圍內初始化粒子;如果無法確定,則以粒子的取值邊界作為初始化范圍。
算法代碼
1.一維
clc; clear; close all;f= @(x) - (x - 10) .^ 2 + x .* sin(x) .* cos(2 * x) - 5 * x .* sin(3 * x) ; % 適應度函數表達式(求這個函數的最大值) figure(1); fplot(f, [0 20], 'b-'); % 畫出初始圖像 d = 1; % 空間維數(該例子是1維) N = 15; % 初始種群個數 x_limit = [0, 20]; % 設置位置限制 v_limit = [-1, 1]; % 設置速度限制 x = x_limit(1) + (x_limit(2) - x_limit(1)) * rand(N, d); %初始每個粒子的位置 v = rand(N, d); % 初始每個粒子的速度 pbest = x; % 初始化每個個體的歷史最佳位置 gbest = zeros(1, d); % 初始化種群的歷史最佳位置 ,創建全0數組 fp_best = zeros(N, 1); % 初始化每個個體的歷史最佳適應度 為 0 fg_best = -inf; % 初始化種群歷史最佳適應度 為 負無窮 iter = 50; % 最大迭代次數 c1 = 1.6; % 自我學習因子 c2 = 1.8; % 群體學習因子 w=0.4; % 慣性學習因子 hold on; plot(x, f(x), 'ro'); title('初始狀態圖'); record = zeros(iter, 1); % 記錄器(用于記錄 fg_best 的變化過程) figure(2); i = 1; while i <= iter fx = f(x) ; % 計算個體當前適應度 % 個體尋優for j = 1:N if fp_best(j) < fx(j) % 第j個個體的歷史(最優)適應度小于當前的適應度則更新fp_best(j) = fx(j); % 更新個體歷史最佳適應度pbest(j) = x(j); % 更新個體歷史最佳位置 end end% 群體尋優if fg_best < max(fp_best) % 第i次迭代,種群歷史最優適應值,小于當前迭代次數的群體最優適應值則更新[fg_best,ind_max] = max(fp_best); % 更新群體歷史最佳適應度gbest = pbest(ind_max); % 更新群體歷史最佳位置,其中 ind_max 是最大值所在的下標% 注:將上面的兩個式子換成下面兩個是不可以的% [gbest, ind_max] = max(pbest); % 更新群體歷史最佳位置,其中 ind_max 是最大值所在的下標% fg_best = fp_best(ind_max); % 更新群體歷史最佳適應度 end v = v * w + c1 * rand() * (pbest - x) + c2 * rand() * (repmat(gbest, N, 1) - x); % 速度更新% 注: repmat(A,r1,r2):可將矩陣 擴充 為每個單位為A的r1*r2的矩陣% 邊界速度處理 v(v > v_limit(2)) = v_limit(2);v(v < v_limit(1)) = v_limit(1); x = x + v;% 位置更新 % 邊界位置處理 x(x > x_limit(2)) = x_limit(2); x(x < x_limit(1)) = x_limit(1); record(i) = fg_best;%最大值記錄 % 畫動態展示圖zuo_x = 0 : 0.01 : 20; plot(zuo_x, f(zuo_x), 'b-', x, f(x), 'ro');title('狀態位置變化') pause(0.1) i = i + 1; % if mod(i,10) == 0 % 顯示進度 % i % end end figure(3); plot(record); title('收斂過程'); zuo_x = 0 : 0.01 : 20; figure(4); plot(zuo_x, f(zuo_x), 'b-', x, f(x), 'ro'); title('最終狀態圖')disp(['最佳適應度:',num2str(fg_best)]); disp(['最佳粒子的位置x:',num2str(gbest)]);2.二維
% 主調用函數,以下新建一個文件,命名為f_xy % function z = f_xy(x, y) % % 適應度函數 % z = - x.^2 - y.^2 + 10*cos(2*pi*x) + 10*cos(2*pi*y) + 100; % endclc; clear; close all;[ZuoBiao_x, ZuoBiao_y] = meshgrid(-10:0.1:10,-5:0.1:5); % 產生二維坐標 ZuoBiao_z = f_xy(ZuoBiao_x, ZuoBiao_y); figure(1); s = mesh(ZuoBiao_x, ZuoBiao_y, ZuoBiao_z); % 畫網格曲面圖 s.FaceColor = 'flat'; % 修改網格圖的屬性% 初始化種群 N = 100; % 初始種群個數 D = 2; % 空間維數 iter = 50; % 迭代次數 x_limit = [-10, 10; -5, 5]; % 位置限制 v_limit = [ -2, 2; -1, 1]; % 速度限制 x = zeros(N, D); for i = 1:D x(:,i) = x_limit(i, 1) + (x_limit(i, 2) - x_limit(i, 1)) * rand(N, 1);%初始種群的位置 end v(:,1) = rands(N, 1) * 1; % 初始種群x方向的速度 v(:,2) = rands(N, 1) * 2; % 初始種群y方向的速度 p_best = x; % (初始化)每個個體的歷史最佳位置 f_best = zeros(1, D); % (初始化)種群的歷史最佳位置 fp_best = zeros(N, 1) - inf; % (初始化)每個個體的歷史最佳適應度為負無窮 fg_best = -inf; % (初始化)種群歷史最佳適應度為負無窮w = 0.8; % 慣性權重 c1 = 0.5; % 自我學習因子 c2 = 0.5; % 群體學習因子 figure(2); s = mesh(ZuoBiao_x, ZuoBiao_y, ZuoBiao_z); % 畫網格曲面圖 s.FaceColor = 'flat'; % 修改網格圖的屬性 hold on; plot3(x(:,1), x(:,2),f_xy(x(:,1), x(:,2)), 'ro'); title('初始狀態圖'); figure(3); i = 1; record = zeros(iter, 1); % 記錄器 while i <= iter fx = f_xy(x(:,1), x(:,2)); % 個體當前適應度 for j = 1:N if fp_best(j) < fx(j) % 記錄最大值fp_best(j) = fx(j); % 更新個體歷史最佳適應度 p_best(j,:) = x(j,:); % 更新個體歷史最佳位置 end end if fg_best < max(fp_best) [fg_best, ind_max] = max(fp_best); % 更新群體歷史最佳適應度 f_best = p_best(ind_max, :); % 更新群體歷史最佳位置 end v = v * w + c1 * rand() * (p_best - x) + c2 * rand() * (repmat(f_best, N, 1) - x); % 速度更新% 速度處理for t=1:Nfor k=1:Dif v(t,k) > v_limit(k,2) % 超速處理v(t,k) = v_limit(k,2);elseif v(t,k) < v_limit(k,1) % 慢速處理v(t,k) = v_limit(k,1);end endendx = x + v; % 位置更新% 邊界處理for t=1:Nfor k=1:Dif x(t,k) > x_limit(k,2) % 超過邊界上限x(t,k) = x_limit(k,2);elseif x(t,k) < x_limit(k,1) % 超過邊界下限x(t,k) = x_limit(k,1);endendendrecord(i) = fg_best; % 最大值記錄 i = i + 1;if mod(i,10) == 0i % 收斂進度輸出endpause(0.1) endfigure(4) plot(record); title('收斂過程');% 畫最終狀態圖 figure(5); [ZuoBiao_x, ZuoBiao_y] = meshgrid(-10:0.1:10,-5:0.1:5); % 產生二維坐標 s = mesh(ZuoBiao_x, ZuoBiao_y, ZuoBiao_z); % 畫網格曲面圖 s.FaceColor = 'flat'; % 修改網格圖的屬性 hold on; scatter3(x(:,1), x(:,2), f_xy(x(:,1), x(:,2)), 'ro'); title('最終狀態圖')disp(['最大值:',num2str(fg_best)]); disp(['變量取值:',num2str(f_best)]);% 下面一段用來輸出 粒子群最佳適應度的排行榜 [socre,ind] = sort(fp_best, 'descend') % 降序排序 DaAn = zeros(3,2); for i=1:Nrow = ind(i);DaAn(i,:) = p_best(row,:); end算法的改進
改進思路:
(1)修改慣性權重
- 慣性因子線性遞減。(把Wmax逐漸變成Wmin)
- ?慣性因子自適應。(當各微粒的目標值趨于一致或趨于局部最優時,將使慣性權重增大,而各微粒的目標值比較分散時,使慣性權重減小)(0.4-0.9)
- ?慣性因子隨機權重。(隨機地選取值,使得微粒歷史速度對當前速度的影響是隨機的,隨機權重策略的PSO算法對于多峰函數,能在一定程度上避免陷入局部最優。)
- ?增加收縮因子(如下兩種)
?A:
?B:
后續看到文獻會補充!!!?
小白一個,參照多篇,自我總結,侵刪(私聊我),勿噴!!!
總結
以上是生活随笔為你收集整理的粒子群优化算法(PSO)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle用户权限的管理
- 下一篇: sublimeclang里面使用相对路径