目录
0 引言
萤火虫算法(Firefy Algorithm,FA)是由学者Yang于2008年提出一种元启发式算法,该算法模仿自然界中萤火虫成虫发光特性的随机优化算发,通过萤火虫彼此吸引并赋予问题解答作为目标值,从而来得到最佳的目标值。
1 数学模型
FA的数学模型主要对萤火虫相互吸引过程进行数学模型构建,萤火虫相互吸引取决自身亮度和吸引度。其中,萤火虫发出荧光的亮度取决于自身所在位置的目标值,亮度越高表示所处的位置越好,即目标值越佳。吸引度与亮度有关,愈亮的萤火虫拥有愈高的吸引力,可吸引视线范围内亮度比其弱的萤虫往这个方向移动 。如果发光亮度相同,则萤火虫各自随机移动;具体模型如下:
1)定义亮度和吸引度:萤火虫相互吸引取决自身亮度和吸引度,其模型如下:
式中I0为初始亮度,γ为亮度损失因素,r为两个萤火虫之间的距离;β0为初始吸引度。
2)萤火虫的距离:采用欧几里得距离计算,具体如下:
式中问题的维度由“n”表示。si为第i个频率的萤火虫
3)萤火虫的移动:萤火虫i被吸引向萤火虫j移动的位置更新,具体模型构建如下:
式中rij为萤火虫i,j之间的距离。α为步长因子,∈i为高斯分布的随机数向量;
2 优化方式
前篇对支持向量机(支持向量机原理及MATLAB代码复现-CSDN博客)原理讲解,从支持向量机模型运算过程中,可以了解到模型高维映射核函数参数g和处罚因子c对模型预测结果影响最为重要。因此结合上述FA原理介绍,可以将支持向量机的超参数作为萤火虫个体位置,每一个种群位置对应支持向量机的预测值,将这个预测值作为适应度进行萤火虫的亮度进行相互吸引,模拟萤火虫的移动策略,更新下一代萤火虫个体。
3 MATLAB代码
3.1 伪代码
3.2 FA主函数代码
%%FA的主函数
% 基础参数
beta0 = 2;
gama = 1;
alpha = 0.2;
damx = norm(ub - lb); %二范数
% 初始化
x = initialization(fa_pop, ub, lb, dim);
Fitness = zeros (1,fa_pop);
for i = 1: fa_pop
Fitness (i) = fun(x,net);
end
[~,index] = min(Fitness);
global_Best_pos = x(index,:);
global_Best_score = Fitness(index);
x_nex = x;
% 主函数,确定萤火虫亮度和位置
for t = 1: fa_maxter
for i = 1: fa_pop
for j = 1: fa_pop
if Fitness(j)< Fitness(i)
r_ij = norm(x(i,:)- x(j,:))./damx;
beta = beta0* exp(-gama*r_ij^2);
pos_new = x(i,:)+ beta* (x(j,:)-x(i,:))+alpha.*rand(1,dim);
pos_new = boundary(pos_new,ub,lb,dim);
Fitness_new = fun(pos_new,net);
if Fitness_new <Fitness(i)
x_nex(i,:) = pos_new;
Fitness(i) = Fitness_new;
if Fitness_new < global_Best_score
global_Best_score = Fitness_new;
global_Best_pos = pos_new;
end
end
end
end
end
x_double= [x;x_nex];
for i = 1: 2 * fa_pop
Fitness_double(i) = fun(x_double(i,:),net);
end
[~,Sortindex] = sort(Fitness_double);
for k =1: fa_pop
x(k,:) = x_double(Sortindex(k),:);
end
Intercure(t) = global_Best_score;
end
Best_pos = global_Best_pos;
Best_score = global_Best_score;
end
3.3 FA-SVM/SVR
萤火虫算法优化支持向量机的回归预测模型和分类模型的MATLAB代码: