以下是使用 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 函数上都能够找到最小值,并且标准差都很小,说明算法的稳定性较好。

粒子群算法优化Griewank和Rosenbrock函数:Matlab代码实现及结果比较

原文地址: https://www.cveoy.top/t/topic/nacL 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录