基于Matlab的单目标免疫算法(开源)

代码如下:

(代码仅供参考,能运行,如有错误,欢迎留言);

clear;
close all;
tic;
%%%%%%%%%%%%%%%%%%%%%免疫算法%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%单目标多变量%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

limit = [-8,10;-4,10;2,10];                     %变量范围
immunum = 50;                                  %免疫个体数目
maxgen = 100;                                   %最大免疫代数
clonum = 75;                                    %克隆个数

changpro = 0.5;                                 %变异概率
alfa = 1;                                       %激励度系数
belta = 1;                                      %激励度系数
detas = 0.2;                                    %相似度阈值
cregen = 0;                                     %当前迭代代数
virnum = size(limit,1);                         %免疫个体维数

%%%%%%%%%预定义%%%%%%%%%%%%%%%%%
newMSLL = zeros(1,immunum);
newf = rand(virnum,immunum);
f2 = rand(virnum,immunum/2);
f = rand(virnum,immunum);
bf = rand(virnum,immunum/2);
odist = zeros(1,immunum);
immucon = zeros(1,immunum);
cloboxMSLL = zeros(1,clonum);
aMSLL = zeros(1,immunum/2);
af = zeros(virnum,immunum/2);
aodist = zeros(1,immunum/2);
codist = zeros(1,immunum/2);
aimmucon = zeros(1,immunum/2);
bimmucon = zeros(1,immunum/2);
trace = zeros(1,maxgen);

%%%%%%%%%创建初始种群f%%%%%%%%%%%%%%%%%
for i = 1:1:virnum
    f(i,:) = newf(i,:)*( limit(i,2)- limit(i,1)) + limit(i,1);
end

%%%%%%%%%计算f适应度%%%%%%%%%%%%%%%%%
for np=1:immunum
    newMSLL(np) = fcn1(f(:,np));
end

%%%%%%%%%计算f个体浓度%%%%%%%%%%%%%%%%%
for np=1:immunum
    for j=1:immunum
        odist(j) = sum(sqrt((f(:,np)-f(:,j)).^2));              %亲和度,欧氏距离
        if odist(j) < detas
            odist(j)=1;
        else
            odist(j)=0;
        end
    end
    immucon(np)=sum(odist)/immunum;                                      %抗体浓度
end

%%%%%%%%%计算f激励度%%%%%%%%%%%%%%%%%
newMSLL = alfa*newMSLL - belta*immucon;                                  %抗体激励度

%%%%%%%%%f排序%%%%%%%%%%%%%%%%%
[newSortMSLL,Index] = sort(newMSLL,'descend');
newSortf = f(:,Index);

%%%%%%%%%免疫循环%%%%%%%%%%%%%%%%%%
while cregen < maxgen
    for i = 1:1:immunum/2
        temppoi = newSortf(:,i);
        clobox = repmat(temppoi,1,clonum);
        for j = 2:1:clonum
            for ii = 1:1:virnum
                %变异
                if rand > changpro
                    clobox(ii,j) = clobox(ii,j)+ ((0.6*rand(1,1)-0.3)*(limit(ii,2) - limit(ii,1)));
                end
                %边界条件处理
                if ( clobox(ii,j) > limit(ii,2)) || (clobox(ii,j) < limit(ii,1) )   %如果变异数值超过边界
                    clobox(ii,j) = rand(1,1)*(limit(ii,2)-limit(ii,1))+limit(ii,1);    %在范围内随机取数
                end
            end
        end
        %克隆抑制,保留亲和度最高个体
        for j=1:clonum
            cloboxMSLL(j) = fcn1(clobox(:,j));
        end
        [cloboxSortMSLL,Index] = sort(cloboxMSLL,'descend');
        aMSLL(i) = clob
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在生命科学领域中,人们已经对遗传(Heredity)与免疫(Immunity)等自然现象进行了广泛深入的研究。六十年代Bagley和Rosenberg等先驱在对这些研究成果进行分析与理解的基础上,借鉴其相关内容和知识,特别是遗传学方面的理论与概念,并将其成功应用于工程科学的某些领域,收到了良好的效果。时至八十年代中期,美国Michigan大学的Hollan教授不仅对以前的学者们提出的遗传概念进行了总结与推广,而且给出了简明清晰的算法描述,并由此形成目前一般意义上的遗传算法(GeneticAlgorithm)GA。由于遗传算法较以往传统的搜索算法具有使用方便、鲁棒性强、便于并行处理等特点,因而广泛应用于组合优化、结构设计、人工智能等领域。另一方面,Farmer和Bersini等人也先后在不同时期、不同程度地涉及到了有关免疫的概念。遗传算法是一种具有生成+检测 (generate and test)的迭代过程的搜索算法。从理论上分析,迭代过程中,在保留上一代最佳个体的前提下,遗传算法是全局收敛的。然而,在对算法的实施过程中不难发现两个主要遗传算子都是在一定发生概率的条件下,随机地、没有指导地迭代搜索,因此它们在为群体中的个体提供了进化机会的同时,也无可避免地产生了退化的可能。在某些情况下,这种退化现象还相当明显。另外,每一个待求的实际问题都会有自身一些基本的、显而易见的特征信息或知识。然而遗传算法的交叉和变异算子却相对固定,在求解问题时,可变的灵活程度较小。这无疑对算法的通用性是有益的,但却忽视了问题的特征信息对求解问题时的辅助作用,特别是在求解一些复杂问题时,这种忽视所带来的损失往往就比较明显了。实践也表明,仅仅使用遗传算法或者以其为代表的进化算法,在模仿人类智能处理事物的能力方面还远远不足,还必须更加深层次地挖掘与利用人类的智能资源。从这一点讲,学习生物智能、开发、进而利用生物智能是进化算法乃至智能计算的一个永恒的话题。所以,研究者力图将生命科学中的免疫概念引入到工程实践领域,借助其中的有关知识与理论并将其与已有的一些智能算法有机地结合起来,以建立新的进化理论与算法,来提高算法的整体性能。基于这一思想,将免疫概念及其理论应用于遗传算法,在保留原算法优良特性的前提下,力图有选择、有目的地利用待求问题中的一些特征信息或知识来抑制其优化过程中出现的退化现象,这种算法称为免疫算法(ImmuneAlgorithm)IA。下面将会给出算法的具体步骤,证明其全局收敛性,提出免疫疫苗的选择策略和免疫算子的构造方法,理论分析和对TSP问题的仿真结果表明免疫算法不仅是有效的而且也是可行的,并较好地解决了遗传算法中的退化问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值