【优化算法】粒子群优化算法简介
這里是引用
文章目錄
- 1. 簡介
- 2. 涌現復雜性
- 3. 鳥群智能建模
- 4. 代碼實現
- 5. Conclusion
- 參考資料
1. 簡介
人工智能是計算機科學的一個大領域,它模擬計算機中的智能行為。在此基礎上,提出了一種基于元啟發式( metaheuristic)的粒子群優化算法來模擬鳥類覓食、魚群移動等。這種算法能夠模擬群體的行為,以便迭代地優化數值問題。例如,它可以被分類為像蟻群算法、人工蜂群算法和細菌覓食這樣的群體智能算法。
J. Kennedy 和 R.Eberhart 在1995年提出的粒子群優化(Particle Swarm Optimization,PSO)變得非常流行,它是一種基于隨機優化(Stochastic Optimization)的強大算法,受鳥群中的規則啟發,連續優化過程允許多目標和更多的變化。該方法包括不斷尋找最佳解,以每次迭代計算的一定速度移動粒子(在這種情況下表示為位置 (x,y)(x,y)(x,y))。每個粒子的運動都有其自身的影響,最著名的位置也是空間搜索中最著名的位置。最終期望的結果是粒子群收斂到最優解。重要的是要提到粒子群算法不使用梯度下降,所以它可以用于非線性問題,只要它不要求問題必須是可微的。
C++/Python代碼可參考該倉庫。
2. 涌現復雜性
涌現復雜性(Emergent Complexity)是一種現象,描述了大群體的各個組成部分如何以相同但更簡單的規則一起工作,以創建多樣而復雜的系統。有一些自然的復雜行為可以作為涌現的例子。例如,螞蟻本能地相互交流,以建立一個活的橋梁,在尋找食物來源時最小化交換距離(Video)。鳥類相互跟隨,形成更大的群體,這增加了它們發現捕食者和食物來源的可能性。不像通常的復雜性(complexity)概念,它不一定有用,自然復雜性(natural complexity)是一百萬年自然選擇過程的結果,在這個過程中,能源的使用是增加生存機會的最重要因素。因此,如果同一個問題有兩個解決方案,更簡單、需要更少能量的方法將因自然選擇而存在。這就是為什么大自然建議的解決方案會很簡單,但仍然能有效地盡可能減少動物的能量消耗。因此,科學家們分別觀察了一群歐椋鳥(starlings,八哥😸)中的每只鳥,發現它們中的每只都采取簡單的行動來形成復雜的結構。
- 每只鳥都有自己的位置和速度;
- 每只鳥都有自己的視野,可以跟隨周圍的鳥。這只鳥完全不知道超出此范圍的動作。
- 如果有任何鳥類發現食物,則該群中的所有鳥類都將趨向該方向。
3. 鳥群智能建模
在自然界中,在一個數值問題中,任何boid(類似鳥的物體)的可觀察到的鄰近區域都被限制在一定的范圍內。因此,它可以收斂到一些局部極小值(minima)或鞍點(saddle point),其中梯度(在該情況下對應的是速度)將為0。然而,擁有一個以上的boid可以讓鳥群中的所有鳥關注到誤差函數的更大范圍,并且如果它們中的任何一只在誤差方面看到了更好的位置,就不會陷入局部極小值。對上述原則進行數學建模,使群體找到誤差函數的全局最小值。
f(x)= x2+y2 的函數圖像- 每個boid都有自己的位置和速度。我們可以把速度看作誤差函數的偏導數的向量。
- 每個boid都記錄了它所經歷過的最佳位置,這在一定程度上影響了boid的當前速度。
- 這將是整群鳥見過的最好的位置。因此,它會以預定的速率影響所有boid的速度。
通過使用上述規則,我們可以輕松得出將驅動每個boid的數學方程式。
在以上等式中:
- www:表示慣性,決定了boid的當前速度對 ΔV\Delta VΔV 的影響程度;
- c1,c2c_1, c_2c1?,c2?:定義了boid和swarm的最佳記錄位置(best-recorded position)將如何分別影響 ΔV\Delta VΔV;
w,c1,c2,learningRatew, c_1, c_2, learningRatew,c1?,c2?,learningRate 是在優化過程中應微調的超參數。
粒子群優化算法偽代碼:
其中:
- Vi(k+1)V_i(k+1)Vi?(k+1) 是下一個迭代速度;
- WWW 是慣性參數。該參數影響最后速度值給定的運動傳播。
- C1,C2C_1, C_2C1?,C2? 是加速度系數。 C1C_1C1? 賦予個體最佳值的重要性,而 C2C_2C2? 則代表群體最佳值的重要性。
- PiP_iPi?是個體最佳位置,PgP_gPg? 是群體最佳位置。在方程式中,衡量了每個參數到粒子實際位置的距離。
- rand1rand_1rand1? 和 rand2rand_2rand2? 是隨機數,其中 0≤rand≤10≤rand≤10≤rand≤1,它們控制每個值的影響:群體和個體,如下所示。
4. 代碼實現
使用Python來實現對群體智能背(swarm intelligence)后的數學理論進行了討論和建模。為了測試算法,Rastrigin函數將被用作誤差函數,這是優化問題中最具挑戰性的函數之一。在平面上有很多余弦振蕩會引入無數的局部極小值,在這些極小值中,boid會卡住。(圖自:Source)
如上所述,每個boid都將具有位置,速度,誤差,最佳位置和已知誤差(best-known error)。我們還應該編寫一個setter函數來在需要時修改參數。
class Particle:def __init__(self, dim, minx, maxx):self.position = np.random.uniform(low=minx, high=maxx, size=dim)self.velocity = np.random.uniform(low=minx, high=maxx, size=dim)self.best_part_pos = self.position.copy()self.error = error(self.position)self.best_part_err = self.error.copy()def setPos(self, pos):self.position = posself.error = error(pos)if self.error < self.best_part_err:self.best_part_err = self.errorself.best_part_pos = pos粒子群算法類將由誤差函數表面上的移動粒子列表組成。要初始化函數,需要函數的維數、boids的數量以及紀元的數量。
class PSO:w = 0.729c1 = 1.49445c2 = 1.49445lr = 0.01def __init__(self, dims, numOfBoids, numOfEpochs):self.swarm_list = [self.Particle(dims, -500, 500) for i in range(numOfBoids)]self.numOfEpochs = numOfEpochsself.best_swarm_position = np.random.uniform(low=-500, high=500, size=dims)self.best_swarm_error = 1e80 # Set high value to best swarm error最后,編寫代碼來找到最佳優化誤差函數的位置。首先,在每個時期,每個粒子都被逐個挑選并優化其位置。一旦粒子的位置更新,“如果”語句檢查它是否是粒子群的最佳位置。
def optimize(self):for i in range(self.numOfEpochs):for j in range(len(self.swarm_list)):current_particle = self.swarm_list[j] # get current particleVcurr = grad_error(current_particle.position) # calculate current velocity of the particledeltaV = self.w * Vcurr \+ self.c1 * (current_particle.best_part_pos - current_particle.position) \+ self.c2 * (self.best_swarm_position - current_particle.position) # calculate delta Vnew_position = self.swarm_list[j].position - self.lr * deltaV # calculate the new positionself.swarm_list[j].setPos(new_position) # update the position of particleif error(new_position) < self.best_swarm_error: # check the position if it's best for swarmself.best_swarm_position = new_positionself.best_swarm_error = error(new_position)print('Epoch: {0} | Best position: [{1},{2}] | Best known error: {3}'.format(i,self.best_swarm_position[0],self.best_swarm_position[1],self.best_swarm_error))運行PSO并觀察算法的性能。
pso = PSO(dims=2, numOfBoids=30, numOfEpochs=500) pso.optimize() ... Epoch: 27 | Best position: [2.1199768747964054,-1.1332450655810595] | Best known error: 11.792438949384607 Epoch: 28 | Best position: [2.1199768747964054,-1.1332450655810595] | Best known error: 11.792438949384607 Epoch: 29 | Best position: [2.1199768747964054,-1.1332450655810595] | Best known error: 11.792438949384607 Epoch: 30 | Best position: [2.1199768747964054,-1.1332450655810595] | Best known error: 11.792438949384607 Epoch: 31 | Best position: [2.1199768747964054,-1.1332450655810595] | Best known error: 11.792438949384607 Epoch: 32 | Best position: [1.0839903018536725,-1.1678886593978168] | Best known error: 8.966098069909691從下面的等高線圖可以很容易地看出,swarm只需要幾個紀元就能收斂到Rastrigin函數的全局最小值。要獲得創建輪廓可視化的代碼以及過程的錯誤時期圖,可以參考:T. Ahadli, Particle Swarm Optimization C++/Python Project Codes。
完整代碼
5. Conclusion
總而言之,粒子群優化(Particle Swarm Optimization)模擬了鳥或魚群的集體行為。它受益于自然界解決自身優化問題的方式,以最大限度地減少能量使用。自然的設計和原理在計算機科學問題上有很多出色的實際應用。
參考資料
Nature-Inspired Optimization Algorithms: Particle Swarm Optimization Using Python
Implementing the Particle Swarm Optimization (PSO) Algorithm in Python
總結
以上是生活随笔為你收集整理的【优化算法】粒子群优化算法简介的全部內容,希望文章能夠幫你解決所遇到的問題。