免疫算法 matlab程序解析.docx
- 文档编号:5757955
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:7
- 大小:17.61KB
免疫算法 matlab程序解析.docx
《免疫算法 matlab程序解析.docx》由会员分享,可在线阅读,更多相关《免疫算法 matlab程序解析.docx(7页珍藏版)》请在冰豆网上搜索。
免疫算法matlab程序解析
免疫算法matlab程序
这是免疫算法。
这个算法几乎与遗传算法一样,只是多用了一个免疫函数免疫算法是遗传算法的变体,它不用杂交,而是采用注入疫苗的方法。
疫苗是优秀染色体中的一段基因,把疫苗接种到其它染色体中。
注意:
标准遗传算法的一个重要概念是,染色体是可能解的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;%迭代次数
formatlong
%%%%%%%%%%%%%%%构造可能解的空间,确定染色体的个数、长度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;
fori=1:
chromosomeSum%防止解的顺序号超出解的个数
ifsolutionSequence(i>solutionN;
solutionSequence(i=solutionN;
end
end
%染色体是解集合中的序号,它对应一个可能解
%把解的十进制序号转成二进制序号
fatherChromosomeGroup=dec2bin(solutionSequence,chromosomeLength;
holdLeastFunctionError=Inf;%可能解的最小误差的初值
holdBestChromosome=0;%对应最小误差的染色体的初值
开始计算
compute=1;
circle=0;
whilecompute%开始迭代求解
%%%%%%%%%%%%%1:
由可能解的序号寻找解本身(关键步骤
x=chromosome_x(fatherChromosomeGroup,oneDimensionSet,solutionSum;%%%%%%%%%%%%%2:
把解代入非线性方程计算误差
functionError=nonLinearSumError1(x;%把解代入方程计算误差
[solution,minError,isTrue]=isSolution(x,functionError,solutionSumError;%isSolution函数根据误差functionError判定方程是否已经解开,isTrue=1,方程得解。
solution是方程的解
ifisTrue==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
ifcircle>circleN
return
end
%%%%%%%%%%%%%%5:
把保留的最好的染色体holdBestChromosome加入到染色体群中
order=round(rand(1*chromosomeSum;
iforder==0
order=1;
end
fatherChromosomeGroup(order,:
=holdBestChromosome;
functionError(order=holdLeastFunctionError;
%%%%%%%%%%%%%%%6:
为每一条染色体(即可能解的序号定义一个概率(关键步骤
%%%%%%%%%%%%%%%好的染色体概率高,坏的概率低。
依据误差functionError计算概率
[p,trueP]=chromosomeProbability(functionError;
iftrueP=='Fail'
'可能解严重不适应方程,请重新开始'
return%结束程序
end
按照概率筛选染色体(关键步骤
%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:
染色体的长度switchparameter
case1%随机选择染色体进行接种
fori=1:
chromosomeGroupSum
%%%%%%%%%%%%从疫苗染色体上定位疫苗
headDot=fix(rand(1*bacterinChromosomeLength;
%疫苗在染色体上左边的点位
ifheadDot==0%防止出现0点位
headDot=1;
end
tailDot=fix(rand(1*bacterinChromosomeLength;
%疫苗在染色体上右边的点位
iftailDot==0%防止出现0点位
tailDot=1;
end
iftailDot>headDot%防止右边的点位大于左边的点位
dot=headDot;
headDot=tailDot;
tailDot=dot;
end
接种
randChromosomeSequence=round(rand(1*chromosomeGroupSum;
%随机产生1条染色体的序号,对这条染色体进行接种
ifrandChromosomeSequence==0%防止产生0序号randChromosomeSequence=1;
end
inoculateChromosome(i,:
...%先把输入染色体传给输出
=chromosomeGroup(randChromosomeSequence,:
;
%执行免疫,即从疫苗染色体上取出一段基因做疫苗,再注入到其它染色体中
inoculateChromosome(i,headDot:
tailDot...=bacterinChromosome(1,headDot:
tailDot;endcase2%所有染色体挨个接种fori=1:
chromosomeGroupSum%%%%%%%%%%%%从疫苗染色体上定位疫苗headDot=fix(rand(1*bacterinChromosomeLength;%疫苗在染色体上左边的点位ifheadDot==0%防止出现0点位headDot=1;endtailDot=fix(rand(1*bacterinChromosomeLength;%疫苗在染色体上右边的点位iftailDot==0%防止出现0点位tailDot=1;endiftailDot>headDot%防止右边的点位大于左边的点位dot=headDot;headDot=tailDot;tailDot=dot;end%%%%%%%%%%%%%接种inoculateChromosome(i,:
=chromosomeGroup(i,:
;%先把输入染色体传给输出%执行免疫,即从疫苗染色体上取出一段基因做疫苗,再注入到其它染色体中inoculateChromosome(i,headDot:
tailDot...=bacterinChromosome(1,headDot:
tailDot;endcase3%接种位置是随机的fori=1:
chromosomeGroupSum%%%%%%%%%%%%从疫苗染色体上定位疫苗headDot=fix(rand(1*bacterinChromosomeLength;%疫苗在染色体上左边的点位ifheadDot==0%防止出现0点位headDot=1;endtailDot=fix(rand(1*bacterinChromosomeLength;%疫苗在染色体上右边的点位iftailDot==0%防止出现0点位tailDot=1;endiftailDot>headDot%防止右边的点位大于左边的点位dot=headDot;headDot=tailDot;tailDot=dot;
end在染色体上随机定位接种位置inoculateDot=fix(rand(1*chromosomeLength;%随机选择染色体的接种点位ifinoculateDot==0inoculateDot=1;inoculateChromosome(i,:
=chromosomeGroup(i,:
;inoculateChromosome(i,inoculateDot:
tailDot-headDot+1...=bacterinChromosome(1,headDot:
tailDot;elseifinoculateDot<=headDotinoculateChromosome(i,:
=chromosomeGroup(i,:
;inoculateChromosome(i,inoculateDot:
inoculateDot+tailDot-headDot...=bacterinChromosome(1,headDot:
tailDot;elseif(chromosomeLength-inoculateDot>=(tailDot-headDotinoculateChromosome(i,:
=chromosomeGroup(i,:
;inoculateChromosome(i,inoculateDot:
inoculateDot+tailDot-headDot...=bacterinChromosome(1,headDot:
tailDot;elseinoculateChromosome(i,:
=chromosomeGroup(i,:
;inoculateChromosome(i,headDot:
tailDot...=bacterinChromosome(1,headDot:
tailDot;endend
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 免疫算法 matlab程序解析 免疫 算法 matlab 程序 解析