📄 pso_syber_精确.m
字号:
clc;
clear;
%初始化变量----------------------------------------------------------------------------------------------------------------------------------
Global_Min = 0; % 全局最小值,用于停止条件
ErrGoal = 1e-10; % 期望精度
Success = 0; % 成功标志
Current_Iteration = 0; % 迭代次数
MaxIterations = 1000; % 最大迭代次数
% 初始化权值
w_start = 0.95;
w_end = 0.4;
w_now = w_start;
delta_w = (w_start-w_end)/MaxIterations;
%delta_w = 7.857e-4;
c1 = 2.0;
c2 = 2.0;
% 初始化微粒属性
SwarmXMax = 200;
SwarmXMin = 100;
SwarmVMax = 100;
SwarmSize = 20;
SwarmDim = 10;
%--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
% 初始化微粒位置和速度
SwarmXMatrix = rand(SwarmSize, SwarmDim)*(SwarmXMax-SwarmXMin) + SwarmXMin;
SwarmVMatrix = rand(SwarmSize, SwarmDim);
% 适应度函数及初始适应度向量
f2eval = 'DeJong';
f2eval = 'Rastrigrin';
% f2eval = 'Griewank';
% f2eval = 'Rosenbrock';
Current_Fitness_Vector = feval(f2eval, SwarmXMatrix);
SwarmXMatrix_P = SwarmXMatrix; % SwarmXMatrix_P为微粒(Paicle)最好位置
SwarmXMatrix_G = SwarmXMatrix; % SwarmXMatrix_G为全局(Gloabal)最好位置
Best_Fitness_Vector = Current_Fitness_Vector; % 初始最佳适应度向量
[Best_Fitness, g] = min(Current_Fitness_Vector);% 初始全局最佳适应度
Best_Fitness_Latest = Best_Fitness;
History = [0, Best_Fitness ,SwarmXMatrix(g,:)];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
while( (Success == 0) & (Current_Iteration <= MaxIterations) )
Current_Iteration = Current_Iteration+1;
if (Current_Iteration<=1000) & (Current_Iteration > 1)
w_now = w_now - delta_w;
end
% 采用经典PSO算法-------------------------------------------------------------------------------------------------------------------------
R1 = rand(SwarmSize, SwarmDim);
R2 = rand(SwarmSize, SwarmDim);
SwarmXMatrix_G = repmat(SwarmXMatrix(g,:), SwarmSize, 1); % 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;
% 更新微粒最优
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,按行更新
% 更新全局最优
[Best_Fitness, g] = min(Best_Fitness_Vector);% 更新后的20*1中最小值及其下标分别更新fGBest和g
if Best_Fitness < Best_Fitness_Latest % 如果小于上次20*1中的最小值
Best_Fitness_Latest = Best_Fitness; % 新的最小值来更新
end
History((size(History,1)+1), :) = [Current_Iteration,SwarmXMatrix_P(g,:),Best_Fitness];
if abs(Best_Fitness_Latest-Global_Min) <= ErrGoal % GBest
Success = 1;
end;
% pause;
% SwarmXMatrix
% sprintf('Current_Iteration\tSwarmXMatrix(g,:)\tBest_Fitness\tg')
% [Current_Iteration,SwarmXMatrix(g,:),Best_Fitness,g]
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
xmin = SwarmXMatrix_P(g,:);
fxmin = Best_Fitness;
[xmin,fxmin]
%RealValue = feval(f2eval, xmin);
%[xmin,fxmin,RealValue]
plot(History(:,1+SwarmDim+1));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -