1. 程式人生 > >【智慧演算法】粒子群演算法(Particle Swarm Optimization)超詳細解析+入門程式碼例項講解

【智慧演算法】粒子群演算法(Particle Swarm Optimization)超詳細解析+入門程式碼例項講解

喜歡的話可以掃碼關注我們的公眾號哦,更多精彩盡在微信公眾號【程式猿聲】

01 演算法起源

粒子群優化演算法(PSO)是一種進化計算技術(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源於對鳥群捕食的行為研究 。該演算法最初是受到飛鳥叢集活動的規律性啟發,進而利用群體智慧建立的一個簡化模型。粒子群演算法在對動物叢集活動行為觀察基礎上,利用群體中的個體對資訊的共享使整個群體的運動在問題求解空間中產生從無序到有序的演化過程,從而獲得最優解。

02 什麼是粒子群演算法?

2.1 官方定義(參照百科)

粒子群演算法,也稱粒子群優化演算法或鳥群覓食演算法(Particle Swarm Optimization),縮寫為 PSO, 是近年來由J. Kennedy和R. C. Eberhart等開發的一種新的進化演算法(Evolutionary Algorithm - EA)。PSO 演算法屬於進化演算法的一種,和模擬退火演算法相似,它也是從隨機解出發,通過迭代尋找最優解,它也是通過適應度來評價解的品質,但它比遺傳演算法規則更為簡單,它沒有遺傳演算法的“交叉”(Crossover) 和“變異”(Mutation) 操作,它通過追隨當前搜尋到的最優值來尋找全域性最優。這種演算法以其實現容易、精度高、收斂快等優點引起了學術界的重視,並且在解決實際問題中展示了其優越性。粒子群演算法是一種並行演算法。

2.2 通俗點描述

如同前面的描述,PSO模擬的是鳥群的捕食行為。設想這樣一個場景:一群鳥在隨機搜尋食物。在這個區域裡只有一塊食物。所有的鳥都不知道食物在那裡。但是他們知道當前的位置離食物還有多遠。那麼找到食物的最優策略是什麼呢。最簡單有效的就是搜尋目前離食物最近的鳥的周圍區域。

鳥群在整個搜尋的過程中,通過相互傳遞各自的資訊,讓其他的鳥知道自己的位置,通過這樣的協作,來判斷自己找到的是不是最優解,同時也將最優解的資訊傳遞給整個鳥群,最終,整個鳥群都能聚集在食物源周圍,即找到了最優解。

PSO中,每個優化問題的解都是搜尋空間中的一隻鳥。我們稱之為“粒子”。所有的粒子都有一個由被優化的函式決定的適應值(fitness value),每個粒子還有一個速度決定他們飛翔的方向和距離。然後粒子們就追隨當前的最優粒子在解空間中搜索。

PSO 初始化為一群隨機粒子(隨機解)。然後通過迭代找到最優解。在每一次迭代中,粒子通過跟蹤兩個"極值"來更新自己。第一個就是粒子本身所找到的最優解,這個解叫做個體極值pBest。另一個極值是整個種群目前找到的最優解,這個極值是全域性極值gBest。另外也可以不用整個種群而只是用其中一部分作為粒子的鄰居,那麼在所有鄰居中的極值就是區域性極值。

2.3 再再再通俗點的描述

粒子群演算法的基本思想是通過群體中個體之間的協作和資訊共享來尋找最優解。如上的情景。試著想一下一群鳥在尋找食物,在這個區域中只有一隻蟲子,所有的鳥都不知道食物在哪。但是它們知道自己的當前位置距離食物有多遠,同時它們知道離食物最近的鳥的位置。想一下這時候會發生什麼?

同時各只鳥在位置不停變化時候離食物的距離也不斷變化,所以每個鳥一定有過離食物最近的位置,這也是它們的一個參考。

所以,粒子群演算法就是把鳥看成一個個粒子,並且他們擁有位置和速度這兩個屬性,然後根據自身已經找到的離食物最近的解和參考整個共享於整個叢集中找到的最近的解去改變自己的飛行方向,最後我們會發現,整個叢集大致向同一個地方聚集。而這個地方是離食物最近的區域,條件好的話就會找到食物。

03 粒子抽象

3.1 關於速度和位置

粒子群演算法通過設計一種無質量的粒子來模擬鳥群中的鳥,粒子僅具有兩個屬性:速度和位置,速度代表移動的快慢,位置代表移動的方向。

鳥被抽象為沒有質量和體積的微粒(點),並延伸到N維空間,粒子i在N維空間的位置表示為向量Xi=(α1,α2,…,αN),飛行速度表示為向量Vi=(β1,β2,…,βN)。每個粒子都有一個由目標函式決定的適應值(fitness value),並且知道自己到目前為止發現的最好位置(pbest)和現在的位置Xi。這個可以看作是粒子自己的飛行經驗。除此之外,每個粒子還知道到目前為止整個群體中所有粒子發現的最好位置(gbest)(gbest是pbest中的最好值),這個可以看作是粒子同伴的經驗。粒子就是通過自己的經驗和同伴中最好的經驗來決定下一步的運動。

3.2 速度和位置的更新

PSO初始化為一群隨機粒子(隨機解)。然後通過迭代找到最優解。在每一次的迭代中,粒子通過跟蹤兩個“極值”(pbest,gbest)來更新自己。在找到這兩個最優值後,粒子通過下面的公式來更新自己的速度和位置。

對於公式(1):

公式(1)的第①部分稱為【記憶項】,表示上次速度大小和方向的影響;

公式(1)的第②部分稱為【自身認知項】,是從當前點指向粒子自身最好點的一個向量,表示粒子的動作來源於自己經驗的部分;

公式(1)的第③部分稱為【群體認知項】,是一個從當前點指向種群最好點的向量,反映了粒子間的協同合作和知識共享。粒子就是通過自己的經驗和同伴中最好的經驗來決定下一步的運動。

以上面兩個公式為基礎,再來看一個公式:

公式(2)和 公式(3)被視為標準PSO演算法。

04 標準PSO演算法流程

4.1 標準PSO演算法的流程

1)初始化一群微粒(群體規模為N),包括隨機位置和速度;

