人工免疫算法matlab代码
在生命科学领域中,人们已经对遗传(Heredity)与免疫(Immunity)等自然现象进行了广泛深入 的研究。六十年代 Bagley 和 Rosenberg 等先驱在对这些研究成果进行分析与理解的基础上, 借鉴其相关内容和知识, 特别是遗传学方面的理论与概念, 并将其成功应用于工程科学的某 些领域,收到了良好的效果。时至八十年代中期,美国 Michigan 大学的 Hollan 教授不仅对 以前的学者们提出的遗传概念进行了总结与推广, 而且给出了简明清晰的算法描述, 并由此 形成目前一般意义上的遗传算法(GeneticAlgorithm)GA。 由于遗传算法较以往传统的搜索算法 具有使用方便、鲁棒性强、便于并行处理等特点,因而广泛应用于组合优化、结构设计、人 工智能等领域。另一方面,Farmer 和 Bersini 等人也先后在不同时期、不同程度地涉及到了 有关免疫的概念。遗传算法是一种具有生成+检测 (generate and test)的迭代过程的搜索算法。 从理论上分析,迭代过程中,在保留上一代最佳个体的前提下,遗传算法是全局收敛的。然 而, 在对算法的实施过程中不难发现两个主要遗传算子都是在一定发生概率的条件下, 随机 地、没有指导地迭代搜索,因此它们在为群体中的个体提供了进化机会的同时,也无可避免 地产生了退化的可能。在某些情况下,这种退化现象还相当明显。另外,每一个待求的实际 问题都会有自身一些基本的、 显而易见的特征信息或知识。 然而遗传算法的交叉和变异算子 却相对固定,在求解问题时,可变的灵活程度较小。这无疑对算法的通用性是有益的,但却 忽视了问题的特征信息对求解问题时的辅助作用, 特别是在求解一些复杂问题时, 这种忽视 所带来的损失往往就比较明显了。 实践也表明, 仅仅使用遗传算法或者以其为代表的进化算 法, 在模仿人类智能处理事物的能力方面还远远不足, 还必须更加深层次地挖掘与利用人类 的智能资源。从这一点讲,学习生物智能、开发、进而利用生物智能是进化算法乃至智能计 算的一个永恒的话题。所以,研究者力图将生命科学中的免疫概念引入到工程实践领域,借 助其中的有关知识与理论并将其与已有的一些智能算法有机地结合起来, 以建立新的进化理 论与算法,来提高算法的整体性能。基于这一思想,将免疫概念及其理论应用于遗传算法, 在保留原算法优良特性的前提下, 力图有选择、 有目的地利用待求问题中的一些特征信息或 知识来抑制其优化过程中出现的退化现象,这种算法称为免疫算法(ImmuneAlgorithm)IA。下 面将会给出算法的具体步骤, 证明其全局收敛性, 提出免疫疫苗的选择策略和免疫算子的构 造方法, 理论分析和对 TSP 问题的仿真结果表明免疫算法不仅是有效的而且也是可行的, 并 较好地解决了遗传算法中的退化问题。 immune.m %这是免疫算法。这个算法几乎与遗传算法一样,只是多用了一个免疫函数 %免疫算法是遗传算法的变体,它不用杂交,而是采用注入疫苗的方法。 %疫苗是优秀染色体中的一段基因,把疫苗接种到其它染色体中 %注意:标准遗传算法的一个重要概念是,染色体是可能解的 2 进制顺序号,由这个序号在 可能解的集合(解空间)中找到可能解 %这是免疫算法的主程序,它需要调用的函数如下。 %接种疫苗函数: %function inoculateChromosome=immunity(chromosomeGroup,bacterinChromosome,parameter) %parameter:1,随机制取染色体接种。2,每个染色体都接种。3,每个染色体都接种,但接种 的位置是随机的 %这个函数实现对染色体的疫苗接种 %由染色体(可能解的 2 进制)顺序号找到可能解: %x=chromosome_x(fatherChromosomeGroup,oneDimensionSet,solutionSum); %把解代入非线性方程组计算误差函数:functionError=nonLinearSumError1(x); %判定程是否得解函数:[solution,isTrue]=isSolution(x,funtionError,solutionSumError); %选择最优染色体函数: %[bestChromosome,leastFunctionError]=best_worstChromosome(fatherChromosomeGroup,fun ctionError); %误差比较函数:从两个染色体中,选出误差较小的染色体 %[holdBestChromosome,holdLeastFunctionError]. % =compareBestChromosome(holdBestChromosome,holdLeastFunctionError,. % bestChromosome,leastFuntionError) %为染色体定义概率函数,好的染色体概率高,坏染色体概率低 %p=chromosomeProbability(functionError); %按概率选择染色体函数: %slecteChromosomeGroup=selecteChromome(fatherChromosomeGroup,p); %父代染色体杂交产生子代染色体函数 %sonChrmosomeGroup=crossChromosome(slecteChromosomeGroup,2); %防止染色体超出解空间的函数 %chromosomeGroup=checkSequence(chromosomeGroup,solutionSum) %变异函数 �therChromosomeGroup=varianceCh(sonChromosomeGroup,0.8,solutionN); %通过实验有如下结果: %1。染色体应当多一些 %2。通过概率选择染色体,在迭代早期会有效选出优秀的染色体,使解的误差迅速降低, %但随着迭代的进行,概率选择也会导致某种染色体在基因池中迅速增加,使染色体趋同, %这就减少了物种的多样性,反而难以逼近解 %3。不用概率选择,仅采用染色体杂交,采用保留优秀染色体,也可以得到解 %4。单纯免疫效果不好,杂交+免疫效果比较好 %%%%%%%%%%%%%%%%%%%%%%%%程序开始运行 clear,clc;%清理内存,清屏 circleN=200;%迭代次数 at long %%%%%%%%%%%%%%%构造可能解的空间,确定染色体的个数、长度 solutionSum=4;leftBoundary=-10;rightBoundary=10; distance=1;chromosomeSum=500;solutionSumError=0.1; %solutionSum:非线性方程组的元数(待解变量的个数);leftBoundary:可能解的左边界; %rightBoundary:可能解的右边界;distance:可能解的间隔,也是解的精度 %chromosomeSum:染色体的个数;solveSumError:解的误差 oneDimensionSet=leftBoundary: