当前位置:   article > 正文

智能优化算法:粒子群算法_粒子群算法学习因子取值

粒子群算法学习因子取值

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

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)
\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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107

迭代曲线
求解结果

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号