【群體智能優化算法系列 】一 粒子群算法 (Particle Swarm Optimization, PSO)

【群體智能優化算法系列 】一 粒子算法

  • 一:前言
  • 二:算法原理
    • 2.1 核心思想
    • 2.2 PSO核心公式?
    • 2.3 PSO算法流程圖
  • 三:python實現 二維Rastrigin函數 最低點檢索例子
  • 參考

一:前言

粒子群算法是由Kennedy和Eberhart在1995年提出的一種基于群體智能的優化算法。該算法模擬鳥群覓食行為,通過粒子間的信息共享和協作來尋找最優解。

二:算法原理

2.1 核心思想

粒子群算法的核心思想可以通過鳥群找食物的故事?理解,

假設一群小鳥在森林里找食物(最優解):
?(1)每只鳥不知道食物在哪,但能感知自己當前位置離食物有多遠(通過目標函數計算適應度)。

(2)?小鳥們會交流?:每只鳥記住自己飛過的最好位置(個體經驗),同時整個鳥群知道所有鳥中最好的位置(群體經驗)。

?(3)飛行策略?:每只鳥決定下一步飛哪里時,會綜合三個方向:

  • 慣性方向?:保持原來的飛行方向(不想急轉彎)。
  • ?個體經驗方向?:飛向自己曾經找到過食物的地方。
  • ?群體經驗方向?:飛向鳥群中其他鳥找到食物最多的地方。

?(4)動態調整?:小鳥們一邊飛一邊更新信息,最終整個鳥群會逐漸聚集到食物最豐富的位置

2.2 PSO核心公式?

PSO核心公式
在這里插入圖片描述在這里插入圖片描述

2.3 PSO算法流程圖

在這里插入圖片描述

三:python實現 二維Rastrigin函數 最低點檢索例子

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from mpl_toolkits.mplot3d import Axes3D
import time# 設置matplotlib支持中文顯示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = Falsedef fitness_function(position):"""目標函數:二維Rastrigin函數"""x, y = positionreturn 20 + (x**2 - 10 * np.cos(2 * np.pi * x)) + (y**2 - 10 * np.cos(2 * np.pi * y))def pso_optimization(func, bounds, n_particles=30, max_iter=50, w=0.7, c1=1.5, c2=1.5):"""粒子群優化算法實現"""dim = len(bounds)# 初始化粒子群particles = {'position': np.array([np.random.uniform(low, high, n_particles) for (low, high) in bounds]).T,'velocity': np.zeros((n_particles, dim)),'best_position': np.zeros((n_particles, dim)),'best_fitness': np.full(n_particles, np.inf),'history': []  # 存儲迭代歷史}# 初始全局最優global_best_pos = np.zeros(dim)global_best_fit = np.inf# 計算初始適應度for i in range(n_particles):fitness = func(particles['position'][i])particles['best_position'][i] = particles['position'][i].copy()particles['best_fitness'][i] = fitnessif fitness < global_best_fit:global_best_fit = fitnessglobal_best_pos = particles['position'][i].copy()particles['history'].append({'positions': particles['position'].copy(),'global_best': global_best_pos.copy()})# 主循環for t in range(max_iter):for i in range(n_particles):# 更新速度和位置r1, r2 = np.random.rand(), np.random.rand()particles['velocity'][i] = (w * particles['velocity'][i] +c1 * r1 * (particles['best_position'][i] - particles['position'][i]) +c2 * r2 * (global_best_pos - particles['position'][i]))# 更新位置particles['position'][i] += particles['velocity'][i]# 邊界處理for d in range(dim):low, high = bounds[d]particles['position'][i][d] = np.clip(particles['position'][i][d], low, high)# 計算新適應度new_fitness = func(particles['position'][i])# 更新個體最優if new_fitness < particles['best_fitness'][i]:particles['best_position'][i] = particles['position'][i].copy()particles['best_fitness'][i] = new_fitness# 更新全局最優if new_fitness < global_best_fit:global_best_fit = new_fitnessglobal_best_pos = particles['position'][i].copy()# 記錄本次迭代狀態particles['history'].append({'positions': particles['position'].copy(),'global_best': global_best_pos.copy()})return global_best_pos, global_best_fit, particles['history']def visualize_optimization(history, bounds, func):"""可視化優化過程"""fig = plt.figure()  # 增加圖形寬度以容納colorbar# 控制變量animation_state = {'paused': False,'stopped': False,'current_frame': 0}# 創建函數網格x = np.linspace(bounds[0][0], bounds[0][1], 100)y = np.linspace(bounds[1][0], bounds[1][1], 100)X, Y = np.meshgrid(x, y)Z = np.zeros_like(X)for i in range(X.shape[0]):for j in range(X.shape[1]):Z[i, j] = func([X[i, j], Y[i, j]])# 創建子圖ax1 = fig.add_subplot(121, projection='3d')ax2 = fig.add_subplot(122)# 初始化繪圖元素surf = ax1.plot_surface(X, Y, Z, cmap='viridis', alpha=0.3)particles_3d = ax1.scatter([], [], [], c='red', s=30)best_3d = ax1.scatter([], [], [], c='gold', s=100, marker='*')contour = ax2.contourf(X, Y, Z, 20, cmap='viridis', alpha=0.6)# 添加等高線標簽contour_lines = ax2.contour(X, Y, Z, 10, colors='black', alpha=0.4, linewidths=0.5)ax2.clabel(contour_lines, inline=True, fontsize=8, fmt='%.1f')# 添加顏色條cbar = plt.colorbar(contour, ax=ax2, shrink=0.8)cbar.set_label('適應度值', rotation=270, labelpad=15)particles_2d = ax2.scatter([], [], c='red', s=30, alpha=0.7)best_2d = ax2.scatter([], [], c='gold', s=100, marker='*')# 設置標簽和標題ax1.set_xlabel('X')ax1.set_ylabel('Y')ax1.set_zlabel('f(X,Y)')ax1.view_init(elev=30, azim=45)ax2.set_xlabel('X')ax2.set_ylabel('Y')ax2.set_xlim(bounds[0])ax2.set_ylim(bounds[1])# 創建動畫函數def on_key_press(event):"""鍵盤事件處理"""if event.key == ' ':  # 空格鍵暫停/繼續animation_state['paused'] = not animation_state['paused']status = "暫停" if animation_state['paused'] else "繼續"print(f"動畫{status}")def show_final_results():"""顯示最終結果并暫停"""final_frame = len(history) - 1final_positions = history[final_frame]['positions']final_best = history[final_frame]['global_best']# 更新到最終狀態particles_3d._offsets3d = (final_positions[:, 0], final_positions[:, 1], [func(p) for p in final_positions])best_3d._offsets3d = ([final_best[0]], [final_best[1]], [func(final_best)])particles_2d.set_offsets(final_positions)best_2d.set_offsets([final_best])# 更新標題顯示最終結果final_fitness = func(final_best)ax1.set_title(f'優化完成! 總迭代: {final_frame}\n最優值: {final_fitness:.6f}\n最優位置: [{final_best[0]:.3f}, {final_best[1]:.3f}]')ax2.set_title(f'最終結果 - 誤差: {abs(final_fitness):.6f}')plt.draw()print(f"\n=== 優化結果 ===")print(f"最優位置: [{final_best[0]:.6f}, {final_best[1]:.6f}]")print(f"最優適應度值: {final_fitness:.6f}")print(f"理論最優值: 0.0000 (在位置 [0, 0])")print(f"誤差: {abs(final_fitness):.6f}")print("\n按任意鍵關閉窗口...")# 等待用戶輸入input()def update(frame):# 檢查是否被停止if animation_state['stopped']:return particles_3d, best_3d, particles_2d, best_2d# 檢查是否暫停if animation_state['paused']:return particles_3d, best_3d, particles_2d, best_2danimation_state['current_frame'] = frame# 當前迭代數據positions = history[frame]['positions']global_best = history[frame]['global_best']# 更新3D散點圖particles_3d._offsets3d = (positions[:, 0], positions[:, 1], [func(p) for p in positions])best_3d._offsets3d = ([global_best[0]], [global_best[1]], [func(global_best)])# 更新2D散點圖particles_2d.set_offsets(positions)best_2d.set_offsets([global_best])# 更新標題current_fitness = func(global_best)ax1.set_title(f'迭代 {frame}/{len(history)-1}\n當前最優值: {current_fitness:.4f}\n[空格]暫停')ax2.set_title(f'等高線圖 - 迭代 {frame}')# 如果是最后一幀,自動顯示最終結果if frame == len(history) - 1:ani.event_source.stop()# 延遲顯示最終結果plt.pause(0.5)  # 短暫暫停show_final_results()return particles_3d, best_3d, particles_2d, best_2d# 連接鍵盤事件fig.canvas.mpl_connect('key_press_event', on_key_press)# 創建動畫ani = FuncAnimation(fig, update, frames=len(history), interval=200, blit=False, repeat=False)  # 改為不重復plt.tight_layout(pad=2.0)  # 增加邊距以確保文字完整顯示# 顯示操作提示print("\n=== 操作說明 ===")print("[空格鍵] - 暫停/繼續動畫")print("[關閉窗口] - 退出程序")print("==================\n")return ani, figdef main():# 設置函數搜索邊界bounds = [(-5.12, 5.12), (-5.12, 5.12)]print("正在運行粒子群優化算法...")# 運行PSO優化best_pos, best_fit, history = pso_optimization(fitness_function, bounds)print(f"\n算法執行完成!")print(f"最優解位置: [{best_pos[0]:.6f}, {best_pos[1]:.6f}]")print(f"最優值: {best_fit:.6f}")# 可視化優化過程ani, fig = visualize_optimization(history, bounds, fitness_function)# 顯示實時動畫print("正在啟動粒子群算法可視化...")try:plt.show()except KeyboardInterrupt:print("\n程序被用戶中斷")print("程序結束")if __name__ == "__main__":main()

