人工免疫算法matlab代码_第1页
人工免疫算法matlab代码_第2页
人工免疫算法matlab代码_第3页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、在生命科学领域中,人们已经对遗传 (Heredity) 与免疫 (Immunity) 等自然现象进行了广泛深入 的研究。六十年代 Bagley和Rosenberg等先驱在对这些研究成果进行分析与理解的基础上, 借鉴其相关内容和知识, 特别是遗传学方面的理论与概念, 并将其成功应用于工程科学的某 些领域,收到了良好的效果。时至八十年代中期,美国 Michigan 大学的 Hollan 教授不仅对 以前的学者们提出的遗传概念进行了总结与推广, 而且给出了简明清晰的算法描述, 并由此 形成目前一般意义上的遗传算法 (GeneticAlgorithm)GA 。由于遗传算法较以往传统的搜索算法 具有使用

2、方便、鲁棒性强、便于并行处理等特点,因而广泛应用于组合优化、结构设计、人 工智能等领域。另一方面, Farmer 和 Bersini 等人也先后在不同时期、不同程度地涉及到了 有关免疫的概念。遗传算法是一种具有生成+检测(generate and test)的迭代过程的搜索算法。从理论上分析, 迭代过程中, 在保留上一代最佳个体的前提下, 遗传算法是全局收敛的。 然而,在对算法的实施过程中不难发现两个主要遗传算子都是在一定发生概率的条件下,随机地、 没有指导地迭代搜索,因此它们在为群体中的个体提供了进化机会的同时, 也无可避免地产生了退化的可能。 在某些情况下, 这种退化现象还相当明显。另外,

3、 每一个待求的实 际问题都会有自身一些基本的、 显而易见的特征信息或知识。 然而遗传算法的交叉和变异算 子却相对固定, 在求解问题时, 可变的灵活程度较小。这无疑对算法的通用性是有益的,但 却忽视了问题的特征信息对求解问题时的辅助作用, 特别是在求解一些复杂问题时, 这种忽 视所带来的损失往往就比较明显了。 实践也表明, 仅仅使用遗传算法或者以其为代表的进化 算法,在模仿人类智能处理事物的能力方面还远远不足, 还必须更加深层次地挖掘与利用人 类的智能资源。 从这一点讲,学习生物智能、 开发、 进而利用生物智能是进化算法乃至智能 计算的一个永恒的话题。所以,研究者力图将生命科学中的免疫概念引入到

4、工程实践领域, 借助其中的有关知识与理论并将其与已有的一些智能算法有机地结合起来,以建立新的进化理论与算法, 来提高算法的整体性能。 基于这一思想, 将免疫概念及其理论应用于遗传算法, 在保留原算法优良特性的前提下, 力图有选择、 有目的地利用待求问题中的一些特征信息或 知识来抑制其优化过程中出现的退化现象, 这种算法称为免疫算法 (ImmuneAlgorithm)IA 。下 面将会给出算法的具体步骤, 证明其全局收敛性, 提出免疫疫苗的选择策略和免疫算子的构 造方法,理论分析和对TSP问题的仿真结果表明免疫算法不仅是有效的而且也是可行的,并较好地解决了遗传算法中的退化问题。immune.m

5、%这是免疫算法。这个算法几乎与遗传算法一样,只是多用了一个免疫函数 %免疫算法是遗传算法的变体,它不用杂交,而是采用注入疫苗的方法。 %疫苗是优秀染色体中的一段基因,把疫苗接种到其它染色体中 %注意:标准遗传算法的一个重要概念是,染色体是可能解的2 进制顺序号,由这个序号在可能解的集合 (解空间 )中找到可能解%这是免疫算法的主程序,它需要调用的函数如下。%接种疫苗函数:%function inoculateChromosome=immunity(chromosomeGroup,bacterinChromosome,parameter) %parameter:1, 随机制取染色体接种。2,每个

6、染色体都接种。 3,每个染色体都接种,但接种的位置是随机的%这个函数实现对染色体的疫苗接种%由染色体 (可能解的 2 进制 )顺序号找到可能解: %x=chromosome_x(fatherChromosomeGroup,oneDimensionSet,solutionSum); %把解代入非线性方程组计算误差函数:functionError=nonLinearSumError1(x);%判定程是否得解函数: solution,isTrue=isSolution(x,funtionError,solutionSumError);%选择最优染色体函数: %bestChromosome,least

7、FunctionError=best_worstChromosome(fatherChromosomeGroup,func tionError);%误差比较函数:从两个染色体中,选出误差较小的染色体 %holdBestChromosome,holdLeastFunctionError.% =compareBestChromosome(holdBestChromosome,holdLeastFunctionError,.% bestChromosome,leastFuntionError) %为染色体定义概率函数,好的染色体概率高,坏染色体概率低 %p=chromosomeProbability

