自話粒子群演算法(超簡單例項)

2021-06-18 15:21:36 字數 4279 閱讀 2349

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

正如簡介所描述的那樣,粒子群演算法是模擬群體智慧型所建立起來的一種優化演算法,像後面我向大家介紹的蟻群演算法也屬於這類演算法,粒子群演算法可以用鳥類在乙個空間內隨機覓食為例,所有的鳥都不知道食物具體在**,但是他們知道大概距離多遠,最簡單有效的方法就是搜尋目前離食物最近的鳥的周圍區域。

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

所以,我們需要乙個pbest來記錄個體搜尋到的最優解,用gbest來記錄整個群體在一次迭代中搜尋到的最優解。速度和粒子位置的更新公式如下:

v[i] = w * v[i] + c1 * rand() * (pbest[i] - present[i]) + c2 * rand() * (gbest - present[i])

present[i] = present[i] + v[i]

其中v[i]代表第i個粒子的速度,w代表慣性權值,c1c2表示學習引數,rand()表示在0-1之間的隨機數,pbest[i]代表第i個粒子搜尋到的最優值,gbest代表整個集群搜尋到的最優值,present[i]代表第i個粒子的當前位置。

我這裡打了乙個求解y=-x*(x-1)[-2,2]

/***

* 計算y=-x(x-1)的最大值

* 取值範圍x--[-2,2]

* @author breezedust

* */

public class psotest

system.out.println("start gbest:"+gbest);

}public double getmax(double a,double b)

//粒子群演算法

public void pso(int max)

fitnessfunction();

//更新個體極值和群體極值

for(int j=0;jgbest) gbest=pbest[j];

system.out.println(x[j]+" "+v[j]);

}system.out.println("*****="+(i+1)+"*****=gbest:"+gbest);}}

public static void main(string args)

}

輸出結果如下:

start gbest:0.0

-0.4 0.1

0.0 -10.751668729351186

*****=1*****=gbest:0.0

-0.6822365786740794 -0.2822365786740793

0.0 -5.375834364675593

*****=2*****=gbest:0.0

-0.5822365786740794 0.1

0.0 -2.6879171823377965

*****=3*****=gbest:0.0

-0.48223657867407943 0.1

-1.3439585911688983 -1.3439585911688983

*****=4*****=gbest:0.0

-0.38223657867407945 0.1

-1.2439585911688982 0.1

*****=5*****=gbest:0.0

-0.47659030560462123 -0.09435372693054181

-1.143958591168898 0.1

*****=6*****=gbest:0.0

-0.37659030560462126 0.1

-1.043958591168898 0.1

*****=7*****=gbest:0.0

-0.2765903056046213 0.1

-0.943958591168898 0.1

*****=8*****=gbest:0.0

-0.27903394174424034 -0.0024436361396190653

-0.843958591168898 0.1

*****=9*****=gbest:0.0

-0.38899022876058803 -0.10995628701634769

-0.7439585911688981 0.1

*****=10*****=gbest:0.0

-0.35250959144436234 0.03648063731622572

-0.6439585911688981 0.1

*****=11*****=gbest:0.0

........

........

........

........

0.9999990975760489 -1.556071309835406e-6

*****=98*****=gbest:1.0

1.0000000029937202 4.411275849326098e-9

1.0000001827158205 1.085139771533034e-6

*****=99*****=gbest:1.0

0.9999999993730952 -3.6206249540206964e-9

1.0000001197322141 -6.298360633295484e-8

*****=100*****=gbest:1.0

我們可以從列印的資料看出來,剛開始x[0]和x[1]分散在最大值兩邊,然後x[0]和x[1]逐漸聚集到1的周圍,這裡,我們已經收斂到x=1這個地方了,這正是我們要求的最大值,其最大值為1,下面是**過程。

1.初始狀態

2.第二次x[1]向左邊移動了

3.最後,兩點聚集在1上,上面多個圈是他們聚集的過程,可以看出來,聚集過程是個越來越密集的過程。

粒子群演算法,相對於我上次提到的遺傳演算法而言編碼要簡單很多,同樣屬於進化演算法,但是粒子群演算法並沒有像遺傳演算法那樣有選擇交叉變異這樣的過程,而更多的是體現在追蹤單個粒子和共享集體最優資訊來實現向最優空間搜尋的形式,但是正由於它不同於遺傳演算法那樣去忽略個體的一些內在聯絡,所以往往會陷入區域性最優,所以,在粒子群演算法中加入像遺傳演算法中的變異或者模擬退火等,可以跳過這個區域性最優解

而慣性權值對於函式收斂速度和是否收斂有很大的決定作用,兩個學習引數c1,c2的制定也同等重要,但是即使這樣,它也沒有遺傳演算法中會有多個引數去維護,所以整個演算法就那乙個公式就行了,相當的清晰。在遺傳演算法中的資訊的共享是染色體互相之間通過交叉共享,所以在搜尋移動過程顯得平均緩慢,而粒子群演算法是根據gbest來決定整個集群的單向移動,所以相對遺傳演算法,它更快的收斂

這不由得讓我想到了熵這個概念,在諸如我們社會甚至宇宙這樣複雜的系統,我們都處於乙個無序的狀態,屬於熵增狀態,像粒子群,遺傳演算法,對群體的研究,體現的智慧型不就是在這個無序的系統提供有序的能量,然後它就逐漸有序了。對於智慧型,我想我有更深的體會了。這段話屬於發神經,不作參考。

簡單聊聊粒子群演算法

粒子群優化演算法 該演算法最早由kennedy和eberhart在1995年提出 particle swarm optimization 靈感 於對鳥類捕食問題的研究。粒子的概念 適應度函式值評價粒子 沒有選擇交叉變異三個運算元 乙個是個體的極值,乙個是群體的極值。粒子通過個體極值和群體極值更新自身...

粒子群演算法簡單實現

pso演算法相關定義 pso中的每個粒子p包含兩個向量 x,v o位置向量x 粒子在解空間中的當前位置 x x1,x2,xdim o速度向量v 粒子在解空間中的飛行速度 v v1,v2,vdim pbest 粒子自身的歷史最優位置 gbest 群體全域性最優向量 粒子速度與位置更新 p.v omeg...

原 粒子群演算法 PSO 的簡單應用

目錄 1.3 流程圖 2.簡單的pso例子 python 實現 參考資料 之前寫到優化的基本思想,裡面提到了智慧型演算法。目前有些學者對這些演算法並不認可,但是實際使用中,在維度比較低的情況下,群智慧型演算法確實能以很高的找到近似解。這篇以我最熟悉的pso開始,以demo的方式來 群智慧型演算法的使...