智能优化算法:粒子群算法

1. 粒子群算法简介

假设在一个 D D D维的目标搜索空间中,有 N N N个例子组成的一个群落,其中第 i i i个粒子表示为一个 D D D维度的向量: X i = [ x i 1 , x i 1 , ⋯   , x i D ] , i = 1 , 2 , ⋯   , N (1) \mathbf{X}_i = [x_{i1},x_{i1},\cdots,x_{iD}], i=1,2,\cdots, N\tag{1} Xi=[xi1,xi1,,xiD],i=1,2,,N(1)
i i i个粒子的“飞行”速度也是一个 D D D维向量,记为
V i = [ V i 1 , V i 2 , , ⋯   , V i D ] , i = 1 , 2 , ⋯   , N (2) \mathbf{V}_i = [V_{i1}, V_{i2,}, \cdots,V_{iD}], i=1,2,\cdots, N\tag{2} Vi=[Vi1,Vi2,,,ViD],i=1,2,,N(2)
i i i个粒子迄今为止搜索到的最优位置称为个体极值,记作
p best = [ p i 1 , p i 2 , ⋯   , p i D ] , i = 1 , 2 , ⋯   , N (3) \mathbf{p}_{\text{best}}=[p_{i1},p_{i2},\cdots,p_{iD}],i=1,2,\cdots, N\tag{3} pbest=[pi1,pi2,,piD],i=1,2,,N(3)
整个粒子群搜索到的最优位置为全局极值,记为
g best = [ g 1 , g 2 , ⋯   , g D ] \mathbf{g}_{\text{best}} = [g_1,g_2,\cdots,g_D] gbest=[g1,g2,,gD]

在找到这两个最优值时,粒子根据下式来更新自己的速度和位置:
{ v i j ( t + 1 ) = v i j ( t ) + c 1 r 1 ( t ) [ p i j ( t ) − x i j ( t ) ] + c 2 r 2 ( t ) [ g j ( t ) − x i j ( t ) ] x i j ( t + 1 ) = x i j ( t ) + v i j ( t + 1 ) \left\lbrace\begin{array}{l} v_{ij}(t+1) = v_{ij}(t) + c_1r_1(t)[p_{ij}(t)-x_{ij}(t)] +c_2r_2(t)[g_{j}(t)-x_{ij}(t)] \\ x_{ij}(t+1) = x_{ij}(t) + v_{ij}(t+1)\end{array}\right. {vij(t+1)=vij(t)+c1r1(t)[pij(t)xij(t)]+c2r2(t)[gj(t)xij(t)]xij(t+1)=xij(t)+vij(t+1)式中: i = 1 , 2 , ⋯   , N i=1,2,\cdots,N i=1,2,,N j = 1 , 2 , ⋯   , D j = 1,2,\cdots,D j=1,2,,D c 1 c_1 c1 c 2 c_2 c2学习因子,也称加速常数 r 1 r_1 r1 r 2 r_2 r2 [ 0 , 1 ] [0,1] [0,1]范围内的均匀随机数, v i j v_{ij} vij是第 i i i个粒子第 j j j维度的速度分量, v i j ∈ [ − v max ⁡ , v max ⁡ ] v_{ij}\in[-v_{\max},v_{\max}] vij[vmax,vmax],v_{\max}是常数,由用户设定来限制粒子的速度。

速度更新方程右三个部分组成:

  1. “惯性”或“动量”部分:分赢了粒子的运动习惯,代表粒子有维持自己先前速度的趋势;
  2. “认知”部分:反映了粒子对自身历史经验的记忆或回忆,代表粒子有向自身历史最佳位置逼近的趋势;
  3. “社会”部分:反映了粒子间协同合作与知识共享的群体历史经验,代表粒子有向群体或邻域历史最佳位置逼近的趋势。

2. 粒子群算法内容

2.1 粒子群算法流程

2.2 参数说明

3. 粒子群算法代码实现

3.1 Matlab

3.1.1 PSO求解函数极值

f ( x ) = x − 10 sin ⁡ ( 5 x ) + 7 cos ⁡ ( 4 x ) f(x)=x-10\sin(5x)+7\cos(4x) f(x)=x10sin(5x)+7cos(4x)的最大值,其中 x x x的范围为 x ∈ [ 0 , 10 ] x\in[0,10] x[0,10]

% 粒子群优化算法求解函数最值

% 系统初始化
close all
clear
clc

% 参数设置
N = 100;            % 粒子数
D = 1;              % 维度
T = 100;            % 最大迭代次数
c1 = 1.5;           % 学习因子1
c2 = 1.5;           % 学习因子2
w = 0.8;            % 惯性权重

% 变量范围
Xmax = 0;           % 自变量范围
Xmin = 10;          % 自变量范围
Vmax = 2;           % 速度范围
Vmin = -2;          % 速度范围


% 初始化粒子位置与速度
x = rand(N,D) * (Xmax-Xmin) + Xmin;
v = rand(N,D) * (Vmax-Vmin) + Vmin;

% 初始化个体最优位置和最优值
p = x;
pbest = ones(N,1);
for i = 1:N
    pbest(i) = f(x(i,:));
end

% 初始化全局最优位置和最优值
g = ones(1,D);
gbest = -inf;
for i = 1:N
    if(pbest(i) > gbest)
        g = p(i,:);
        gbest = pbest(i);
    end
end

% 记录迭代过程
gb = ones(1,T);

% 开始迭代
for i = 1:T
    for j = 1:N
        % 更新个体最优位置和最优值
        if (f(x(j,:)) > pbest(j))
            p(j,:) = x(j,:);
            pbest(j) = f(x(j,:));
        end
        % 更新全局最优位置和最优值
        if pbest(j) > gbest
            g = p(j,:);
            gbest = pbest(j);
        end
        
        % 更新位置和速度
        v(j,:) = w * v(j,:) + c1 * rand * (p(j,:) - x(j,:)) + c2 * rand * (g - x(j,:));
        x(j,:) = x(j,:) + v(j,:);
        
        % 范围检测
        for ii = 1:D
            if (v(j,ii) > Vmax) || (v(j,ii) < Vmin)
                v(j,ii) = rand * (Vmax-Vmin) + Vmin;
            end
            if (x(j,ii) > Xmax) || (x(j,ii) < Xmin)
                x(j,ii) = rand * (Xmax-Xmin) + Xmin;
            end
        end
    end
    gb(i) = gbest;
end % 结束迭代

% 绘图
figure('name','迭代曲线','color','w')
plot(gb,'b','linewidth',1);
grid on
set(gca,'FontName','Times New Roman','FontSize',12);
xlabel('迭代次数','FontName','宋体');
ylabel('最优解','FontName','宋体');
xlim([1,T])

X = linspace(Xmin,Xmax,1000);
Y = f(X);
figure('name','函数图像','color','w');
plot(X,Y,'b','linewidth',1);
grid on
hold on
set(gca,'FontName','Times New Roman','FontSize',12);
xlabel('$x$','interpreter','Latex');
ylabel('$f(x)$','interpreter','Latex');
title('$f(x)=x - 10\sin(5x) + 7\cos(4x)$','interpreter','Latex');
ylim([-20,30])
[ymax,xindex] = max(Y);
line1 = plot(X(xindex),ymax,'go');
line2 = plot(g,f(g),'r*');
hold off
legend([line1,line2],{'Max','PSO Result'},'Location','southeast');

% 函数
function y = f(x)
y = x + 10*sin(5*x) + 7 * cos(4*x);
end

迭代曲线
求解结果

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亦贤同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值