自适应模拟退火粒子群算法BSAPSO(学习笔记_03)

1. pso算法的不足:

        容易陷入局部最优、算法后期容易出现振荡现象。

2. 改进目的

        通过引入模拟退火机制,将pso算法中的“自身认知”和“社会认知”部分进行自适应调整,以改善算法的性能,从而实现算法的全局收敛和局部收敛的有效平衡。


  • 前期:标准PSO算法寻优。

    • 提高了算法搜索整个过程的速率

    • 为后期进行了随机初始化的工作,增加了种群的多样性

  • 后期:引入模拟退火原理。

    • 增强了粒子群的全局搜索能力,很大程度上解决了pso算法的局部收敛性。

3. 改进步骤[1]

 自适应模拟退火粒子群算法BSAPSO(学习笔记_03)_第1张图片

自适应模拟退火粒子群算法BSAPSO(学习笔记_03)_第2张图片

自适应模拟退火粒子群算法BSAPSO(学习笔记_03)_第3张图片

4. 源代码

m = 30;  %粒子数量
d = 2;  %粒子维度
ac1 = 2.0;  % 自身认知函数初始值
ac2 = 0.5;
sa_k = 0.98;  %衰减因子
iwe = 3;  % 惯性权重调整步数
iter_max = 200;

w_max = 0.8;
w_min = 0.4;
v_max = 1;
v_min = -1;
x_max = 5;
x_min = -5;
t_star = 100;
t_end = 0.01;

pos = 0 ;

%% 1、初始化
x = rand(m,d) * (x_max - x_min) + x_min;
v = rand(m,d) * (v_max - v_min) + v_min;

%% 初始化个体最优位置,最优值
p = x;  %每个粒子的个体最优解的位置
pbest = ones(m,1);
for i =1:m
    pbest(i) = func(x(i,:));
end

%% 初始化全局最优位置,最优值
g = ones(1,d);  %全局最优位置
gbest = inf;
for i=1:m
    if(pbest(i) < gbest)
        g = p(i,:)
        gbest = pbest(i);
    end
end

% 迭代
t_cur = t_star;
c1 = 1.5;
c2 = 1.5;
for i = 1:iter_max
    for j = 1:m
        %% 2、计算每个粒子的个体最优值
        if i * 2 < iter_max   % 迭代前期采取标准的学习因子更新速度
            if (func(x(j,:)) < pbest(j))
                p(j,:) = x(j,:);  %更新个体最优解位置
                pbest(j) = func(x(j,:));  %更新个体最优解
            end
        else  % 迭代后期
            deta_p = func(x(j,:)) - pbest(j);
            if (deta_p < 0)
                p(j,:) = x(j,:);  %更新个体最优解位置
                pbest(j) = func(x(j,:));  %更新个体最优解
            else  %(Metropolis算法)
                p1 = exp(-1 * deta_p / t_cur);
                r = 0;
                for ii = 1:10
                    r = max(r,rand);
                end
                if p1 > r  % 接受较差的值
                    p(j,:) = x(j,:);  %更新个体最优解位置
                    pbest(j) = func(x(j,:));  %更新个体最优解
                    c1 = ac1 * exp(-t_cur/t_star)*rand;
                    %c2 = ac2 * (1+exp(-t_cur/t_star))*rand;
                end
            end
        end
        %% 3、计算整个群体的全局最优值
        if (pbest(j) < gbest)
            gbest0 = gbest;
            g = p(j,:);
            gbest = pbest(j);
        end
        
        %% 4、对粒子的速度、位置进行进化
        %w = w_max + (w_max - w_min) *(i-1)/(iwe-1);
        w = w_max - (w_max - w_min) * i / iter_max;
        v(j,:) = w*v(j,:)+c1 * rand*(p(j,:)-x(j,:))+c2 * rand*(g-x(j,:));
        x(j,:) = x(j,:) + v(j,:);
        
        %% 5、进行边界处理
        for k = 1:d
            if (v(j,k) > v_max | v(j,k) < v_min)
                v(j,k) = rand * (v_max - v_min) + v_min;
            end
            if (x(j,k) > x_max | x(j,k) < x_min)
                x(j,k) = rand * (x_max - x_min) + x_min;
            end
        end
    end
    gb(i) = gbest;
    t_cur = sa_k * t_cur;
end

%g;  %最优个体位置
disp( '最小值为:');
gbest
plot(gb)
legend(legend_str);
xlabel('迭代次数');
ylabel('适应度值');
title("适应度进化曲线")

function results = func(x)
    results = 5*cos(x(1)*x(2))+x(1)*x(2)+x(2)^3;
end

5.对比结果

自适应模拟退火粒子群算法BSAPSO(学习笔记_03)_第4张图片

6. 参考文献

[1]于海平, 刘会超, and 吴志健. "基于模拟退火的自适应粒子群优化算法的改进策略." 计算机应用研究 29.12(2012):3.

你可能感兴趣的:(智能优化算法,粒子群算法,模拟退火算法)