⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 最小更新单独pso.m

📁 matlab编写的经典pso算法
💻 M
字号:
clc;
clear;
%Initialization Variables----------------------------------------------------------------------------------------------------------------------------------
Global_Min        = 2;     % Global minimum (used in the stopping criterion)
ErrGoal           = 1e-5; % Desired accuracy
Success           = 0;     % Success Flag
Current_Iteration = 0;     % Iterations' counter

% Initialize the value of weight change
w_start   = 1.0;
w_end     = 0.4;
w_now     = w_start;
delta_w   =  0.001; 
c1        = 1.8;
c2        = 1.8;

% Initialize Swarm and Velocity
MaxIterations = 1000;
SwarmXMax = 2;
SwarmXMin = -2;
SwarmVMax = 10;
SwarmSize = 30;
SwarmDim  = 2;

%--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SwarmXMatrix = rand(SwarmSize, SwarmDim)*(SwarmXMax-SwarmXMin) + SwarmXMin;
SwarmVMatrix = rand(SwarmSize, SwarmDim);

f2eval          = 'DeJong';
Current_Fitness_Vector = feval(f2eval, SwarmXMatrix);

SwarmXMatrix_P      = SwarmXMatrix;
Best_Fitness_Vector = Current_Fitness_Vector;          % Best_Fitness_Vector  微粒最佳值20*1
[Best_Fitness, g]   = min(Current_Fitness_Vector);% Best_Fitness 全局最佳值1*1
Best_Fitness_Latest =     Best_Fitness;     % Best_Fitness_Latest  总的最佳值1*1
History             = [0, Best_Fitness];

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
while( (Success == 0) & (Current_Iteration <= MaxIterations) )
    
    Current_Iteration = Current_Iteration+1;   
    if (w_now<w_end) & (Current_Iteration > 1)
        w_now = w_now - delta_w;
    end
                
    % Apply formular of Classic PSO-------------------------------------------------------------------------------------------------------------------------
    R1 = rand(SwarmSize, SwarmDim);
    R2 = rand(SwarmSize, SwarmDim);
    
    SwarmXMatrix_G = repmat(SwarmXMatrix(g,:), SwarmSize, 1); % A = GBest. repmat(X, m, n) repeats the matrix X in m rows by n columns.
    SwarmVMatrix   = w_now*SwarmVMatrix + c1*R1.*(SwarmXMatrix_P-SwarmXMatrix) + c2*R2.*(SwarmXMatrix_G-SwarmXMatrix);  %PBest为最佳值矩阵

    ChangeMatrix                     = SwarmVMatrix > SwarmVMax;
    SwarmVMatrix(find(ChangeMatrix)) = SwarmVMax;
    ChangeMatrix                     = SwarmVMatrix < -SwarmVMax;
    SwarmVMatrix(find(ChangeMatrix)) = -SwarmVMax;
    
    SwarmXMatrix = SwarmXMatrix + SwarmVMatrix;    % Evaluate new SwarmXMatrix
    
    % Update new particle best 
    Current_Fitness_Vector     = feval(f2eval, SwarmXMatrix);% 重新计算各个微粒的函数值
    ChangeVector               = Current_Fitness_Vector < Best_Fitness_Vector;     % 找到函数值变小的微粒(行),只有0,1的10*1列向量
    Best_Fitness_Vector(find(ChangeVector)) = Current_Fitness_Vector(find(ChangeVector));   % 更新新的值20*1
    SwarmXMatrix_P(find(ChangeVector), :)  =  SwarmXMatrix(find(ChangeVector), :);% 更新新的群20*10,按行更新
    
    % Update new Global best 
    [Best_Fitness, g] = min(Best_Fitness_Vector);% 更新后的20*1中最小值及其下标分别更新fGBest和g     全局fGBest更新        带f表示函数值
    if Best_Fitness < Best_Fitness_Latest       % 如果小于上次20*1中的最小值                        总的最值fBest更新
        Best_Fitness_Latest = Best_Fitness;       % 新的最小值来更新
    end
               
    History((size(History,1)+1), :) = [Current_Iteration, Best_Fitness_Latest];
   
    %%TERMINATION-----------------------------------------------------------------------------------------------------------------------------------------
    if abs(Best_Fitness_Latest-Global_Min) <= ErrGoal     % GBest
        Success = 1;
    end
    
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -