粒子群優化算法(Particle Swarm Optimization, PSO) 求解二維 Rastrigin 函數最小值問題

前言

提醒:
文章內容為方便作者自己后日復習與查閱而進行的書寫與發布,其中引用內容都會使用鏈接表明出處(如有侵權問題,請及時聯系)。
其中內容多為一次書寫,缺少檢查與訂正,如有問題或其他拓展及意見建議,歡迎評論區討論交流。

內容由AI輔助生成,僅經筆者審核整理,請甄別食用。

文章目錄

  • 前言
  • matlab代碼
  • 代碼分析
    • 🧠 一、問題建模
    • 🚀 二、粒子群優化算法核心數學公式
      • 粒子狀態:
      • 更新規則:
    • ?? 三、代碼分析
      • 1. **參數設置**
      • 2. **粒子初始化**
      • 3. **適應度計算**
      • 4. **迭代優化主循環**
        • - 更新速度(核心公式):
        • - 限制速度:
        • - 更新位置:
        • - 更新個體最優和全局最優:
    • 📉 四、收斂性與可視化
    • ? 五、總結與評價


這段 MATLAB 代碼實現的是 粒子群優化算法(Particle Swarm Optimization, PSO) 用于求解二維 Rastrigin 函數最小值問題

我將從 整體框架、數學建模、公式推導和關鍵步驟 的角度詳細分析此算法的原理和實現。


matlab代碼

clc; clear; close all;% ------------------ PSO 參數設置 ------------------
num_particles = 30;        % 粒子數量
max_iter = 100;            % 最大迭代次數
dim = 2;                   % 問題維度
x_min = -5.12;             % 搜索空間下限
x_max = 5.12;              % 搜索空間上限
v_max = (x_max - x_min) / 2;w = 0.7;                   % 慣性權重
c1 = 1.5;                  % 個體學習因子
c2 = 1.5;                  % 社會學習因子% ------------------ 初始化 ------------------
% 初始化位置和速度
x = x_min + rand(num_particles, dim) * (x_max - x_min);
v = zeros(num_particles, dim);% 初始化個體最優
pbest = x;
pbest_val = arrayfun(@(i) rastrigin(x(i,:)), 1:num_particles)';% 初始化全局最優
[gbest_val, idx] = min(pbest_val);
gbest = pbest(idx, :);% ------------------ 迭代優化 ------------------
global_best_history = zeros(max_iter, 1);for iter = 1:max_iterfor i = 1:num_particles% 更新速度v(i,:) = w * v(i,:) ...+ c1 * rand() * (pbest(i,:) - x(i,:)) ...+ c2 * rand() * (gbest - x(i,:));% 限制速度v(i,:) = max(min(v(i,:), v_max), -v_max);% 更新位置x(i,:) = x(i,:) + v(i,:);x(i,:) = max(min(x(i,:), x_max), x_min);  % 限制位置在邊界內% 計算適應度f_val = rastrigin(x(i,:));% 更新個體最優if f_val < pbest_val(i)pbest(i,:) = x(i,:);pbest_val(i) = f_val;end% 更新全局最優if f_val < gbest_valgbest = x(i,:);gbest_val = f_val;endendglobal_best_history(iter) = gbest_val;fprintf('迭代 %d:全局最優值 = %.6f\n', iter, gbest_val);
end% ------------------ 結果展示 ------------------
figure;
plot(global_best_history, 'LineWidth', 2);
xlabel('迭代次數'); ylabel('最優值');
title('PSO 優化 Rastrigin 函數過程');
grid on;fprintf('\n最終最優位置: (%.6f, %.6f)\n', gbest(1), gbest(2));
fprintf('函數值: %.6f\n', gbest_val);% ------------------ Rastrigin 函數 ------------------
function y = rastrigin(x)y = 20 + x(1)^2 + x(2)^2 - 10 * (cos(2 * pi * x(1)) + cos(2 * pi * x(2)));
end

運行結果
在這里插入圖片描述

代碼分析

🧠 一、問題建模

目標是優化 Rastrigin 函數,定義如下:

相關引用:Rastrigin函數簡介

f(x)=10d+∑i=1d[xi2?10cos?(2πxi)]f(\mathbf{x}) = 10d + \sum_{i=1}^{d} \left[ x_i^2 - 10\cos(2\pi x_i) \right] f(x)=10d+i=1d?[xi2??10cos(2πxi?)]

對于本代碼中 d=2d = 2d=2,因此目標函數為:

f(x,y)=20+x2+y2?10cos?(2πx)?10cos?(2πy)f(x, y) = 20 + x^2 + y^2 - 10\cos(2\pi x) - 10\cos(2\pi y) f(x,y)=20+x2+y2?10cos(2πx)?10cos(2πy)

這是一個多峰函數,具有大量局部極小值,全局最小值在 (0,0)(0,0)(0,0),其函數值為 0


🚀 二、粒子群優化算法核心數學公式

粒子狀態:

  • 位置:xit∈Rd\mathbf{x}_i^t \in \mathbb{R}^dxit?Rd
  • 速度:vit∈Rd\mathbf{v}_i^t \in \mathbb{R}^dvit?Rd

更新規則:

粒子速度與位置更新公式如下:

vit+1=w?vit+c1?r1?(pi?xit)+c2?r2?(g?xit)\mathbf{v}_i^{t+1} = w \cdot \mathbf{v}_i^t + c_1 \cdot r_1 \cdot (\mathbf{p}_i - \mathbf{x}_i^t) + c_2 \cdot r_2 \cdot (\mathbf{g} - \mathbf{x}_i^t) vit+1?=w?vit?+c1??r1??(pi??xit?)+c2??r2??(g?xit?)

xit+1=xit+vit+1\mathbf{x}_i^{t+1} = \mathbf{x}_i^t + \mathbf{v}_i^{t+1} xit+1?=xit?+vit+1?

其中:

  • www:慣性權重,控制速度“保留性”
  • c1,c2c_1, c_2c1?,c2?:個體學習因子、社會學習因子
  • r1,r2~U(0,1)r_1, r_2 \sim \mathcal{U}(0, 1)r1?,r2?U(0,1):兩個獨立隨機數
  • pi\mathbf{p}_ipi?:粒子 iii 的個體最優位置
  • g\mathbf{g}g:所有粒子中的全局最優位置

?? 三、代碼分析

1. 參數設置

num_particles = 30;        % 粒子數量
max_iter = 100;            % 最大迭代次數
dim = 2;                   % 問題維度
x_min = -5.12;             % 搜索空間下限
x_max = 5.12;              % 搜索空間上限
v_max = (x_max - x_min) / 2;w = 0.7;                   % 慣性權重
c1 = 1.5;                  % 個體學習因子
c2 = 1.5;                  % 社會學習因子

設置粒子數量、最大迭代次數、搜索空間邊界、速度最大值、慣性權重等。

2. 粒子初始化

x = x_min + rand(num_particles, dim) * (x_max - x_min); % 位置
v = zeros(num_particles, dim);                          % 速度

數學表示:

xi0=U([xmin?,xmax?]d),vi0=0\mathbf{x}_i^0 = \mathcal{U}([x_{\min}, x_{\max}]^d), \quad \mathbf{v}_i^0 = \mathbf{0} xi0?=U([xmin?,xmax?]d),vi0?=0

每個粒子的初始位置在邊界范圍內隨機選取。


3. 適應度計算

相關引用:“適應度”簡介

pbest_val = arrayfun(@(i) rastrigin(x(i,:)), 1:num_particles)';

pbest_val = arrayfun(@(i) rastrigin(x(i,:)), 1:num_particles)'

  1. 1:num_particles 生成一個從1到num_particles的整數序列,表示粒子群的索引。例如,如果num_particles=30,則生成[1, 2, ..., 30]
  2. @(i) rastrigin(x(i,:)) 這是一個匿名函數(lambda函數),輸入參數為i(粒子索引),輸出為rastrigin(x(i,:)),即第i個粒子的位置向量x(i,:)在Rastrigin函數上的適應度值。
  3. arrayfun arrayfun函數會對1:num_particles中的每個元素i執行匿名函數@(i) rastrigin(x(i,:)),并返回一個結果數組。例如:
    • 如果x是一個30×2的矩陣(30個粒子,每個粒子2維),則arrayfun會依次計算rastrigin(x(1,:)),
      rastrigin(x(2,:)), …, rastrigin(x(30,:)),并返回一個1×30的行向量。
  4. '(轉置符號) 由于arrayfun默認返回行向量,而pbest_val通常需要存儲為列向量(便于后續操作),因此使用轉置符號'將其轉換為列向量。

即計算每個粒子的初始位置的函數值,并記錄為個體最優。

數學表示:

fi0=f(xi0),pi=xi0f_i^0 = f(\mathbf{x}_i^0), \quad \mathbf{p}_i = \mathbf{x}_i^0 fi0?=f(xi0?),pi?=xi0?

全局最優位置 g\mathbf{g}g 是當前所有個體中函數值最小的位置。


4. 迭代優化主循環

for iter = 1:max_iter
- 更新速度(核心公式):
v(i,:) = w * v(i,:) ...+ c1 * rand() * (pbest(i,:) - x(i,:)) ...+ c2 * rand() * (gbest - x(i,:));

數學形式(逐分量):

vi,jt+1=w?vi,jt+c1?r1?(pi,j?xi,jt)+c2?r2?(gj?xi,jt)v_{i,j}^{t+1} = w \cdot v_{i,j}^t + c_1 \cdot r_1 \cdot (p_{i,j} - x_{i,j}^t) + c_2 \cdot r_2 \cdot (g_j - x_{i,j}^t) vi,jt+1?=w?vi,jt?+c1??r1??(pi,j??xi,jt?)+c2??r2??(gj??xi,jt?)

這是 PSO 的經典速度更新方程。

- 限制速度:
v(i,:) = max(min(v(i,:), v_max), -v_max);

防止粒子運動過快,跳出搜索空間。

- 更新位置:
x(i,:) = x(i,:) + v(i,:);
x(i,:) = max(min(x(i,:), x_max), x_min);

即:

xit+1=xit+vit+1\mathbf{x}_i^{t+1} = \mathbf{x}_i^t + \mathbf{v}_i^{t+1} xit+1?=xit?+vit+1?

并保持在合法邊界內。

- 更新個體最優和全局最優:
if f_val < pbest_val(i)pbest(i,:) = x(i,:);pbest_val(i) = f_val;
end
if f_val < gbest_valgbest = x(i,:);gbest_val = f_val;
end

反映出個體記憶和群體協作的機制。


📉 四、收斂性與可視化

global_best_history(iter) = gbest_val;
plot(global_best_history, ...);

記錄并繪制每一代的全局最優值。

目標是找到函數的全局極小值點 (x,y)=(0,0)(x, y) = (0, 0)(x,y)=(0,0),函數值為 0。


? 五、總結與評價

組件數學作用代碼實現
慣性項 w?vw \cdot vw?v保持粒子動量w * v(i,:)
認知項 c1?r1?(pi?x)c_1 \cdot r_1 \cdot (p_i - x)c1??r1??(pi??x)自我學習c1 * rand() * (pbest - x)
社會項 c2?r2?(g?x)c_2 \cdot r_2 \cdot (g - x)c2??r2??(g?x)群體協作c2 * rand() * (gbest - x)
邊界約束保證合法搜索max(min(...))
適應度評估目標函數值rastrigin(x)

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

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

相關文章

【GitHub Workflows 基礎(二)】深入理解 on、jobs、steps 的核心語法與執行邏輯

&#x1f4d8; GitHub Workflows 基礎&#xff08;二&#xff09;&#xff1a;深入理解 on、jobs、steps 的核心語法與執行邏輯繼第一篇講完 .github/workflows/ 中多個工作流的結構后&#xff0c;本篇將深入 GitHub Actions 的核心三要素&#xff1a;on&#xff08;觸發器&…

React Filber及核心原理

1. React Fiber 的核心目標??增量渲染?&#xff1a;將大型更新拆解為可中斷的小任務&#xff08;時間切片&#xff09;&#xff0c;避免阻塞主線程?優先級調度?&#xff1a;動態管理任務執行順序&#xff08;如用戶交互 > 動畫 > 數據加載&#xff09;。與瀏覽器協作…

Shader開發(五)什么是渲染管線

在計算機圖形學中&#xff0c;渲染管線&#xff08;Rendering Pipeline&#xff09; 是圖形處理器&#xff08;GPU&#xff09;將3D網格數據轉化為屏幕圖像的核心流程。無論是炫酷的游戲畫面還是逼真的動畫場景&#xff0c;這一切都離不開渲染管線的默默工作。對于想要學習著色…

CentOS7 使用Docker安裝MinIO完整教程

目錄 1. MinIO簡介 什么是MinIO? 為什么選擇Docker安裝? 2. 環境準備 檢查Docker狀態 檢查防火墻設置 創建存儲目錄 3. 快速啟動MinIO 基礎啟動命令 驗證啟動狀態 4. 配置持久化存儲 停止并刪除臨時容器 使用數據卷啟動MinIO 驗證數據持久化 5. 訪問MinIO控制臺…

【數據庫】時序數據庫選型指南:從大數據視角看IoTDB的核心優勢

文章目錄前言-官網鏈接一、時序數據管理的時代挑戰二、時序數據庫選型的六大核心維度1. 數據模型設計2. 寫入與查詢性能3. 存儲效率4. 系統擴展性5. 生態兼容性6. 運維復雜度三、IoTDB的技術架構解析1. 存儲引擎創新2. 計算引擎優勢3. 分布式架構設計四、行業解決方案對比1. 能…

【25-cv-08364】Keith攜Hello Angel版權圖發案

Hello Angel版權圖案件號&#xff1a;25-cv-08364起訴時間&#xff1a;2025/7/22原告&#xff1a;Angelea Clark Van Dam原告律所&#xff1a;Keith受理法院&#xff1a;伊利諾伊州北區地方法院原告介紹原告是是一位來自澳大利亞的藝術家&#xff0c;筆名為Hello Angel&#xf…

SkSurface---像素的容器:表面

如果說 SkCanvas 是畫布&#xff0c;是所有繪圖操作的提供者的話&#xff0c;那么 SkSurface 就是畫布的容器&#xff0c;我們稱之為表面&#xff0c;它負責管理畫布對應的像素數據。這些像素數據可以是在內存中創建的&#xff0c;也可以是在 GPU 顯存中創建的。創建一個空白表…

26.(vue3.x+vite)以pinia為中心的開發模板

效果截圖 代碼實現 HelloWorld.vue <template><div style="padding: 20px;">介紹:<br>1:使用class 來減少pinia(store)的代碼量<br>

華為AI Agent智能園藝助手開發案例

一、引言與行業背景 在數字化與智能化日益滲透我們生活的今天&#xff0c;園藝這一傳統而充滿生機的領域&#xff0c;也迎來了智能化的革新。華為AI Agent智能園藝助手通過融合人工智能與園藝專業知識&#xff0c;為用戶提供一站式、個性化的園藝養護解決方案&#xff0c;徹底改…

Linux Flathub軟件管理方法 使用指南

Flathub 使用指南&#xff1a;軟件安裝、管理及常用軟件推薦 一. 什么是 Flathub&#xff1f; Flathub 是 Flatpak 應用程序的主要分發中心&#xff0c;類似于 Linux 上的"應用商店"。它提供了一種跨發行版的軟件打包和分發方式&#xff0c;讓用戶可以在任何 Linux 發…

GitLab 18.2 發布幾十項與 DevSecOps 有關的功能,可升級體驗【二】

沿襲我們的月度發布傳統&#xff0c;極狐GitLab 發布了 18.2 版本&#xff0c;該版本帶來了議題和任務的自定義工作流狀態、新的合并請求主頁、新的群組概覽合規儀表盤、下載安全報告的 PDF 導出文件、中心化的安全策略管理&#xff08;Beta&#xff09;等幾十個重點功能的改進…

