📄 sea.m
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [progress,output]=sea(antibodies,training_x,training_y,G)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%函数sea 完成的是一个宽度自适应提取的免疫进化算法
%
%本函数通过对RBF网络隐层节点位置和宽度的进化训练,并结合LS算法训练网络的输出层
%权值,从而达到对整个RBF网络的优化设置,使之能高效的实现网络功能。
%
%宽度疫苗在进化的过程中自适应提取,从而取名为宽度自适应提取的免疫算法。
%
%函数的结构是:
% [prog,out]=aria(pop,dat_x,dat_y)
%
%其中输入参量为:
% pop (matrix) 初始的群体,大小是25*4*50。共代表了50个不同的个体,其中
% 每一个个体的结构为25*4,以递阶编码的形式表示出了整个RBF
% 网络的结构设置。初始情况均为随机生成。
% dat_x (matrix) 训练样本,大小是2*289,代表网络输入的训练向量组。每一个
% 列向量代表了一个时刻的网络输入。
% dat_y (vector) 训练样本,大小是1*289,代表网络输出的训练数组。每一个值
% 分别代表了与上述输入列向量相对应的输出值。
%
%输出参量:
% prog (vector) 记录算法进化过程中进化曲线走势的数组,每一个值纪录了在
% 在该代进化后得到的群体中的最优个体的适应度值。
% out (matrix) 训练的最终结果,输出一个最合适的RBF网络结构。
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%执行的主循环就是免疫进化过程,每一次循环代表一代的进化完成
gen=0;
%初始设置代数为零
progress=zeros(1,G);
aver=progress;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
while gen<G % 这里设置计划进化的总代数
tic;
gen=gen+1;
%这一块的功能主要是将整个全体中的个体进行分析计算各自的适应度,并将最大的一个
%适应度纪录在progress数组中。
fit=zeros(1,size(antibodies,3));
%这一部操作调用了fitness的内部函数。为的是计算每一个体的适应度。
for i=1:size(antibodies,3)
fit(i)=fitness(antibodies(:,:,i),training_x,training_y);
end
progress(gen)=max(fit);
%交叉变异再次进行,群体的大小翻了一倍。因为原先的群体和经过交叉变异的群体一同被保留。
intermediate=antibodies;
%intermediate保存原先的和交叉变异后的所有群体
for i=1:2:size(antibodies,3)-1
% 这里执行交叉操作,每一个循环分别将群体中的个体配对交叉。进行下层的交叉。
intermediate(:,:,size(antibodies,3)+i:size(antibodies,3)+i+1)=crossover(antibodies(:,:,i:i+1));
end
%这里执行变异操作,上下两层的编码都进行变异,分两步完成。
for i=size(antibodies,3)+1:2*size(antibodies,3)
%先进行RS(即上层)得变异操作,在进行SG(即下层)得变异。
intermediate(:,:,i)=rs_mutation(intermediate(:,:,i));
intermediate(:,:,i)=sg_mutation(intermediate(:,:,i));
end
%群体选择机制和新群体的产生在这一步完成。基本思想是在两倍的群体中将个体按适应
%度大小排序,然后去前一半就是我们想要得到的下一代的初始群体。但是还要执行的一
%个操作就是打乱已选出的排列的个体的顺序。
inter_fit=fit;
for i=size(antibodies,3)+1:2*size(antibodies,3)
inter_fit(i)=fitness(intermediate(:,:,i),training_x,training_y);
end
[value,index]=sort(inter_fit);
%截取最优的一半个体并打乱排序
antibodies=randomize(intermediate(:,:,index(size(antibodies,3)+1:2*size(antibodies,3))));
timer=toc;
fprintf('代数:%d',gen);
fprintf('\t自适应函数值:%e\t\t',progress(gen));
fprintf('进化时间:%f\n',timer);
end
%完成进化算法后,要选取一个当前群体中的最优个体最为整个训练的最终结果。
for i=1:size(antibodies,3)
fit(i)=fitness(antibodies(:,:,i),training_x,training_y);
end
[fit_max,max_i]=max(fit);
output=antibodies(:,:,max_i);
%这就是最终结果
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -