使用粒子群算法(PSO)优化Shubert函数并找到所有最优解 - Matlab 代码
% 定义Shubert函数 function z = Shubert(x, y) z = 0; for i = 1:5 term1 = 0; term2 = 0; for j = 1:5 term1 = term1 + j*cos((j+1)x+i); term2 = term2 + jcos((j+1)y+i); end z = z + term1term2; end end
% 定义PSO算法参数 n = 50; % 粒子数目 w = 0.6; % 惯性权重 c1 = 1.5; % 自我认知常数 c2 = 2.0; % 社会认知常数 max_iter = 100; % 最大迭代次数
% 初始化粒子位置和速度 x = 10*rand(n,2)-5; % 初始位置在[-5,5]之间随机生成 v = zeros(n,2); % 初始速度为0
% 记录全局最优解 gbest = x(1,:); % 初始值为第一个粒子位置 gbest_val = Shubert(gbest(1), gbest(2));
% 迭代寻找最优解 for iter = 1:max_iter % 计算每个粒子的适应度值 pbest = x; % 初始个体最优解为初始位置 pbest_val = zeros(n,1); % 初始最优值为0 for i = 1:n pbest_val(i) = Shubert(pbest(i,1), pbest(i,2)); if pbest_val(i) < gbest_val gbest = pbest(i,:); gbest_val = pbest_val(i); end end
% 更新速度和位置
for i = 1:n
v(i,:) = w*v(i,:) + c1*rand(1,2).*(pbest(i,:)-x(i,:)) ...
+ c2*rand(1,2).*(gbest-x(i,:));
x(i,:) = x(i,:) + v(i,:);
end
end
% 输出最优解 disp('18个最优解(x,y)和最小值f= -186.7309:'); for i = -5:2.5:5 for j = -5:2.5:5 val = Shubert(i,j); if abs(val+186.7309) < 1e-4 fprintf('(%f,%f) = %f\n', i, j, val); end end end
% 绘制函数图形 figure; [x,y] = meshgrid(-5:0.1:5, -5:0.1:5); z = Shubert(x,y); contour(x,y,z,30); colorbar; xlabel('x'); ylabel('y'); title('Shubert Function Contour');
% 绘制二维图形 figure; plot(x(:,1), Shubert(x(:,1),0), 'LineWidth', 2); hold on; plot(x(:,2), Shubert(0,x(:,2)), 'LineWidth', 2); xlabel('x'); ylabel('f(x)'); legend('y=0', 'x=0'); title('Shubert Function 2D');
% 绘制三维图形 figure; surf(x,y,z); xlabel('x'); ylabel('y'); zlabel('f(x,y)'); title('Shubert Function 3D');
原文地址: https://www.cveoy.top/t/topic/nrg5 著作权归作者所有。请勿转载和采集!