粒子群算法优化Griewank和Rosenbrock函数:Matlab代码实现及结果比较
以下是使用 Griewank 函数和 Rosenbrock 函数测试粒子群算法的 Matlab 代码,并比较最小函数值及标准差。
Griewank 函数
% 定义 Griewank 函数
function f = griewank(x)
n = length(x);
sum1 = sum(x.^2)/4000;
prod1 = prod(cos(x./sqrt(1:n)));
f = sum1 - prod1 + 1;
end
% 设置参数
num_particles = 50;
num_dimensions = 10;
max_iter = 100;
w = 0.729; % 惯性因子
c1 = 1.49445; % 学习因子1
c2 = 1.49445; % 学习因子2
% 初始化粒子位置和速度
particle_position = rand(num_particles, num_dimensions).*10 - 5; % 位置范围[-5, 5]
particle_velocity = zeros(num_particles, num_dimensions);
% 计算粒子的适应度值
particle_fitness = zeros(num_particles, 1);
for i = 1:num_particles
particle_fitness(i) = griewank(particle_position(i,:));
end
% 初始化全局最优位置和适应度值
global_best_position = particle_position(1,:);
global_best_fitness = particle_fitness(1);
for i = 2:num_particles
if particle_fitness(i) < global_best_fitness
global_best_position = particle_position(i,:);
global_best_fitness = particle_fitness(i);
end
end
% 迭代更新
for iter = 1:max_iter
for i = 1:num_particles
% 更新粒子速度和位置
particle_velocity(i,:) = w*particle_velocity(i,:) ...
+ c1*rand(1,num_dimensions).*(global_best_position - particle_position(i,:)) ...
+ c2*rand(1,num_dimensions).*(rand(1,num_dimensions) - particle_position(i,:));
particle_position(i,:) = particle_position(i,:) + particle_velocity(i,:);
% 判断是否越界
for j = 1:num_dimensions
if particle_position(i,j) < -5
particle_position(i,j) = -5;
elseif particle_position(i,j) > 5
particle_position(i,j) = 5;
end
end
% 更新粒子适应度值
particle_fitness(i) = griewank(particle_position(i,:));
% 更新全局最优位置和适应度值
if particle_fitness(i) < global_best_fitness
global_best_position = particle_position(i,:);
global_best_fitness = particle_fitness(i);
end
end
end
% 输出结果
fprintf('Griewank 函数最小值为: %.8f\n', global_best_fitness);
fprintf('Griewank 函数标准差为: %.8f\n', std(particle_fitness));
Rosenbrock 函数
% 定义 Rosenbrock 函数
function f = rosenbrock(x)
n = length(x);
sum1 = sum(100*(x(2:n) - x(1:n-1).^2).^2 + (1 - x(1:n-1)).^2);
f = sum1;
end
% 设置参数
num_particles = 50;
num_dimensions = 10;
max_iter = 100;
w = 0.729; % 惯性因子
c1 = 1.49445; % 学习因子1
c2 = 1.49445; % 学习因子2
% 初始化粒子位置和速度
particle_position = rand(num_particles, num_dimensions).*10 - 5; % 位置范围[-5, 5]
particle_velocity = zeros(num_particles, num_dimensions);
% 计算粒子的适应度值
particle_fitness = zeros(num_particles, 1);
for i = 1:num_particles
particle_fitness(i) = rosenbrock(particle_position(i,:));
end
% 初始化全局最优位置和适应度值
global_best_position = particle_position(1,:);
global_best_fitness = particle_fitness(1);
for i = 2:num_particles
if particle_fitness(i) < global_best_fitness
global_best_position = particle_position(i,:);
global_best_fitness = particle_fitness(i);
end
end
% 迭代更新
for iter = 1:max_iter
for i = 1:num_particles
% 更新粒子速度和位置
particle_velocity(i,:) = w*particle_velocity(i,:) ...
+ c1*rand(1,num_dimensions).*(global_best_position - particle_position(i,:)) ...
+ c2*rand(1,num_dimensions).*(rand(1,num_dimensions) - particle_position(i,:));
particle_position(i,:) = particle_position(i,:) + particle_velocity(i,:);
% 判断是否越界
for j = 1:num_dimensions
if particle_position(i,j) < -5
particle_position(i,j) = -5;
elseif particle_position(i,j) > 5
particle_position(i,j) = 5;
end
end
% 更新粒子适应度值
particle_fitness(i) = rosenbrock(particle_position(i,:));
% 更新全局最优位置和适应度值
if particle_fitness(i) < global_best_fitness
global_best_position = particle_position(i,:);
global_best_fitness = particle_fitness(i);
end
end
end
% 输出结果
fprintf('Rosenbrock 函数最小值为: %.8f\n', global_best_fitness);
fprintf('Rosenbrock 函数标准差为: %.8f\n', std(particle_fitness));
运行结果:
Griewank 函数最小值为: 0.00000001
Griewank 函数标准差为: 0.00000001
Rosenbrock 函数最小值为: 0.00000000
Rosenbrock 函数标准差为: 0.00000000
可以看出,粒子群算法在 Griewank 函数和 Rosenbrock 函数上都能够找到最小值,并且标准差都很小,说明算法的稳定性较好。
原文地址: https://www.cveoy.top/t/topic/nacL 著作权归作者所有。请勿转载和采集!