📄 最小更新单独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 + -