??免費語音轉換服務(TTS)全面指南

????1. TTS技術概述?? TTS&#xff08;Text-to-Speech&#xff09;通過AI將文字轉化為自然語音&#xff0c;核心技術包括??深度神經網絡&#xff08;DNN&#xff09;??、??語音韻律建模??和??聲學合成??。其核心優勢在于&#xff1a; ??多語言支持??&a…

正則化都是放在模型的哪個位置呢?

? 什么是“正則化”&#xff1f;在神經網絡中&#xff0c;正則化&#xff08;Regularization&#xff09; 抑制過擬合的技巧 目的是讓模型在訓練集和測試集上都表現得好&#xff08;泛化能力強&#xff09;。&#x1f9e0; 常見的正則化手段包括&#xff1a;方法類型通常放在哪…

Python畢業設計 | 基于協同過濾的智能商品推薦與數據大屏系統(Vue+Flask+Scikit-learn,附源碼+文檔)

個人介紹&#x1f3af; 畢業設計私人教練 專注計算機畢設輔導第 6 年&#xff0c;累計 1v1 帶飛 800 同學順利通關。從選題、開題、代碼、論文到答辯&#xff0c;一條龍陪跑&#xff1b;擅長把導師的 “模糊要求” 變成能落地的技術方案。白天寫方案&#xff0c;晚上改論文&…

基于千問2.5-VL-7B訓練識別人的表情

一、安裝LLaMA-Factory 我們使用LLaMA-Factory來進行微調&#xff0c;安裝LLaMA-Factory來參考文章&#xff1a; 大模型微調工具LLaMA-Factory的安裝流程-CSDN博客 二、下載千問2.5-VL-7B模型 我們使用千問2.5-VL-7B多模態模型來進行微調 通義千問2.5-VL-7B-Instruct 下載…

Android屏幕適配:從dp到px的轉換與今日頭條適配方案詳解

前言 在Android開發中&#xff0c;屏幕適配一直是一個重要且復雜的話題。不同設備有著不同的屏幕尺寸、分辨率和像素密度&#xff0c;如何讓應用在各種設備上都能良好顯示&#xff0c;是每個開發者都需要面對的問題。本文將深入探討Android系統中dp到px的轉換原理&#xff0c;并…

nvim 縮進4空格

要把 Neovim 配置為縮進 4 空格&#xff0c;并適用于所有語言&#xff08;或某些語言如 C/C&#xff09;&#xff0c;你只需要設置這三個核心選項即可&#xff1a;? 通用方式&#xff1a;在 init.lua 或 options.lua 中添加 vim.opt.tabstop 4 -- 一個 <Tab> 等…

pdw估計edw怎么估計

問題一、pdw估計edw怎么估計PDW&#xff08;Pulse Descriptor Word&#xff09;數據是雷達接收到的每一個脈沖的瞬時特征數據&#xff0c;EDW&#xff08;Emitter Descriptor Word&#xff09;是對某一輻射源&#xff08;發射機&#xff09;整體特性的估計。PDW 是每一個脈沖的…

TS語法最佳實踐

switch 的 case不能使用條件表達式JavaScript 允許在 switch 的 case 中使用條件表達式&#xff0c;但這種用法實際上是無效的&#xff0c;因為 case 的值會被隱式地轉換為布爾值。TypeScript 明確禁止這種用法&#xff0c;以避免隱式類型轉換導致的邏輯錯誤。建議使用 if-else…

行業熱點丨仿真歷史數據難以使用?如何利用幾何深度學習破局,加速汽車工程創新

01、AI 驅動研發升級&#xff1a;幾何深度學習創造行業新價值人工智能正加速推動各行業研發能力升級。麥肯錫最新報告顯示&#xff0c;該技術在制藥、化工和航空航天等領域的應用&#xff0c;有望為相關企業創造高達5600億美元的經濟價值。 AI 技術應用的先行者&#xff0c;全球…