8、(functionError);%按概率选择染色体函数: %slecteChromosomeGroup=selecteChromome(fatherChromosomeGroup,p); %父代染色体杂交产生子代染色体函数%sonChrmosomeGroup=crossChromosome(slecteChromosomeGroup,2); %防止染色体超出解空间的函数%chromosomeGroup=checkSequence(chromosomeGroup,solutionSum)%变异函数? therChromosomeGroup=varianceCh(sonChromosomeGrou

9、p,0.8,solutionN); %通过实验有如下结果:%1。染色体应当多一些 %2。通过概率选择染色体,在迭代早期会有效选出优秀的染色体,使解的误差迅速降低, %但随着迭代的进行,概率选择也会导致某种染色体在基因池中迅速增加,使染色体趋同, %这就减少了物种的多样性,反而难以逼近解%3。不用概率选择,仅采用染色体杂交,采用保留优秀染色体,也可以得到解 %4。单纯免疫效果不好,杂交+免疫效果比较好%程%序%开始运行clear,clc;%青理内存,清屏circleN=200;% 迭代次数format long%构%造可能解的空间,确定染色体的个数、长度 solutionSum=4;leftBo

10、undary=-10;rightBoundary=10;distance=1;chromosomeSum=500;solutionSumError=0.1;%solutionSum:非线性方程组的元数(待解变量的个数);leftBoundary:可能解的左边界; %rightBoundary:可能解的右边界;distanee:可能解的间隔,也是解的精度 %chromosomeSum:染色体的个数;solveSumError:解的误差 oneDimensionSet=leftBoundary:distance:rightBoundary;%oneDimensionSet: 可能解在一个数轴 (维

11、)上的集合 oneDimensionSetN=size(oneDimensionSet,2);% 返回 oneDimensionSet 中的元素个数 solutionN=oneDimensionSetNsolutionSum;% 解空间(解集合)中可能解的总数 binSolutionN=dec2bin(solutionN);% 把可能解的总数转换成二进制数 chromosomeLength=size(binSolutionN,2);% 由解空间中可能解的总数(二进制数 )计算染色体的长度%程%序初始化%随机生成初始可能解的顺序号,+1是为了防止出现 0 顺序号solutionSequence=

12、fix(rand(chromosomeSum,1)*solutionN)+1;for i=1:chromosomeSum% 防止解的顺序号超出解的个数if solutionSequence(i)>solutionN; solutionSequence(i)=solutionN; end end%染色体是解集合中的序号,它对应一个可能解%把解的十进制序号转成二进制序号 fatherChromosomeGroup=dec2bin(solutionSequence,chromosomeLength); holdLeastFunctionError=Inf;% 可能解的最小误差的初值holdBe

13、stChromosome=0;% 对应最小误差的染色体的初值 %开%始计算compute=1;circle=0;while compute% 开始迭代求解%由1:可能解的序号寻找解本身 (关键步骤 ) x=chromosome_x(fatherChromosomeGroup,oneDimensionSet,solutionSum); %:2把解代入非线性方程计算误差 functionError=nonLinearSumError1(x);% 把解代入方程计算误差 solution,minError,isTrue=isSolution(x,functionError,solutionSumErr

14、or);%isSolution函数根据误差functionError判定方程是否已经解开,isTrue=1方程得解。solution 是方程的解if isTrue=1'方程得解 'solutionminErrorreturn% 结束程序end%:3选择最好解对应的最优染色体bestChromosome,leastFunctionError=best_worstChromosome(fatherChromosomeGroup,functi onError);%:4保留每次迭代产生的最好的染色体 %本次最好解与上次最好解进行比较,如果上次最好解优于本次最好解,保留上次最好解; %反

15、之,保留本次最好解。保留的最好染色体放在holdBestChromosome 中holdBestChromosome,holdLeastFunctionError. =compareBestChromosome(holdBestChromosome,holdLeastFunctionError,. bestChromosome,leastFunctionError);circle=circle+1%minError%solutionholdLeastFunctionErrorif circle>circleNreturnend%把5:保留的最好的染色体holdBestChromosome

16、 加入到染色体群中 order=round(rand(1)*chromosomeSum);if order=0order=1;end fatherChromosomeGroup(order,:)=holdBestChromosome; functionError(order)=holdLeastFunctionError;%为6:每一条染色体 (即可能解的序号 )定义一个概率 (关键步骤 ) %好%的染色体概率高,坏的概率低。依据误差functionError 计算概率p,trueP=chromosomeProbability(functionError);if trueP ='Fai

