⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hia.m

📁 免疫算法实现多峰、多极值函数平面曲面拟合
💻 M
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [nvault,progress,output]=hia(antibodies,training_x,training_y,vault,G)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 函数 hia 完成的是一个递阶免疫进化算法
%
% 本函数通过对RBF网络隐层节点位置和宽度的进化训练,并结合LS算法训练网络的输出层
% 权值,从而达到对整个RBF网络的优化设置,使之能高效的实现网络功能。
%
% 宽度疫苗在进化的过程中自适应提取,从而取名为宽度自适应提取的免疫算法。
% 
% 函数的结构是:
%       [prog,out]=hia(pop,dat_x,dat_y)
% 
% 其中输入参量为:
%   pop     (matrix)    初始的群体,大小是25*4*50。共代表了50个不同的个体,其中
%                       每一个个体的结构为25*4,以递阶编码的形式表示出了整个RBF
%                       网络的结构设置。初始情况均为随机生成。
%   dat_x   (matrix)    训练样本,大小是2*289,代表网络输入的训练向量组。每一个
%                       列向量代表了一个时刻的网络输入。
%   dat_y   (vector)    训练样本,大小是1*289,代表网络输出的训练数组。每一个值
%                       分别代表了与上述输入列向量相对应的输出值。
%   vault		已有疫苗库,大小为1*50
%   G			最大允许进化次数
%
% 输出参量:
%   prog    (vector)    记录算法进化过程中进化曲线走势的数组,每一个值纪录了在
%                       在该代进化后得到的群体中的最优个体的适应度值。
%   out     (matrix)    训练的最终结果,输出一个最合适的RBF网络结构。
%
% 同时请参考其他相关算法:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%执行的主循环就是免疫进化过程,每一次循环代表一代的进化完成
gen=0;	%初始设置代数为零
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
progress=zeros(1,G);
aver=progress;
while (gen<G)
    %这里设置计划进化的总代数
    gen=gen+1;
    %这一块的功能主要是将整个全体中的个体进行分析计算各自的适应度,并将最大的一个
    %适应度纪录在progress数组中。
    fit=zeros(1,size(antibodies,3));
    for i=1:size(antibodies,3)
	    %这一部操作调用了fitness的内部函数。为的是计算每一个体的适应度。
        fit(i)=fitness(antibodies(:,:,i),training_x,training_y);
    end
    [progress(gen),max_i]=max(fit);
    aver(gen)=sum(fit)/size(antibodies,3);
    %免疫库的更新,详细操作见update函数说明
    vault=update(vault,antibodies(:,:,max_i));
    %交叉变异再次进行,群体的大小翻了一倍。因为原先的群体和经过交叉变异的群体一同被保留。
    intermediate=antibodies;
    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=zeros(2*size(antibodies,3));
    inter_fit(1:size(antibodies,3))=fit;
    %接种操作是免疫算法的核心内容,每个个体都依一定的概率被接种,从而使网络的性能更快的收敛于一个最优的解。
    for i=size(antibodies,3)+1:2*size(antibodies,3)
        %这里就执行了自适应的宽度提取和接种两大操作,都在函数vaccination中完成。
        [inter_fit(i),intermediate(:,:,i)]=vaccination(intermediate(:,:,i),vault,training_x,training_y);
    end
    %群体选择机制和新群体的产生在这一步完成。基本思想是在两倍的群体中将个体按适应
    %度大小排序,然后去前一半就是我们想要得到的下一代的初始群体。但是还要执行的一
    %个操作就是打乱已选出的排列的个体的顺序。
    [ignore,index]=sort(inter_fit);
    antibodies=randomize(intermediate(:,:,index(size(antibodies,3)+1:2*size(antibodies,3))));
    fprintf('进化代数:%d',gen);
    fprintf('\t自适应函数值:%e\n',progress(gen));
end
% 完成进化算法后,要选取一个当前群体中的最优个体最为整个训练的最终结果。
for i=1:size(antibodies,3)
    fit(i)=fitness(antibodies(:,:,i),training_x,training_y);
end
[ignore,max_i]=max(fit);
nvault=vault;
output=antibodies(:,:,max_i);	% 这就是最终结果
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
% 内部函数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%相似度函数计算
function sim=similarity(vaccine_a,vaccine_b)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
length=size(vaccine_a,2)-1;
sim=norm(vaccine_a(1:length)-vaccine_b(1:length))+abs(vaccine_a(length+1)-vaccine_b(length+1));
if sim==0
    sim=1e20;
else
    sim=1/sim;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 免疫库更新
function new_vault=update(vault,elite)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 将一个精英个体中的每一个有效基因都消化入免疫库中,实现疫苗库的更新操作
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
new_vault=vault;
count=find(elite(:,1));	% 统计有效基因
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
sim_value=zeros(size(count,2),size(vault,1));
% 将每个基因替代库中的最近的疫苗
for i=1:size(count,1)
    for j=1:size(vault,1)
        sim_value(i,j)=similarity(vault(j,:),elite(count(i),2:size(elite,2)));
    end
    [ignore,max_i]=max(sim_value(i,:));	% 找到最相似的疫苗
    new_vault(max_i,:)=elite(count(i),2:size(elite,2));	% 执行替代操作
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 免疫接种
function [interfit,new_antibody]=vaccination(antibody,vault,training_x,training_y)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 在一个个体上,以50%的概率接种一个疫苗。
% 具体做法是随机选取一个疫苗,将目标个体中最相近的一个基因替代。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
new_antibody=antibody;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if rand<.5
    j=fix(rand*size(vault,1))+1;	% 随机选取一个疫苗
    count=find(antibody(:,1));
    sim_value=zeros(1,size(count,1));
    for k=1:size(count,1)
        sim_value(k)=similarity(vault(j,:),antibody(count(k),2:size(antibody,2)));
    end
    [ignore,max_i]=max(sim_value);	% 找出最接近的基因
    new_antibody(count(max_i),2:size(antibody,2))=vault(j,:);	% 替代操作
    %免疫检验
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    fit1=fitness(antibody,training_x,training_y);
    fit2=fitness(new_antibody,training_x,training_y);
    if fit1>fit2
        new_antibody=antibody;
        interfit=fit1;
    else
        interfit=fit2;
    end
else
    interfit=fitness(antibody,training_x,training_y);
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -