【智能優化算法】粒子群優化算法(PSO)【附python實現代碼】

寫在前面:
首先感謝兄弟們的訂閱,讓我有創作的動力,在創作過程我會盡最大能力,保證作品的質量,如果有問題,可以私信我,讓我們攜手共進,共創輝煌。

路雖遠,行則將至;事雖難,做則必成。只要有愚公移山的志氣、滴水穿石的毅力,腳踏實地,埋頭苦干,積跬步以至千里,就一定能夠把宏偉目標變為美好現實。

歷史文章回顧:
灰狼優化算法:【智能優化算法】灰狼優化算法【附python實現代碼】
白鯨優化算法:【智能優化算法】白鯨優化算法【附python實現代碼】
【智能優化算法】粒子群優化KNN分類算法【附python實現代碼】
【智能優化算法】粒子群優化隨機森林分類算法【附python實現代碼】
【智能優化算法】粒子群優化LightGBM分類算法【附python實現代碼】
【模型參數優化】隨機搜索對隨機森林分類模型進行參數尋優【附python實現代碼】
【模型參數優化】網格搜索對隨機森林分類模型進行參數尋優【附python實現代碼】
【模型參數優化】網格搜索對KNN分類模型進行參數尋優【附python實現代碼】
【模型參數優化】網格搜索對XGBoost分類模型進行參數尋優【附python實現代碼】
【模型參數優化】網格搜索對GBDT分類模型進行參數尋優【附python實現代碼】
【模型參數優化】網格搜索對SVM分類模型進行參數尋優【附python實現代碼】
【模型參數優化】隨機搜索對SVM分類模型進行參數尋優【附python實現代碼】

1、介紹

1.1、PSO算法起源

1995年,受到鳥群覓食行為的規律性啟發,James Kennedy和Russell Eberhart建立了一個簡化算法模型,經過多年改進最終形成了粒子群優化算法(Particle Swarm Optimization, PSO) ,也可稱為粒子群算法。

1.2、PSO算法特點

粒子群算法具有收斂速度快、參數少、算法簡單易實現的優點(對高維度優化問題,比遺傳算法更快收斂于最優解),但是也存在陷入局部最優解的問題,因此依賴于良好的初始化。

1.3、PSO算法基本思想

粒子群算法的思想源于對鳥群覓食行為的研究,鳥群通過集體的信息共享使群體找到最優的目的地。如下圖,設想這樣一個場景:鳥群在森林中隨機搜索食物,它們想要找到食物量最多的位置。但是所有的鳥都不知道食物具體在哪個位置,只能感受到食物大概在哪個方向。每只鳥沿著自己判定的方向進行搜索,并在搜索的過程中記錄自己曾經找到過食物且量最多的位置,同時所有的鳥都共享自己每一次發現食物的位置以及食物的量,這樣鳥群就知道當前在哪個位置食物的量最多。在搜索的過程中每只鳥都會根據自己記憶中食物量最多的位置和當前鳥群記錄的食物量最多的位置調整自己接下來搜索的方向。鳥群經過一段時間的搜索后就可以找到森林中哪個位置的食物量最多(全局最優解)。

在這里插入圖片描述

2、算法基本原理

2.1 對應關系

將鳥群覓食行為和算法原理對應,如下表所示:

鳥群覓食粒子群算法
粒子
森林求解空間
食物的量目標函數值(適應值)
每只鳥所處的位置空間中的一個解(粒子位置)
食物量最多的位置全局最優解

2.2 基礎知識

  • PSO的基礎:信息的社會共享
  • 粒子的兩個屬性:速度和位置(算法的兩個核心要素)
    速度表示粒子下一步迭代時移動的方向和距離,位置是所求解問題的一個解。
  • 算法的6個重要參數
    在這里插入圖片描述
  • 粒子群算法的流程圖
    在這里插入圖片描述
  • 粒子群算法的偽代碼
    在這里插入圖片描述

3、速度更新公式

表述上叫速度,實際上就是粒子下一步迭代移動的距離和方向,也就是一個位置向量。
在這里插入圖片描述

3.1、速度更新公式的解釋

  • 第1項:慣性部分
    由慣性權重和粒子自身速度構成,表示粒子對先前自身運動狀態的信任。
  • 第2項:認知部分
    表示粒子本身的思考,即粒子自己經驗的部分,可理解為粒子當前位置與自身歷史最優位置之間的距離和方向。
  • 第3項:社會部分
    表示粒子之間的信息共享與合作,即來源于群體中其他優秀粒子的經驗,可理解為粒子當前位置與群體歷史最優位置之間的距離和方向。

3.2、速度更新公式的參數定義

在這里插入圖片描述

3.3、速度方向

粒子下一步迭代的移動方向 = 慣性方向 + 個體最優方向 + 群體最優方向
在這里插入圖片描述

4、位置更新公式

上一步的位置 + 下一步的速度
在這里插入圖片描述

5、PSO算法參數的詳細解釋

5.1、粒子群規模:N

一個正整數,推薦取值范圍:[20,1000],簡單問題一般取20-40,較難或特定類別的問題可以取100-200。較小的種群規模容易陷入局部最優;較大的種群規模可以提高收斂性,更快找到全局最優解,但是相應地每次迭代的計算量也會增大;當種群規模增大至一定水平時,再增大將不再有顯著的作用。

5.2、粒子維度:D

粒子搜索的空間維數即為自變量的個數。

5.3、迭代次數:K

推薦取值范圍:[50,100],典型取值:60、70、100;這需要在優化的過程中根據實際情況進行調整,迭代次數太小的話解不穩定,太大的話非常耗時,沒有必要。

5.4、慣性權重:w

1998年,Yuhui Shi和Russell Eberhart對基本粒子群算法引入了慣性權重(inertia weight),并提出動態調整慣性權重以平衡收斂的全局性和收斂速度,該算法被稱為標準PSO算法(本文所介紹)【Shi Y . A Modified Particle Swarm Optimizer[C]// Proc of IEEE Icec Conference. 1998.】。

  • 參數意義
    慣性權重w表示上一代粒子的速度對當代粒子的速度的影響,或者說粒子對當前自身運動狀態的信任程度,粒子依據自身的速度進行慣性運動。慣性權重使粒子保持運動的慣性和搜索擴展空間的趨勢。w值越大,探索新區域的能力越強,全局尋優能力越強,但是局部尋優能力越弱。反之,全局尋優能力越弱,局部尋優能力強。較大的w有利于全局搜索,跳出局部極值,不至于陷入局部最優;而較小的w有利于局部搜索,讓算法快速收斂到最優解。當問題空間較大時,為了在搜索速度和搜索精度之間達到平衡,通常做法是使算法在前期有較高的全局搜索能力以得到合適的種子,而在后期有較高的局部搜索能力以提高收斂精度,所以w不宜為一個固定的常數。當w=0時,退化成基本粒子群算法,當w=1時,失去對粒子本身經驗的思考。推薦取值范圍:[0.4,2],典型取值:0.9、1.2、1.5、1.8。
  • 改善慣性權重
    在解決實際優化問題時,往往希望先采用全局搜索,使搜索空間快速收斂于某一區域,然后采用局部精細搜索以獲得高精度的解。因此提出了自適應調整的策略,即隨著迭代的進行,線性地減小w的值。這里提供一個簡單常用的方法——線性變化策略:隨著迭代次數的增加,慣性權重w不斷減小,從而使得粒子群算法在初期具有較強的全局收斂能力,在后期具有較強的局部收斂能力。
    在這里插入圖片描述

5.5、學習因子:c1、c2

也稱為加速系數或加速因子(這兩個稱呼更加形象地表達了這兩個系數的作用)
在這里插入圖片描述

6、PSO算法的其他重要概念和技巧

6.1、適應值(fitness values)

即優化目標函數的值,用來評價粒子位置的好壞程度,決定是否更新粒子個體的歷史最優位置和群體的歷史最優位置,保證粒子朝著最優解的方向搜索。

6.2、位置限制

限制粒子搜索的空間,即自變量的取值范圍,對于無約束問題此處可以省略。

6.3、速度限制

為了平衡算法的探索能力與開發能力,需要設定一個合理的速度范圍,限制粒子的最大速度 ,即粒子下一步迭代可以移動的最大距離。
Vmax較大時,粒子飛行速度快,探索能力強,但粒子容易飛過最優解;
Vmax較小時,飛行速度慢,開發能力強,但是收斂速度慢,且容易陷入局部最優解;
Vmax一般設為粒子變化范圍的10%~20%,可根據實際情況調試,但不能大于粒子(解)的變化范圍。

6.4、優化停止準則

停止準則一般有兩種:

  • 最大迭代步數:達到最大迭代次數停止
  • 可接受的滿意解:上一次迭代后最優解的適應值與本次迭代后最優解的適應值之差小于某個值后停止優化

6.5、初始化

粒子群算法優化的結果受很多因素的影響,其中受粒子初始值的影響比較大,而且較難調控。如果粒子初始值是隨機初始化的,在不改變任何參數的情況下,多次優化的結果不一定都收斂到一個全局或局部最優解,也可能會得到一個無效解。所以粒子初始化是一個十分重要的步驟,它關系到整個優化過程中優化收斂的速度與方向。如果粒子的初始化范圍選擇得好的話可以大大縮短優化的收斂時間,也不易陷入局部最優解。需要根據具體的問題進行分析,如果根據經驗判斷出最優解一定在某個范圍內,則就在這個范圍內初始化粒子。如果無法確定,則以粒子的取值邊界作為初始化范圍。

7、Python代碼實現

使用scikit-opt庫實現PSO

先安裝

pip install scikit-opt
# -*- coding: utf-8 -*-
"""
Created on Sat May 25 09:37:28 2024@author: 63454
"""def demo_func(x):x1, x2, x3 = xreturn x1 ** 2 + (x2 - 0.05) ** 2 + x3 ** 2# %% Do PSO
from sko.PSO import PSOpso = PSO(func=demo_func, n_dim=3, pop=40, max_iter=100, lb=[0, -1, 0.5], ub=[1, 1, 1], w=0.8, c1=0.5, c2=0.5)
pso.run()
print('best_x is ', pso.gbest_x, 'best_y is', pso.gbest_y)# %% Plot the result
import matplotlib.pyplot as plt
plt.xlabel("iterators", size=11)
plt.ylabel("fitness", size=11)
plt.plot(pso.gbest_y_hist)
# plt.plot(pso.gbest_y_hist, color='b', linewidth=2)
plt.show()

在這里插入圖片描述

參考資料

https://github.com/TimePickerWang/MachineLearning/blob/master/MachineLearning/OptAlgorithm/PSO.py
https://blog.csdn.net/xyisv/article/details/79058574
https://zhuanlan.zhihu.com/p/346355572?utm_id=0&eqid=b544778f00000f69000000066527b08b
https://github.com/guofei9987/scikit-opt/blob/master/examples/demo_pso.py
https://scikit-opt.github.io/scikit-opt/#/zh/more_sa
https://www.omegaxyz.com/2017/05/04/introductionofpso/
https://zhuanlan.zhihu.com/p/63956652

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15146.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15146.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15146.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【軟件設計師】下午題總結-數據流圖、數據庫、統一建模語言

下午題總結 1 試題一1.1 結構化語言 2 試題二弱實體增加權限增加實體間聯系和聯系的類型 3 試題三3.1 UML關系例子 3.2 例子(2016上半年)3.3 設計類分類3.3.1 接口類3.3.2 控制類3.3.3 實體類 3.4 簡答題3.4.1 簡要說明選擇候選類的原則3.4.2 某個類必須…

Kafka SSL認證

證書生成 在kafka安裝目錄下/certificates生成keystore和trust文件,在其中一臺機器聲生成證書,然后將 生成的server.keystore.jks和server.truststore.jks文件拷貝其他broker節點上去即可 1.生成keystore [rootm1 certificates]# keytool -keystore se…

Mantine UI:簡潔、靈活的 React UI 庫

介紹 Mantine UI Mantine UI 是一個由 React 驅動的現代 UI 庫,旨在簡化開發人員構建用戶界面的過程。它提供了一系列經過優化和可訪問的組件,適用于各種項目,從簡單的網站到復雜的應用程序。Mantine UI 的特點包括: 可定制性&a…

Android-okhttp調接口傳參簡單舉例

步驟1:在主線程中創建thread調接口 new Thread(new Runnable() {Overridepublic void run() {getServiceList();}}).start();步驟2:okhttp調接口 private void getServiceList(){Message msg new Message();try{OkHttpClient okHttpClient new OkHttp…

【網絡安全】網絡安全協議的重要性

一.網絡安全 1.什么是網絡安全 網絡安全(Cyber Security)是指網絡系統的硬件、軟件及其系統中的數據受到保護,不因偶然的或者惡意的原因而遭受到破壞、更改、泄露,系統連續可靠正常地運行,網絡服務不中斷。 2.網絡安…

WPF密碼輸入框明文掩碼切換

1&#xff0c;效果 2&#xff0c;代碼&#xff1a; WPF的PasswordBox不能像Winform中的PasswordBox那樣&#xff0c;通過PasswordBox.PasswordChar(char)0顯示明文。所以這里使用無外觀控件構筑掩碼明文切換。 無外觀控件遵守Themes/Generic.xaml文件配置. <ResourceDicti…

視覺檢測實戰項目——九點標定

本文介紹九點標定方法 已知 9 個點的圖像坐標和對應的機械坐標,直接計算轉換矩陣,核心原理即最小二乘擬合 {??′=????+????+????′=??′??+??′??+??′ [??1??11??2??21?????9??91][????′????′????′]=[??1′??…

[Linux]磁盤管理

一.Linux磁盤管理的原理 磁盤分區與Linux的目錄是借助"掛載機制"鏈接的&#xff0c;將一個分區與一個目錄連接起來。訪問目錄&#xff0c;相當于訪問某塊分區 lsblk命令: lsblk命令可以查看磁盤分區&#xff0c;以及每個分區所掛載的目錄 lsblk -f 可以查看更細節的…

山東大學軟件學院項目實訓-創新實訓-基于大模型的旅游平臺(十九)- JUC(5)

synchronized優化原理 輕量級鎖 如果一個對象有多個線程訪問&#xff0c;但多線程訪問的時間是錯開的&#xff08;沒有競爭&#xff09;&#xff0c;可以用輕量級鎖優化 Slf4j(topic "c.ExerciseTransfer")public class Test {?static final Object obj new Obj…

關于陽光雨露外派聯想的面試感想

最近在找工作&#xff0c;接到了一個陽光雨露外派聯想的面試邀請。說實在的一開始就有不對勁的感覺。想必這就是大廠的自信吧&#xff0c;上就問能不能現場面試&#xff0c;然后直接發面試邀請。這時候我倒是沒覺得有啥問題。 然后今天就去面試去了&#xff0c;住的比較偏&…

【研發日記】【策劃向】(一)游戲策劃其實就是一道加減法題

文章目錄 序設計的過程其實是控制自己欲望的過程我海納百川&#xff0c;你要不要看看&#xff1f;我跟別人不一樣&#xff01;我的人設就是沒有人設&#xff0c;或者說任何人設都是我的人設 記 序 不知不覺進入這個行業幾年了&#xff0c;也經歷了獨立開發和團隊開發的過程。在…

欣賞倪詩韻青桐斷紋古琴很罕見:萬中無一。

欣賞倪詩韻青桐斷紋古琴很罕見&#xff1a;萬中無一。龍池側簽海門倪詩韻制&#xff0c;帶收藏證書此琴斷紋優美如江面波光粼粼&#xff0c;為流水蛇腹斷&#xff0c;是倪老師作品精品中的精品。細心的朋友可以看出倪老師在這張琴上題字非常小心認真。用一個詞來形容——萬中無…

CPython3.7.9源碼學習一:C語言基礎、整數對象

C 語言基礎 結構體 // struct(關鍵字) 名稱 {結構體成員};// 定義結構體 struct Student { char name[50]; int age; float score; };// 初始化 結構體變量 struct Student stu1; strcpy(stu1.name, "張三"); stu1.age 20; stu1.score 90.5;// 初始化 …

Spring Boot線程池的 使用

一.異步方法 1.啟動類加EnableAsync注解 2.在需要異步執行的方法上添加Async注解 3.直接調用 結論&#xff1a;異步方法是通過SpringBoot中自動注入的線程池任務執行器實現的 二.自定義線程池 1.創建線程的配置類 2.使用Async注解時指定名稱 3.結論 手動注入多個線程池任務執…

Java 18新特性

Java 18引入了一系列新的特性和改進&#xff0c;這些更新覆蓋了從基本語言構造到更高級別的API等多個方面。以下是一些Java 18的主要新特性&#xff1a; 模式匹配增強&#xff1a;Java 18改進了模式匹配功能&#xff0c;使其更加強大和易于使用。開發人員可以使用模式匹配來簡…

Linux echo命令(在終端輸出文本)

文章目錄 Linux Echo命令深度解析簡介命令語法常見選項- -n&#xff1a;不輸出行尾的換行符&#xff0c;這意味著輸出后不會換到下一行。- -e&#xff1a;啟用反斜杠轉義的解釋&#xff0c;允許使用特殊字符。- -E&#xff1a;禁用反斜杠轉義的解釋&#xff08;默認選項&#x…

基于地理坐標的高階幾何編輯工具算法(2)——相交面裁剪

文章目錄 工具步驟應用場景算法輸入算法輸出算法示意圖算法原理后處理 工具步驟 選中一個需要裁剪的面&#xff0c;點擊“相交面裁剪”工具&#xff0c;多選裁剪模板面&#xff0c;空格執行。 應用場景 常用于基于遙感影像的建筑物幾何面編輯。 算法輸入 一個待裁剪的面&a…

sqlserver的查詢(三)

目錄 10. group by(分組) 11. having(對分組后的信息過濾) 可能從這里開始&#xff0c;執行順序越來越顯得重要了&#xff01;&#xff01;&#xff01; 10. group by(分組) 這個查詢相比前面會有一些困難&#xff1b; 格式&#xff1a;group by 字段的集合&#xff1b; 功…

Java進階學習筆記8——單繼承、Object類、方法重寫

Java 是單繼承的&#xff0c;Java中的類不支持多繼承&#xff0c;但是支持多層繼承。 Object類是所有類的父類。 Java不支持多類繼承&#xff1a; Java支持多層繼承&#xff1a; 反證法&#xff1a; Object類&#xff1a; Object類是java所有類的祖宗類&#xff0c;我們寫的任…

AI爆文寫作:我一般不告訴別人的爆文玩法:如何100%抄襲10W+的爆文標題,讓你也篇篇爆款

有現成的10w擺在眼前我們要做的就是&#xff0c;100%抄標題&#xff0c;以及內容重述。 具體操作步驟&#xff1a; 找到適合自己賬號選題的10w(微信看一看或者頭條)100%抄爆文的標題將這篇文章喂給Al&#xff0c;讓AI分析文章的寫法和主題根據提煉出來的寫法和主題&#xff0…