介绍
模拟萤火虫的闪光机制,个体根据亮度(目标函数值)吸引其他个体移动,最终收敛到最优解,广泛应用于函数优化、图像处理等领域
本分示例问题
优化目标函数:Rastrigin函数
此函数具有多个局部极小值,但只有一个全局最小值在 (𝑥,𝑦)=(0,0)(x,y)=(0,0)。
步骤
初始化种群
计算每个萤火虫的亮度(适应度)
更新位置
重复以上步骤直到满足停止条件
代码
function firefly_algorithm
% 参数设置
n = 50; % 萤火虫数量
maxGen = 200; % 最大迭代次数
alpha = 0.5; % 随机移动参数
beta0 = 1; % 吸引度参数
gamma = 1; % 吸引度衰减参数
dim = 2; % 维度
lb = -5; % 下界
ub = 5; % 上界
% 初始化萤火虫位置
fireflies = lb + (ub - lb) * rand(n, dim);
bestFirefly = fireflies(1, :);
bestFitness = rastrigin(bestFirefly);
% 记录适应度变化
fitnessHistory = zeros(maxGen, 1);
% 主循环
for gen = 1:maxGen
% 计算亮度(适应度)
fitness = arrayfun(@(i) rastrigin(fireflies(i, :)), 1:n);
% 找到当前最优萤火虫
[currentBestFitness, bestIdx] = min(fitness);
if currentBestFitness < bestFitness
bestFitness = currentBestFitness;
bestFirefly = fireflies(bestIdx, :);
end
% 更新位置
for i = 1:n
for j = 1:n
if fitness(j) < fitness(i)
r = norm(fireflies(i, :) - fireflies(j, :));
beta = beta0 * exp(-gamma * r^2);
fireflies(i, :) = fireflies(i, :) + ...
beta * (fireflies(j, :) - fireflies(i, :)) + ...
alpha * (rand(1, dim) - 0.5);
% 保持在边界内
fireflies(i, :) = max(fireflies(i, :), lb);
fireflies(i, :) = min(fireflies(i, :), ub);
end
end
end
% 记录当前最优适应度
fitnessHistory(gen) = bestFitness;
disp(['Generation ', num2str(gen), ': Best Fitness = ', num2str(bestFitness)]);
end
% 显示结果
figure;
plot(fitnessHistory, 'LineWidth', 2);
title('Fitness Evolution');
xlabel('Generation');
ylabel('Best Fitness');
disp(['Optimal solution: x = ', num2str(bestFirefly(1)), ', y = ', num2str(bestFirefly(2))]);
end
function z = rastrigin(x)
% Rastrigin函数
z = 20 + sum(x.^2 - 10 * cos(2 * pi * x));
end
效果
说明
参数设置:定义萤火虫数量、最大迭代次数、随机移动参数、吸引度参数、维度和边界。
初始化萤火虫位置:在给定边界内随机生成初始种群
计算亮度(适应度):使用Rastrigin函数计算每个萤火虫的适应度
更新位置:根据亮度和吸引度更新每个萤火虫的位置
记录适应度变化:保存每代的最优适应度并显示优化过程