【SA】SA-PSO算法

SA

模拟退火算法最早由Metropolis在1953年提出,Kirkpatrick等在1983年将其引入组合优化领域,模拟退火算法时局部搜索算法的扩展,理论上是一个全局最优算法。退火过程由一组称作冷却表(Cooling Schedule)的参数控制,包括控制参数的初始值 T T T以及衰减因子 Δ t \Delta t Δt,每个 T T T值的迭代次数(称为一个Mapkob链的长度) L L L和终止条件 S S S.

算法流程

算法采用Metropolis接受准则,持续进行产生新解-判断-接受/舍弃的迭代过程而达到温度下的平衡点

  1. 初始化退火温度 T k T_k Tk,产生随机初始解 x 0 x_0 x0.
  2. 在温度 T k T_k Tk下重复执行如下操作,直到达到温度 T k T_k Tk的平衡状态
  • 在解 x x x的邻域中产生新的可行解 x ′ x' x.
  • 计算 x ′ x' x的目标函数 f ( x ′ ) f(x') f(x) x x x的目标函数 f ( x ) f(x) f(x)的差值 Δ f \Delta f Δf.
  • 按照概率 min ⁡ { 1 , exp ⁡ ( − Δ f / T k ) } > random [ 0 , 1 ] \min\{1, \exp(-\Delta f/T_k)\}>\text{random}[0, 1] min{ 1,exp(Δf/Tk)}>random[0,1]接受 x ′ x' x.
  1. 退火操作: T k + 1 = C T k , k = k + 1 T_{k+1}=CT_k, k=k+1 Tk+1=CTk,k=k+1,其中 C ∈ ( 0 , 1 ) C\in (0, 1) C(0,1),如果满足收敛判据,则退火过程结束,否则转步骤 ( 2 ) (2) (2). 其中退火温度控制着求解过程向最优值的优化方向进行,同时又以 exp ⁡ ( − Δ f / T k ) \exp(-\Delta f/T_k) exp(Δf/Tk)来接收劣质解,所以算法可以跳出局部极值点,只要初始温度足够高,退火过程足够慢,算法可以收敛到全局最优解。

