实例介绍
【实例截图】
【核心代码】
免疫算法 matlab程序2008-04-19 21:38%这是免疫算法。这个算法几乎与遗传算法一样,只是多用了一个免疫函数 %免疫算法是遗传算法的变体,它不用杂交,而是采用注入疫苗的方法。 %疫苗是优秀染色体中的一段基因,把疫苗接种到其它染色体中 %注意:标准遗传算法的一个重要概念是,染色体是可能解的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,functionError); %误差比较函数:从两个染色体中,选出误差较小的染色体 %[holdBestChromosome,holdLeastFunctionError]... % =compareBestChromosome(holdBestChromosome,holdLeastFunctionError,... % bestChromosome,leastFuntionError) %为染色体定义概率函数,好的染色体概率高,坏染色体概率低 %p=chromosomeProbability(functionError); %按概率选择染色体函数: %slecteChromosomeGroup=selecteChromome(fatherChromosomeGroup,p); %父代染色体杂交产生子代染色体函数 %sonChrmosomeGroup=crossChromosome(slecteChromosomeGroup,2); %防止染色体超出解空间的函数 %chromosomeGroup=checkSequence(chromosomeGroup,solutionSum) %变异函数 %fatherChromosomeGroup=varianceCh(sonChromosomeGroup,0.8,solutionN); %通过实验有如下结果: %1。染色体应当多一些 %2。通过概率选择染色体,在迭代早期会有效选出优秀的染色体,使解的误差迅速降低, %但随着迭代的进行,概率选择也会导致某种染色体在基因池中迅速增加,使染色体趋同, %这就减少了物种的多样性,反而难以逼近解 %3。不用概率选择,仅采用染色体杂交,采用保留优秀染色体,也可以得到解 %4。单纯免疫效果不好,杂交 免疫效果比较好 %%%%%%%%%%%%%%%%%%%%%%%%程序开始运行 clear,clc;%清理内存,清屏 circleN=200;%迭代次数 format long %%%%%%%%%%%%%%%构造可能解的空间,确定染色体的个数、长度 solutionSum=4;leftBoundary=-10;rightBoundary=10; distance=1;chromosomeSum=500;solutionSumError=0.1; %solutionSum:非线性方程组的元数(待解变量的个数);leftBoundary:可能解的左边界; %rightBoundary:可能解的右边界;distance:可能解的间隔,也是解的精度 %chromosomeSum:染色体的个数;solveSumError:解的误差 oneDimensionSet=leftBoundary:distance:rightBoundary; %oneDimensionSet:可能解在一个数轴(维)上的集合 oneDimensionSetN=size(oneDimensionSet,2);%返回oneDimensionSet中的元素个数 solutionN=oneDimensionSetN^solutionSum;%解空间(解集合)中可能解的总数 binSolutionN=dec2bin(solutionN);%把可能解的总数转换成二进制数 chromosomeLength=size(binSolutionN,2);%由解空间中可能解的总数(二进制数)计算染色体的长度 %%%%%%%%%%%%%%%%程序初始化 %随机生成初始可能解的顺序号, 1是为了防止出现0顺序号 solutionSequence=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;%可能解的最小误差的初值 holdBestChromosome=0;%对应最小误差的染色体的初值 %%%%%%%%%%%%%%%%%%开始计算 compute=1; circle=0; while compute%开始迭代求解 %%%%%%%%%%%%%1:由可能解的序号寻找解本身(关键步骤) x=chromosome_x(fatherChromosomeGroup,oneDimensionSet,solutionSum); %%%%%%%%%%%%%2:把解代入非线性方程计算误差 functionError=nonLinearSumError1(x);%把解代入方程计算误差 [solution,minError,isTrue]=isSolution(x,functionError,solutionSumError); %isSolution函数根据误差functionError判定方程是否已经解开,isTrue=1,方程得解。solution是方程的解 if isTrue==1 '方程得解' solution minError return%结束程序 end %%%%%%%%%%%%%3:选择最好解对应的最优染色体 [bestChromosome,leastFunctionError]=best_worstChromosome(fatherChromosomeGroup,functionError); %%%%%%%%%%%%%4:保留每次迭代产生的最好的染色体 %本次最好解与上次最好解进行比较,如果上次最好解优于本次最好解,保留上次最好解; %反之,保留本次最好解。保留的最好染色体放在holdBestChromosome中 [holdBestChromosome,holdLeastFunctionError]... =compareBestChromosome(holdBestChromosome,holdLeastFunctionError,... bestChromosome,leastFunctionError); circle=circle 1 %minError %solution holdLeastFunctionError if circle>circleN return end %%%%%%%%%%%%%%5:把保留的最好的染色体holdBestChromosome加入到染色体群中 order=round(rand(1)*chromosomeSum); if order==0 order=1; end fatherChromosomeGroup(order,:)=holdBestChromosome; functionError(order)=holdLeastFunctionError; %%%%%%%%%%%%%%%6:为每一条染色体(即可能解的序号)定义一个概率(关键步骤) %%%%%%%%%%%%%%%好的染色体概率高,坏的概率低。依据误差functionError计算概率 [p,trueP]=chromosomeProbability(functionError); if trueP =='Fail' '可能解严重不适应方程,请重新开始' return%结束程序 end %%%%%%%%%%%%%%%7:按照概率筛选染色体(关键步骤) %fa=bin2dec(fatherChromosomeGroup)%显示父染色体 %从父染体中选择优秀染色体 %selecteChromosomeGroup=selecteChromosome(fatherChromosomeGroup,p); %%%%%%%%%%%%%%%8:染色体杂交(关键步骤) %sle=bin2dec(selecteChromosomeGroup)%显示选择出来的解的序号(染色体) %用概率筛选出的染色体selecteChromosomeGroup进行杂交,产生子代染色体 %sonChromosomeGroup=crossChromosome(selecteChromosomeGroup,2); %不用概率筛选出的染色体selecteChromosomeGroup进行杂交,而直接用上一代(父代)的 sonChromosomeGroup=crossChromosome(fatherChromosomeGroup,2); %sonChromosomeGroup=immunity(fatherChromosomeGroup,holdBestChromosome,3); %把疫苗接种到其它染色体中 sonChromosomeGroup=immunity(sonChromosomeGroup,holdBestChromosome,3); %cro=bin2dec(sonChromosomeGroup)%显示杂交后的子代染色体 sonChromosomeGroup=checkSequence(sonChromosomeGroup,solutionN);%检查杂交后的染色体是否越界 %%%%%%%%%%%%%%%9:变异 %不杂交直接变异 %fatherChromosomeGroup=varianceCh(fatherChromosomeGroup,0.1,solutionN); %杂交后变异 fatherChromosomeGroup=varianceCh(sonChromosomeGroup,0.5,solutionN); fatherChromosomeGroup=checkSequence(fatherChromosomeGroup,solutionN);%检查变异后的染色体是否越界 end 接种疫苗函数,这是和遗传算法唯一不同的函数,可以用它代替染色体的交叉操作。 %chromosomeGroup:染色体组 %bachterinChromosome:疫苗染色体,即最好的染色体。从这个染色体上取疫苗 %parameter:接种疫苗的参数,即用什么方法接种 %inoculateChromosome:接种疫苗后的染色体 function inoculateChromosome=immunity(chromosomeGroup,bacterinChromosome,parameter) [chromosomeGroupSum,chromosomeLength]=size(chromosomeGroup); [row,bacterinChromosomeLength]=size(bacterinChromosome); %chromosomeGroupSum:染色体的条数;chromosomeLength:染色体的长度 switch parameter case 1%随机选择染色体进行接种 for i=1:chromosomeGroupSum %%%%%%%%%%%%从疫苗染色体上定位疫苗 headDot=fix(rand(1)*bacterinChromosomeLength); %疫苗在染色体上左边的点位 if headDot==0%防止出现0点位 headDot=1; end tailDot=fix(rand(1)*bacterinChromosomeLength); %疫苗在染色体上右边的点位 if tailDot==0%防止出现0点位 tailDot=1; end if tailDot>headDot%防止右边的点位大于左边的点位 dot=headDot; headDot=tailDot; tailDot=dot; end %%%%%%%%%%%%%接种 randChromosomeSequence=round(rand(1)*chromosomeGroupSum); %随机产生1条染色体的序号,对这条染色体进行接种 if randChromosomeSequence==0%防止产生0序号 randChromosomeSequence=1; end inoculateChromosome(i,:)...%先把输入染色体传给输出 =chromosomeGroup(randChromosomeSequence,:); %执行免疫,即从疫苗染色体上取出一段基因做疫苗,再注入到其它染色体中 inoculateChromosome(i,headDot:tailDot)... =bacterinChromosome(1,headDot:tailDot); end case 2 %所有染色体挨个接种 for i=1:chromosomeGroupSum %%%%%%%%%%%%从疫苗染色体上定位疫苗 headDot=fix(rand(1)*bacterinChromosomeLength); %疫苗在染色体上左边的点位 if headDot==0%防止出现0点位 headDot=1; end tailDot=fix(rand(1)*bacterinChromosomeLength); %疫苗在染色体上右边的点位 if tailDot==0%防止出现0点位 tailDot=1; end if tailDot>headDot%防止右边的点位大于左边的点位 dot=headDot; headDot=tailDot; tailDot=dot; end %%%%%%%%%%%%%接种 inoculateChromosome(i,:)=chromosomeGroup(i,:);%先把输入染色体传给输出 %执行免疫,即从疫苗染色体上取出一段基因做疫苗,再注入到其它染色体中 inoculateChromosome(i,headDot:tailDot)... =bacterinChromosome(1,headDot:tailDot); end case 3 %接种位置是随机的 for i=1:chromosomeGroupSum %%%%%%%%%%%%从疫苗染色体上定位疫苗 headDot=fix(rand(1)*bacterinChromosomeLength); %疫苗在染色体上左边的点位 if headDot==0%防止出现0点位 headDot=1; end tailDot=fix(rand(1)*bacterinChromosomeLength); %疫苗在染色体上右边的点位 if tailDot==0%防止出现0点位 tailDot=1; end if tailDot>headDot%防止右边的点位大于左边的点位 dot=headDot; headDot=tailDot; tailDot=dot; end %%%%%%%%%%%%%在染色体上随机定位接种位置 inoculateDot=fix(rand(1)*chromosomeLength);%随机选择染色体的接种点位 if inoculateDot==0 inoculateDot=1; inoculateChromosome(i,:)=chromosomeGroup(i,:); inoculateChromosome(i,inoculateDot:tailDot-headDot 1)... =bacterinChromosome(1,headDot:tailDot); elseif inoculateDot<=headDot inoculateChromosome(i,:)=chromosomeGroup(i,:); inoculateChromosome(i,inoculateDot:inoculateDot tailDot-headDot)... =bacterinChromosome(1,headDot:tailDot); elseif (chromosomeLength-inoculateDot)>=(tailDot-headDot) inoculateChromosome(i,:)=chromosomeGroup(i,:); inoculateChromosome(i,inoculateDot:inoculateDot tailDot-headDot)... =bacterinChromosome(1,headDot:tailDot); else inoculateChromosome(i,:)=chromosomeGroup(i,:); inoculateChromosome(i,headDot:tailDot)... =bacterinChromosome(1,headDot:tailDot); end end
标签: 算法
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论