參考

【1】 粒子群優化算法(Particle Swarm Optimization, PSO)的詳細解讀
【2】一篇文章搞懂PSO(粒子群算法)理論講解+Python代碼示例講解

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

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

相關文章

Jupyter notebook調試:設置斷點運行

寫了一段小代碼&#xff0c;主要是用來測試一段序列的k均值聚類效果&#xff1b; 中間想到debug一下&#xff0c;但是想到自己似乎從來沒有正式地接觸過jupyter notebook中地debug&#xff0c;平時也只是多開幾個cell&#xff0c;然后在其他cell中復制粘貼部分代碼&#xff0c…

[12-2] BKP備份寄存器RTC實時時鐘 江協科技學習筆記(14個知識點)

1 2 3 4 5 6 7 8 RTC是“Real-Time Clock”的縮寫&#xff0c;中文意思是“實時時鐘”。這是一種在電子設備中使用的時鐘&#xff0c;它能夠提供準確的時間信息&#xff0c;即使在設備斷電的情況下也能繼續運行&#xff0c;因為它通常由一個小型電池供電。RTC廣泛應用于計算機…

優化給AI的“提問技巧”(提示工程),讓大型語言模型(比如GPT)更好地扮演“心理治療助手”的角色

優化給AI的“提問技巧”(提示工程),讓大型語言模型(比如GPT)更好地扮演“心理治療助手”的角色 尤其是在“問題解決療法”(PST)中幫助 caregivers(家庭護理者)緩解焦慮、疲勞等心理癥狀。以下是核心內容的通俗解讀: 一、研究背景:AI當心理醫生靠譜嗎? 現狀:全球…

Java的lambda表達式應用

Lambda表達式是Java 8引入的一項強大特性&#xff0c;它允許以更加簡潔的方式表示匿名函數。Lambda表達式不僅讓代碼更加簡潔、清晰&#xff0c;而且為函數式編程提供了有力支持&#xff0c;從而提升了Java語言的表達能力。 本文主要講解lambda應用stream處理集合的應用。 1、…

云原生/容器相關概念記錄

文章目錄 網絡與虛擬化技術云平臺與架構容器與編排容器網絡方案性能優化與工具硬件與協議 網絡與虛擬化技術 P4可編程網關 P4: Programming Protocol-independent Packet Processors一種基于P4語言的可編程網絡設備&#xff0c;支持自定義數據包處理邏輯。P4可編程技術詳解&am…

[C++] traits機制

文章目錄 C之type_traitsis_floating_point<T> ..的使用std::enable_if<T>::type的使用std::remove_cv 如何自定義traits C之type_traits is_floating_point …的使用 一般在定義打印模板函數的時候&#xff0c;當我們用printf進行終端日志打印&#xff0c;需要根…

OpenCV 視頻處理與保存

一、知識點 1、VideoCapture類 (1)、用于從視頻文件、攝像機或圖像序列中捕獲視頻幀。 (2)、構造函數 VideoCapture(const String & filename, int apiPreference CAP_ANY) a、filename可以是視頻文件的名稱(例如"video.avi")&#xff0c;可以是圖…

【Leetcode】字符串之二進制求和、字符串相乘

文章目錄 算法原理二進制求和題目鏈接題目描述解題思路代碼 字符串相乘題目鏈接題目描述解題思路代碼 算法原理 這兩道題都是屬于算法里一種經典題型&#xff1a;高精度加/減/乘/除法&#xff0c;需要我們模擬加/減/乘/除 列豎式運算。 二進制求和 題目鏈接 題目鏈接 題目描…

MongoDB:索引

目錄 1、索引數據結構&#xff1a;B-樹 2、索引類型 2.1 單字段索引 2.2 復合索引&#xff08;最重要&#xff01;&#xff09; 2.3 多鍵索引&#xff08;數組字段&#xff09; 2.4 地理空間索引 2.5 全文索引 2.6 哈希索引&#xff08;分片專用&#xff09; 2.7 TTL …

【大模型】Transformer架構完全解讀:從“盲人摸象“到“通曉萬物“的AI進化論

&#x1f916; Transformer架構完全解讀&#xff1a;從"盲人摸象"到"通曉萬物"的AI進化論 —— 一位大模型探索者的技術日記 ? 第一章&#xff1a;為什么說Transformer是AI界的"蒸汽機革命"&#xff1f; 1.1 從RNN到Transformer&#xff1a;…

JavaEE:使用JMeter進行接口并發測試

一、下載與安裝&#xff1a; 1.下載apache-jmeter-5.6.3.zip&#xff1a; https://jmeter.apache.org/download_jmeter.cgi 2.解壓到D:\Program Files\apache-jmeter-5.6.3目錄 3.添加JDK環境配置到D:\Program Files\apache-jmeter-5.6.3\bin\jmeter.bat文件開頭&#xff1…

【筆記】MSYS2 的 MinGW64 環境中正確安裝 Python 相關環境管理工具 (Poetry、Virtualenv、Pipenv 和 UV)

MSYS2 環境配置與 Python 項目依賴管理筆記_msys更新python-CSDN博客 【技術筆記】MSYS2 指定 Python 版本安裝方案_pacman -u 安裝指定版本-CSDN博客 更多關于 MSYS2 開發環境的配置&#xff0c;請查看往期筆記。 簡介 本筆記將記錄我們在 MSYS2 的 MinGW64 環境中安裝 Pytho…

ubuntu添加域名解析服務器地址

在 Ubuntu 中配置域名解析主要有兩種方式&#xff1a;靜態修改 /etc/hosts 文件 和 動態修改 DNS 解析服務器配置。以下是詳細操作指南&#xff1a; 建議優選:二、永久方案&#xff1a;修改 DNS 解析服務&#xff08;推薦&#xff09;中的方法1 一、臨時方案&#xff1a;修改…

通過 AIOps 、生成式 AI 和機器學習實現更智能的可觀測性

支持 AIOps 的理由 人工智能運維&#xff08;AIOps&#xff09;是將人工智能&#xff08;AI&#xff09;、機器學習&#xff08;ML&#xff09;和分析技術應用于提升 IT 運維團隊日常工作的過程。簡單來說&#xff0c;AIOps 是軟件系統通過 AI 和 ML 以及相關分析技術來簡化和…

【DataWhale組隊學習】AI辦公實踐與應用

AI辦公-PPT制作 1. 使用大模型制作PPT的常見流程 使用大模型生成PPT的文稿將文稿的內容喂給可以直接生成PPT的大模型&#xff0c;生成PPT 2. 使用大模型生成PPT文稿 我們可以先使用上一章提過的那些大模型去生成一個PPT的文稿。那根據上一章的內容&#xff0c;我們想要去讓…

人機融合智能 | 人智交互中的機器行為設計與管理

以人工智能為代表的科學技術正在深入地塑造和改變著人類的社會、文化和經濟等,在“無所不在的算法與智能”的時代,了解智能機器的行為對于設計智能行為并使其造福于人類,對于智能機器的設計者、開發者和使用者,都具有重要意義。機器行為研究從學科交叉的視角,將智能機器行為置于…

langChainv0.3學習筆記(高級篇)

目錄 工具創建工具從函數創建工具tool 裝飾器結構化工具 從可運行對象創建工具子類化 BaseTool如何創建異步工具處理工具錯誤返回工具執行的artifact 使用內置工具和工具包自定義默認工具如何使用內置工具包 使用聊天模型調用工具定義工具模式Python 函數LangChain 工具Pydanti…

UiAutomator2 與 Appium 對比分析:安卓自動化測試框架的選擇指南

目錄 一、基礎介紹UiAutomator2Appium 二、功能對比三、架構差異UiAutomator2 架構簡圖&#xff1a;Appium 架構簡圖&#xff1a; 四、使用場景分析五、優缺點總結UiAutomator2 優點&#xff1a;UiAutomator2 缺點&#xff1a;Appium 優點&#xff1a;Appium 缺點&#xff1a; …

缺失的第一個正整數

繼續每日一題 今天給大家帶來一道將數組視為哈希表的算法 題目描述&#xff1a; 給你一個未排序的整數數組 nums &#xff0c;請你找出其中沒有出現的最小的正整數。 請你實現時間復雜度為 O(n) 并且只使用常數級別額外空間的解決方案。 題目示例&#xff1a; 由于題目要求…

單例模式-Python示例

單例模式 單例模式&#xff08;Singleton Pattern&#xff09;是設計模式中一種創建型模式&#xff0c;廣泛應用于軟件開發中。一以下以故事化的方式&#xff0c;結合詳細的技術講解&#xff0c;介紹單例模式的背景、定義、適用場景&#xff0c;并提供python的示例代碼。 故事…