基于SA的微粒群算法采用带压缩因子的PSO优化算法,可以在确保PSO算法的收敛性的同时取消对速度和边界的限制,速度和位置的更新公式如下:
v i , j ( k + 1 ) = χ [ v i , j ( k ) + c 1 r 1 ( p i , j ( k ) − x i , j ( k ) ) + c 2 r 2 ( p g , j ( k ) − x i , j ( k ) ) ] x i , j ( k + 1 ) = x i , j ( k ) \begin{aligned} &v_{i,j}(k+1)=\chi[v_{i,j}(k)+c_1r_1(p_{i,j}(k)-x_{i,j}(k))+c_2r_2(p_{g,j}(k)-x_{i,j}(k))]\\ &x_{i,j}(k+1)=x_{i,j}(k) \end{aligned} vi,j(k+1)=χ[vi,j(k)+c1r1(pi,j(k)xi,j(k))+c2r2(pg,j(k)xi,j(k))]xi,j(k+1)=xi,j(k)
其中压缩因子 χ = 2 ∣ 2 − C − C 2 − 4 C ∣ , C = c 1 + c 2 , C > 4 \chi=\frac{2}{|2-C-\sqrt{C^2-4C}|}, C=c_1+c_2, C>4 χ=2CC24C 2,C=c1+c2,C>4,由于速度更新公式采用了群体最佳位置,所有粒子都将飞向群体中的最佳位置,如果群体的最佳位置处于局部极小,那么所有粒子都会趋向于局部极小解,从而导致搜索的分散性变差,降低全局搜索能力,为了避免算法陷入局部极小解,从 p i p_i pi中选出一个位置 p g ′ p_g' pg替代原式中的 p g p_g pg.
v i , j ( k + 1 ) = χ [ v i , j ( k ) + c 1 r 1 ( p i , j ( k ) − x i , j ( k ) ) + c 2 r 2 ( p i , j ′ ( k ) − x i , j ( k ) ) ] v_{i,j}(k+1)=\chi[v_{i,j}(k)+c_1r_1(p_{i,j}(k)-x_{i,j}(k))+c_2r_2(p'_{i,j}(k)-x_{i,j}(k))] vi,j(k+1)=χ[vi,j(k)+c1r1(pi,j(k)xi,j(k))+c2r2(pi,j(k)xi,j(k))]
设置温度为 t t t时, p i p_i pi相对 p g p_g pg的突跳概率, exp ⁡ ( − ( f p i − f p g ) / t ) \exp(-(f_{p_i}-f_{p_g})/t) exp((fpifpg)/t)

Code: SA-PSO

fitness function

function F = fitness(x)
    F = 100*(x(1)^2-x(2))^2+(1-x(1))^2;
end

main function

[x, f]=SimuAPSO(@fitness, 40, 2.05, 2.05, 0.5, 100, 2);

SA-PSO

function [xm, fv] = SimuAPSO(fitness, N, c1, c2, lambda, M, D)
    format long;
    % initialize population
    for i = 1:N
        for j=1:D
            x(i,j) = randn;
            v(i,j) = randn;
        end
    end
    
    % compute the fitness of each particles
    for i=1:N
        p(i) = fitness(x(i, :));
        y(i, :) = x(i, :);
    end
    
    pg = x(N, :); % pg is the global optimal point
    
    for i=1:(N-1)
        if fitness(x(i, :))<fitness(pg)
            pg = x(i, :);
        end
    end
    
    % main loop
    T = -fitness(pg)/log(0.2);
    for t=1:M
        groupFit = fitness(pg);
        for i=1:N
            Tfit(i) = exp(-(p(i)-groupFit)/T);
        end
        SumTfit = sum(Tfit);
        Tfit = Tfit/SumTfit;
        pBet = rand;
    
        for i=1:N
            ComFit(i) = sum(Tfit(1:i));
            if pBet <= ComFit(i)
                pg_plus = x(i, :);
                break;
            end
        end
        C = c1+c2;
        ksi = 2/abs(2-C-sqrt(C^2-4*C));
        for i=1:N
            v(i, :)=ksi*(v(i, :)+c1*rand*(y(i,:)-x(i, :))+c2*rand*(pg_plus-x(i, :)));
            x(i, :) = x(i, :)+v(i, :);
            
            if fitness(x(i, :))<p(i)
                p(i)=fitness(x(i, :));
                y(i, :)=x(i, :);
            end
            
            if p(i)<fitness(pg)
                pg = y(i, :);
            end
        end
        
        T = T*lambda;
        Pbest(t) = fitness(pg);
    end
    
    % plot
    r = [1:1:100];
    plot(r, Pbest, 'r--', 'linewidth', 1);
    xlabel('Number of iterations');
    ylabel('Fitness');
    title('SA-PSO algorithm');
    legend('SA-PSO');
    grid on;
    
    % return values
    xm = pg';
    fv = fitness(pg);
end

sa-pso

Code: LnCSA-PSO

学习因子同步改变的PSO算法

[x1, f1] = LnCPSO(@fitness, 40, 2.1, 0.8, 0.9, 100, 2);

LnCSAPSO

function [xm, fv] = LnCPSO(fitness, N, cmax, cmin, w, M, D)
    format long;
    % initialize population
    for i = 1:N
        for j=1:D
            x(i,j) = randn;
            v(i,j) = randn;
        end
    end
    
    % compute the fitness of each particles
    for i=1:N
        p(i) = fitness(x(i, :));
        y(i, :) = x(i, :);
    end
    
    pg = x(N, :); % pg is the global optimal point
    
    for i=1:(N-1)
        if fitness(x(i, :))<fitness(pg)
            pg = x(i, :);
        end
    end
    
    % main loop
    for t=1:M
        c = cmax-(cmax-cmin)*t/M;
        for i=1:N
            v(i, :)=w*v(i, :)+c*rand*(y(i, :)-x(i, :))+c*rand*(pg-x(i, :));
            x(i, :)=x(i, :)+v(i, :);
            
            if fitness(x(i, :))<p(i)
                p(i)=fitness(x(i, :));
                y(i, :)=x(i, :);
            end
            
            if p(i)<fitness(pg)
                pg = y(i, :);
            end
        end
        
        Pbest(t)=fitness(pg);
    end
    
    % plot
    r = [1:1:100];
    plot(r, Pbest, 'r--', 'linewidth', 1);
    xlabel('Number of iterations');
    ylabel('Fitness');
    title('SA-PSO algorithm');
    legend('LnC SA-PSO');
    grid on;
    
    % return values
    xm = pg';
    fv = fitness(pg);
end

Lnc

猜你喜欢

转载自blog.csdn.net/qq_18822147/article/details/116588240
sa
今日推荐