2)評價每個微粒的適應度;

3)對每個微粒,將其適應值與其經過的最好位置pbest作比較,如果較好,則將其作為當前的最好位置pbest;

4)對每個微粒,將其適應值與其經過的最好位置gbest作比較,如果較好,則將其作為當前的最好位置gbest;

5)根據公式(2)、(3)調整微粒速度和位置;

6)未達到結束條件則轉第2)步。

迭代終止條件根據具體問題一般選為最大迭代次數Gk或(和)微粒群迄今為止搜尋到的最優位置滿足預定最小適應閾值。

4.2 PSO流程圖解

4.3 學習因子c1、c2分析

公式(2)和(3)中pbest和gbest分別表示微粒群的區域性和全域性最優位置。

  • 當C1=0時,則粒子沒有了認知能力,變為只有社會的模型(social-only):

    稱為全域性PSO演算法。粒子有擴充套件搜尋空間的能力,具有較快的收斂速度,但由於缺少區域性搜尋,對於複雜問題比標準PSO 更易陷入區域性最優。
  • 當C2=0時,則粒子之間沒有社會資訊,模型變為只有認知(cognition-only)模型:

    稱為區域性PSO演算法。由於個體之間沒有資訊的交流,整個群體相當於多個粒子進行盲目的隨機搜尋,收斂速度慢,因而得到最優解的可能性小。

05 程式碼例項講解

5.1 先來看個簡單的例項

在這個例子中,我們選取了一個求解函式y=-x*(x-1) 在[0,2]上最大值的粒子群演算法。然後通過步步跟蹤演算法輸出結果,來給大家講解粒子運動的過程。

