|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
- %这是免疫算法用于计算子集和的主程序。
- %免疫算法是遗传算法的变体,一般说来它不用杂交,而是采用注入疫苗的方法。
- %疫苗是优秀染色体中的一段基因,把疫苗接种到其它染色体中
- %但对于本程序还需要杂交。
- %子集和问题:
- %设有正整数集合S,正整数t,从S中找到一个子集S',使
- %min
- t-(s'1+s'2+...s'm)
- % s.t. t-(s'1+s'2+...s'm)>=0
- %主程序运行过程
- %1
- 初始化
- %2 随机生成初始可能解:染色体
- %3 判定染色是不是解,如果是解,给出结果,结束程序
- %4 选择最好解对应的最优染色体
- %5
- 把保留的最好的染色体holdBestChromosome加入到染色体群中
- %6 评价可能解,即评价染色体
- %7 给染色体赋概率
- %8
- 染色体杂交,产生子代染色体
- %9 从最好的染色体上截取基因片断做疫苗,注射到其它子代染色体中
- %10 染色体变异:对子代染色修改
- %11
- 到3
- %这是免疫算法的主程序,它需要调用的函数如下。
- %接种疫苗函数:
- %function
- inoculateChromosome=immunity(chromosomeGroup,bacterinChromosome,parameter)
- %parameter:1,随机选取染色体接种。2,每个染色体都接种。3,每个染色体都接种,但接种的位置是随机的
- %这个函数实现对染色体的疫苗接种
- %计算误差函数
- %chromosomeError=subsetError(chromosomeGroup,S,t)
- %选择最优染色体函数:
- %[bestChromosome,leastFunctionError]=best_worstChromosome(fatherChromosomeGroup,functionError);
- %误差比较函数:从两个染色体中,选出误差较小的染色体
- %[holdBestChromosome,holdLeastFunctionError]...
- %
- =compareBestChromosome(holdBestChromosome,holdLeastFunctionError,...
- %
- bestChromosome,leastFuntionError)
- %为染色体定义概率函数,好的染色体概率高,坏染色体概率低
- %p=chromosomeProbability(functionError);
- %按概率选择染色体函数:
- %slecteChromosomeGroup=selecteChromome(fatherChromosomeGroup,p);
- %父代染色体杂交产生子代染色体函数
- %sonChrmosomeGroup=crossChromosome(slecteChromosomeGroup,2);
- %变异函数
- %fatherChromosomeGroup=varianceCh(sonChromosomeGroup,0.8,solutionN);
- %通过实验有如下结果:
- %1。染色体应当多一些
- %2。通过概率选择染色体,在迭代早期会有效选出优秀的染色体,使解的误差迅速降低,
- %但随着迭代的进行,概率选择也会导致某种染色体在基因池中迅速增加,使染色体趋同,
- %这就减少了物种的多样性,反而难以逼近解
- %3。不用概率选择,仅采用染色体杂交,采用保留优秀染色体,也可以得到解
- %4。单纯免疫效果不好,杂交+免疫效果比较好
- %%%%%%%%%%%%%%%%%%%%%%%%程序开始运行
- clear,clc;%清理内存,清屏
- circleN=500;%迭代次数
- format
- long
- %%%%%%%%%%%%%%%%1:程序初始化
- chromosomeGroupN=50;%染色体的个数
- subsetSum=30;%集合S中的整数个数
- %随机产生正整数集S,正整数t
- [S,t]=subset(subsetSum)
- presision=10;
- %%%%%%%%%%%%%%%2:随机生成初始可能解:染色体
- %随机产生一组染色体
- fatherChromosomeGroup=round(rand(chromosomeGroupN,subsetSum));
- holdLeastChromosomeError=Inf;%可能解的最小误差的初值
- holdBestChromosome=0;%对应最小误差的染色体的初值
- %%%%%%%%%%%%%%%%%%开始计算
- compute=1;
- circle=0;
- while
- compute%开始迭代求解
- %%%%%%%%%%%%%%%%%%3: 判定染色是不是解,如果是解,给出结果,结束程序
- chromosomeError=subsetError(fatherChromosomeGroup,S,t);%计算染色体与t的误差
- [solution,minError,isTrue]...
- =isSolutionSubsetSum(fatherChromosomeGroup,chromosomeError,presision);
- %isSolutionSubsetSum函数根据误差functionError判定方程是否已经解开,isTrue=1,方程得解。solution是方程的解
- if
- isTrue==1
- '子集和问题得解'
- solution
- minError
- return%结束程序
- end
- %%%%%%%%%%%%%4:选择最好解对应的最优染色体
- [bestChromosome,leastChromosomeError]=best_worstChromosome(fatherChromosomeGroup,chromosomeError);
- %%%%%%%%%%%%%5:保留每次迭代产生的最好的染色体
- %本次最好解与上次最好解进行比较,如果上次最好解优于本次最好解,保留上次最好解;
- %反之,保留本次最好解。保留的最好染色体放在holdBestChromosome中
- [holdBestChromosome,holdLeastChromosomeError]...
- =compareBestChromosome(holdBestChromosome,holdLeastChromosomeError,...
- bestChromosome,leastChromosomeError);
- circle=circle+1
- holdLeastChromosomeError%显示每一次循环的染色体最小误差
- if
- circle>circleN
- return
- end
- %%%%%%%%%%%%%%5:把保留的最好的染色体holdBestChromosome加入到染色体群中
- order=round(rand(1)*chromosomeGroupN);
- if
- order==0
- order=1;
- end
- fatherChromosomeGroup(order,:)=holdBestChromosome;
- chromosomeError(order)=holdLeastChromosomeError;
- %%%%%%%%%%%%%%%6:为每一条染色体(即可能解的序号)定义一个概率(关键步骤)
- %%%%%%%%%%%%%%%好的染色体概率高,坏的概率低。依据误差functionError计算概率
- [p,trueP]=chromosomeProbability(chromosomeError);
- if
- trueP
- =='Fail'
- '可能解严重不适应方程,请重新开始'
- return%结束程序
- end
- %%%%%%%%%%%%%%%7:按照概率筛选染色体(关键步骤)
- %从父染体中选择优秀染色体
- 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)%显示杂交后的子代染色体
- %%%%%%%%%%%%%%%9:变异
- %不杂交直接变异
- %fatherChromosomeGroup=varianceCh(fatherChromosomeGroup,0.1,solutionN);
- %杂交后变异
- fatherChromosomeGroup=varianceCh(sonChromosomeGroup,0.5);
- end
复制代码 |
|