17、l''可能解严重不适应方程,请重新开始'return% 结束程序end%:7按照概率筛选染色体 (关键步骤 )? =bin2dec(fatherChromosomeGroup)% 显示父染色体 %从父染体中选择优秀染色体%selecteChromosomeGroup=selecteChromosome(fatherChromosomeGroup,p); %:8染色体杂交 (关键步骤 )%sle=bin2dec(selecteChromosomeGroup)% 显示选择出来的解的序号 (染色体 ) %用概率筛选出的染色体 selecteChromosomeGroup 进行

18、杂交,产生子代染色体 %sonChromosomeGroup=crossChromosome(selecteChromosomeGroup,2);%不用概率筛选出的染色体selecteChromosomeGroup 进行杂交,而直接用上一代(父代 )的sonChromosomeGroup=crossChromosome(fatherChromosomeGroup,2);%sonChromosomeGroup=immunity(fatherChromosomeGroup,holdBestChromosome,3); %把疫苗接种到其它染色体中sonChromosomeGroup=immunity

19、(sonChromosomeGroup,holdBestChromosome,3); %cro=bin2dec(sonChromosomeGroup)% 显示杂交后的子代染色体 sonChromosomeGroup=checkSequence(sonChromosomeGroup,solutionN);% 检查杂交后的染色 体是否越界%:9变异%不杂交直接变异? therChromosomeGroup=varianceCh(fatherChromosomeGroup,0.1,solutionN);%杂交后变异fatherChromosomeGroup=varianceCh(sonChromos

20、omeGroup,0.5,solutionN);fatherChromosomeGroup=checkSequence(fatherChromosomeGroup,solutionN);% 检查变异后的 染色体是否越界end接种疫苗函数,这是和遗传算法唯一不同的函数,可以用它代替染色体的交叉操作。 %chromosomeGroup: 染色体组? chterinChromosome: 疫苗染色体,即最好的染色体。从这个染色体上取疫苗%parameter:接种疫苗的参数,即用什么方法接种%inoculateChromosome: 接种疫苗后的染色体function inoculateChromos

21、ome=immunity(chromosomeGroup,bacterinChromosome,parameter)chromosomeGroupSum,chromosomeLength=size(chromosomeGroup); row,bacterinChromosomeLength=size(bacterinChromosome);%chromosomeGroupSum: 染色体的条数; chromosomeLength :染色体的长度 switch parametercase 1%随机选择染色体进行接种for i=1:chromosomeGroupSum %从%疫苗染色体上定位疫苗

22、headDot=fix(rand(1)*bacterinChromosomeLength);%疫苗在染色体上左边的点位if headDot=0% 防止出现 0 点位headDot=1;endtailDot=fix(rand(1)*bacterinChromosomeLength); %疫苗在染色体上右边的点位 if tailDot=0% 防止出现 0 点位 tailDot=1;endif tailDot>headDot% 防止右边的点位大于左边的点位dot=headDot;headDot=tailDot;tailDot=dot;end%接%种 randChromosomeSequence

23、=round(rand(1)*chromosomeGroupSum);%随机产生 1 条染色体的序号,对这条染色体进行接种if randChromosomeSequence=0% 防止产生 0 序号 randChromosomeSequence=1;endinoculateChromosome(i,:).% 先把输入染色体传给输出 =chromosomeGroup(randChromosomeSequence,:);%执行免疫,即从疫苗染色体上取出一段基因做疫苗,再注入到其它染色体中 inoculateChromosome(i,headDot:tailDot).=bacterinChromos

24、ome(1,headDot:tailDot);endcase 2 %所有染色体挨个接种for i=1:chromosomeGroupSum %从%疫苗染色体上定位疫苗 headDot=fix(rand(1)*bacterinChromosomeLength);%疫苗在染色体上左边的点位if headDot=0%防止出现 0点位headDot=1;endtailDot=fix(rand(1)*bacterinChromosomeLength); %疫苗在染色体上右边的点位if tailDot=0% 防止出现 0 点位tailDot=1;endif tailDot>headDot% 防止右边

25、的点位大于左边的点位dot=headDot;headDot=tailDot;tailDot=dot;end%接%种 inoculateChromosome(i,:)=chromosomeGroup(i,:);% 先把输入染色体传给输出 %执行免疫,即从疫苗染色体上取出一段基因做疫苗,再注入到其它染色体中 inoculateChromosome(i,headDot:tailDot).=bacterinChromosome(1,headDot:tailDot);endcase 3 %接种位置是随机的for i=1:chromosomeGroupSum%从%疫苗染色体上定位疫苗 headDot=fix(rand(1)*bacterinChromosomeLength);%疫苗在染色体上左边的点位if headDot=0% 防止出现 0 点位headDot=1;endtailDot=fix(rand(1)*bacterinChromosomeLength);%疫苗在染色体上右边的点位if tailDot=0% 防止出现 0 点位tailDot=1;endi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论