前言
提醒:
文章內容為方便作者自己后日復習與查閱而進行的書寫與發布,其中引用內容都會使用鏈接表明出處(如有侵權問題,請及時聯系)。
其中內容多為一次書寫,缺少檢查與訂正,如有問題或其他拓展及意見建議,歡迎評論區討論交流。
內容由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=1∑d?[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:num_particles
生成一個從1到num_particles
的整數序列,表示粒子群的索引。例如,如果num_particles=30
,則生成[1, 2, ..., 30]
。@(i) rastrigin(x(i,:))
這是一個匿名函數(lambda函數),輸入參數為i
(粒子索引),輸出為rastrigin(x(i,:))
,即第i
個粒子的位置向量x(i,:)
在Rastrigin函數上的適應度值。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
的行向量。'
(轉置符號) 由于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) |