下面先看程式碼和程式碼註釋。

 1public class AlgorithmPSO { 2    int n=2//粒子個數,這裡為了方便演示,我們只取兩個,觀察其運動方向 3    double[] y; 4    double[] x; 5    double[] v; 6    double c1=2; 7    double c2=2; 8    double pbest[]; 9    double gbest;10    double vmax=0.1//速度最大值11    //適應度計算函式,每個粒子都有它的適應度12    public void fitnessFunction(){13        for(int i=0;i<n;i++){14            y[i]=-1*x[i]*(x[i]-2);15        }16    }17    public void init()//初始化18        x=new double[n];19        v=new double[n];20        y=new double[n];21        pbest=new double[n];22        /***23         * 本來是應該隨機產生的,為了方便演示,我這裡手動隨機落兩個點,分別落在最大值兩邊24         */25        x[0]=0.0;26        x[1]=2.0;27        v[0]=0.01;28        v[1]=0.02;29        fitnessFunction();30        //初始化當前個體最優位置,並找到群體最優位置31        for(int i=0;i<n;i++){32            pbest[i]=y[i];33            if(y[i]>gbest) gbest=y[i];34        }35        System.out.println("演算法開始,起始最優解:"+gbest);36        System.out.print("\n");37    }38    public double getMAX(double a,double b){39        return a>b?a:b;40    }41    //粒子群演算法42    public void PSO(int max){43        for(int i=0;i<max;i++){44            double w=0.4;45            for(int j=0;j<n;j++){46                //更新位置和速度,下面就是我們之前重點講解的兩條公式。47                v[j]=w*v[j]+c1*Math.random()*(pbest[j]-x[j])+c2*Math.random()*(gbest-x[j]);48                if(v[j]>vmax) v[j]=vmax;//控制速度不超過最大值49                x[j]+=v[j];5051                //越界判斷,範圍限定在[0, 2]52                if(x[j]>2) x[j]=2;53                if(x[j]<0) x[j]=0;5455            }56            fitnessFunction();57            //更新個體極值和群體極值58            for(int j=0;j<n;j++){59                pbest[j]=getMAX(y[j],pbest[j]);60                if(pbest[j]>gbest) gbest=pbest[j];61                System.out.println("粒子n"+j+": x = "+x[j]+"  "+"v = "+v[j]);62            }63            System.out.println("第"+(i+1)+"次迭代,全域性最優解 gbest = "+gbest);64            System.out.print("\n");65        }6667    }68    //執行我們的演算法69    public static void main(String[] args){70        AlgorithmPSO ts=new AlgorithmPSO();71        ts.init();72        ts.PSO(10);//為了方便演示,我們暫時迭代10次。73    }7475}

輸出結果:

 1演算法開始,起始最優解:0.0 2 3粒子n0: x = 0.004  v = 0.004 4粒子n1: x = 0.0  v = -4.065770842472382 51次迭代,全域性最優解 gbest = 0.007984 6 7粒子n0: x = 0.01778510589090629  v = 0.013785105890906289 8粒子n1: x = 0.0  v = -1.625639647649872 92次迭代,全域性最優解 gbest = 0.035253901790261831011粒子n0: x = 0.0610276658084214  v = 0.0432425599175151112粒子n1: x = 0.0  v = -0.6035255880722042133次迭代,全域性最優解 gbest = 0.118330955622818441415粒子n0: x = 0.1610276658084214  v = 0.116粒子n1: x = 0.0  v = -0.012719944703824898174次迭代,全域性最優解 gbest = 0.296125422461134161819粒子n0: x = 0.2610276658084214  v = 0.120粒子n1: x = 0.06231495466940402  v = 0.06231495466940402215次迭代,全域性最優解 gbest = 0.45391988929944992223粒子n0: x = 0.3610276658084214  v = 0.124粒子n1: x = 0.16231495466940402  v = 0.1256次迭代,全域性最優解 gbest = 0.59171435613776562627粒子n0: x = 0.46102766580842136  v = 0.128粒子n1: x = 0.262314954669404  v = 0.1297次迭代,全域性最優解 gbest = 0.70950882297608133031粒子n0: x = 0.5610276658084213  v = 0.132粒子n1: x = 0.362314954669404  v = 0.1338次迭代,全域性最優解 gbest = 0.80730328981439693435粒子n0: x = 0.6610276658084213  v = 0.136粒子n1: x = 0.462314954669404  v = 0.1379次迭代,全域性最優解 gbest = 0.88509775665271273839粒子n0: x = 0.7610276658084213  v = 0.1
            
           

相關推薦

智慧演算法粒子演算法Particle Swarm Optimization詳細解析+入門程式碼例項講解

喜歡的話可以掃碼關注我們的公眾號哦,更多精彩盡在微信公眾號【程式猿聲】 01 演算法起源 粒子群優化演算法(PSO)是一種進化計算技術(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源於對鳥群捕食的行為研究 。該演算法最初是受到飛鳥叢集

尋優演算法粒子演算法PSO 引數尋優的python實現

【尋優演算法】粒子群演算法(PSO) 引數尋優的python實現 一、演算法原理 1、粒子群演算法的名詞解釋 2、粒子更新 二、PSO演算法引數尋優的python實現 參考資料 粒子群優化演算法(Particle

演算法紅黑樹二叉樹概念與查詢

誒,演算法這個東西,其實沒那麼簡單,但是也沒那麼難。 紅黑樹,其實已經有很多大佬都整理過了,而且文章部落格都寫得超好,我寫這篇文章的目的是:自己整理一次,這些知識才是自己的,否則永遠是別人的~   該系列到現在暫只有3篇文章: 【演算法】紅黑樹(二叉樹)概念與查詢(一):h

演算法位元位計算A+B Problem-位運算子介紹、位運算實現加減乘除

問題描述 問題:計算A+B,不適用“+”運算子(LintCode 1.A + B Problem) 注意:A B均為32位整數,可使用位元位計算 解決思路 演算法示例 程式碼如下:(通過LintCode測試) class Solution

粒子演算法4——粒子演算法與蟻演算法的異同點

群體智慧演算法家族的兩個重要成員就是粒子群演算法與蟻群演算法。基本思想都是模擬自然界生物群體行為來構造隨機優化演算法的,不同的是粒子群演算法模擬鳥類群體行為,而蟻群演算法模擬螞蟻覓食原理。 1.相同點 (1)都是一類不確定演算法。不確定性體現了自然界生物的生物機制,並且在求解某些特定問題方面優於確定性演算法。

遺傳演算法粒子演算法,蟻演算法對比

遺傳演算法適合求解離散問題,具備數學理論支援,但是存在著漢明懸崖等問題.粒子群演算法適合求解實數問題,演算法簡單,計算方便,求解速度快,但是存在著陷入區域性最優等問題.蟻群演算法適合在圖上搜索路徑問題,計算開銷會大.要將三種演算法進行混合,就要針對特定問題,然後融合其中的優勢

洛谷P1052 過河狀壓dp

ron mic ont 由於 不同 amp 整數 輸入輸出格式 pac 題目描述 在河上有一座獨木橋,一只青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數

NOIP2017練習函數變換DP,dfs

col close gin const cnblogs max 題意 .cn for 題意: 思路: 極限步數大概不會超過30 1 const max=100000; 2 var dp:array[1..max,0..2]of longint; 3

USTC 1213取石子遊戲尼姆博弈

std col 遊戲 script pro 取石子 div ++ pre Description 在組合博弈論中,Nim遊戲是一個非常經典的問題,Nim遊戲可描述如下:有n堆石子,每堆石子數分別為a1, a2, …, an (ai≥0)。現有兩人輪流從這n堆中取石子,每

10、C++ STL容器適配器stack queue priority_queue

pub function 適配 pty str 成員 cto ali The 容器適配器   stack、queue、priority_queue 都不支持任一種叠代器,它們都是容器適配器類型,stack是用vector/deque/list對象創建了一個先進後出容器;qu

TP5.1whereOr的用法雙條件查詢

author:咔咔 wechat:fangkangfg   在平時的工作中,我們會遇到一些情況,比如; 最近我在寫TP5.1的商城部落格,裡邊就有一個這樣的需求 一個條件是校驗是否在角色許可權裡 一個條件就是需要校驗的許可權 這個時候就不知道sql怎麼

CodeForces - 245C Game with Coins 思維,貪心

題幹: Two pirates Polycarpus and Vasily play a very interesting game. They have n chests with coins, the chests are numbered with integers

C語言實現一個計算器兩種方式

1.使用switch…case…語句實現 #define _CRT_SECURE_NO_DEPRECATE 1 #include <stdio.h> #include <stdlib.h> int add(int x, int y) {   &nb

HihoCoder - 1851D級上司 樹形圖,dfs

題幹: H公司一共有N名員工,編號為1~N,其中CEO的編號是1。除了CEO之外,每名員工都恰好有唯一的直接上司;N名員工形成了一個樹形結構。   我們定義X的1級上司是他的直接上司,2級上司是他上司的上司,以此類推……   請你找出每名員工的D級上司是誰。

HihoCoder - 1850字母去重 字串,思維

題幹: 給定一個字串S,每次操作你可以將其中任意一個字元修改成其他任意字元。 請你計算最少需要多少次操作,才能使得S中不存在兩個相鄰的相同字元。 Input 只包含小寫字母的字串S。   1 ≤ |S| ≤ 100000 Output 一個整數代表答案

LeetCode題解231_2的冪Power-of-Two

文章目錄 描述 解法 1:判斷整數 $x$ 的二進位制表示中是否只有一位為1 實現方式 1:除以 2 Java 實現(非遞迴) Python 實現(非遞迴) Java 實現(遞迴) Python

新書推薦2017.11相控陣天線手冊第三版

【2017.11】相控陣天線手冊(第三版)Phased array antenna handbook third edition,共506頁。 如果需要電子版,請聯絡QQ:3042075372。 本書對Artech House出版的《相控陣天線手冊(第二版)》進行了全面修訂,提

新書推薦2018.03自動目標識別第三版

【2018.03】自動目標識別(第三版)Automatic Target Recognition, Third Edition,共330頁。 ATR定義與效能衡量 目標檢測策略 目標分類器策略 自動目標跟蹤與自動目標識別的統一 多感測器融

2018.12.15SPOJ-LCSLongest Common Substring字尾自動機SAM

傳送門 解析: 小聲BB:vjudge上面應該出了一點問題,C++會Language Erro,C++14就沒有問題。 思路: 建立其中一個串的SAM,然後拿另外一個串去匹配,能夠匹配到的最大長度就是最長公共子串。 啊你問我為什麼這樣是對的,請回去重新學習什麼是

2018.11.02校內模擬飛越行星帶最小生成樹

傳送門 解析: 最小生成樹的優秀做法。 建圖很妙啊,把所有點對之間建立距離為權值的邊,然後所有點向頂部連權值為距離的邊,向底部連權值為L−yL-yL−y的邊,然後求一個最小生成樹,將頂部和底部連在一起