声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2230|回复: 3

[人工智能] 免疫算法解非线性方程组

[复制链接]
发表于 2007-7-3 22:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
%这是免疫算法。这个算法几乎与遗传算法一样,只是多用了一个免疫函数
%免疫算法是遗传算法的变体,它不用杂交,而是采用注入疫苗的方法。
%疫苗是优秀染色体中的一段基因,把疫苗接种到其它染色体中

%注意:标准遗传算法的一个重要概念是,染色体是可能解的2进制顺序号,由这个序号在可能解的集合(解空间)中找到可能解
%这是免疫算法的主程序,它需要调用的函数如下。
%接种疫苗函数:
  1. %function inoculateChromosome=immunity(chromosomeGroup,bacterinChromosome,parameter)
  2. %parameter:1,随机制取染色体接种。2,每个染色体都接种。3,每个染色体都接种,但接种的位置是随机的
  3. %这个函数实现对染色体的疫苗接种
  4. %由染色体(可能解的2进制)顺序号找到可能解:
  5. %x=chromosome_x(fatherChromosomeGroup,oneDimensionSet,solutionSum);
  6. %把解代入非线性方程组计算误差函数:functionError=nonLinearSumError1(x);
  7. %判定程是否得解函数:[solution,isTrue]=isSolution(x,funtionError,solutionSumError);
  8. %选择最优染色体函数:
  9. %[bestChromosome,leastFunctionError]=best_worstChromosome(fatherChromosomeGroup,functionError);
  10. %误差比较函数:从两个染色体中,选出误差较小的染色体
  11. %[holdBestChromosome,holdLeastFunctionError]...
  12. % =compareBestChromosome(holdBestChromosome,holdLeastFunctionError,...
  13. % bestChromosome,leastFuntionError)
  14. %为染色体定义概率函数,好的染色体概率高,坏染色体概率低
  15. %p=chromosomeProbability(functionError);
  16. %按概率选择染色体函数:
  17. %slecteChromosomeGroup=selecteChromome(fatherChromosomeGroup,p);
  18. %父代染色体杂交产生子代染色体函数
  19. %sonChrmosomeGroup=crossChromosome(slecteChromosomeGroup,2);
  20. %防止染色体超出解空间的函数
  21. %chromosomeGroup=checkSequence(chromosomeGroup,solutionSum)
  22. %变异函数
  23. %fatherChromosomeGroup=varianceCh(sonChromosomeGroup,0.8,solutionN);
  24. %通过实验有如下结果:
  25. %1。染色体应当多一些
  26. %2。通过概率选择染色体,在迭代早期会有效选出优秀的染色体,使解的误差迅速降低,
  27. %但随着迭代的进行,概率选择也会导致某种染色体在基因池中迅速增加,使染色体趋同,
  28. %这就减少了物种的多样性,反而难以逼近解
  29. %3。不用概率选择,仅采用染色体杂交,采用保留优秀染色体,也可以得到解
  30. %4。单纯免疫效果不好,杂交+免疫效果比较好

  31. %%%%%%%%%%%%%%%%%%%%%%%%程序开始运行

  32. clear,clc;%清理内存,清屏
  33. circleN=200;%迭代次数
  34. format long

  35. %%%%%%%%%%%%%%%构造可能解的空间,确定染色体的个数、长度
  36. solutionSum=4;leftBoundary=-10;rightBoundary=10;
  37. distance=1;chromosomeSum=500;solutionSumError=0.1;
  38. %solutionSum:非线性方程组的元数(待解变量的个数);leftBoundary:可能解的左边界;
  39. %rightBoundary:可能解的右边界;distance:可能解的间隔,也是解的精度
  40. %chromosomeSum:染色体的个数;solveSumError:解的误差
  41. oneDimensionSet=leftBoundary:distance:rightBoundary;
  42. %oneDimensionSet:可能解在一个数轴(维)上的集合
  43. oneDimensionSetN=size(oneDimensionSet,2);%返回oneDimensionSet中的元素个数
  44. solutionN=oneDimensionSetN^solutionSum;%解空间(解集合)中可能解的总数
  45. binSolutionN=dec2bin(solutionN);%把可能解的总数转换成二进制数
  46. chromosomeLength=size(binSolutionN,2);%由解空间中可能解的总数(二进制数)计算染色体的长度

  47. %%%%%%%%%%%%%%%%程序初始化
  48. %随机生成初始可能解的顺序号,+1是为了防止出现0顺序号
  49. solutionSequence=fix(rand(chromosomeSum,1)*solutionN)+1;
  50. for i=1:chromosomeSum%防止解的顺序号超出解的个数
  51. if solutionSequence(i)>solutionN;
  52. solutionSequence(i)=solutionN;
  53. end
  54. end
  55. %染色体是解集合中的序号,它对应一个可能解
  56. %把解的十进制序号转成二进制序号
  57. fatherChromosomeGroup=dec2bin(solutionSequence,chromosomeLength);
  58. holdLeastFunctionError=Inf;%可能解的最小误差的初值
  59. holdBestChromosome=0;%对应最小误差的染色体的初值

  60. %%%%%%%%%%%%%%%%%%开始计算
  61. compute=1;
  62. circle=0;
  63. while compute%开始迭代求解
  64. %%%%%%%%%%%%%1:由可能解的序号寻找解本身(关键步骤)
  65. x=chromosome_x(fatherChromosomeGroup,oneDimensionSet,solutionSum);
  66. %%%%%%%%%%%%%2:把解代入非线性方程计算误差
  67. functionError=nonLinearSumError1(x);%把解代入方程计算误差
  68. [solution,minError,isTrue]=isSolution(x,functionError,solutionSumError);
  69. %isSolution函数根据误差functionError判定方程是否已经解开,isTrue=1,方程得解。solution是方程的解
  70. if isTrue==1
  71. '方程得解'
  72. solution
  73. minError
  74. return%结束程序
  75. end
  76. %%%%%%%%%%%%%3:选择最好解对应的最优染色体
  77. [bestChromosome,leastFunctionError]=best_worstChromosome(fatherChromosomeGroup,functionError);
  78. %%%%%%%%%%%%%4:保留每次迭代产生的最好的染色体
  79. %本次最好解与上次最好解进行比较,如果上次最好解优于本次最好解,保留上次最好解;
  80. %反之,保留本次最好解。保留的最好染色体放在holdBestChromosome中
  81. [holdBestChromosome,holdLeastFunctionError]...
  82. =compareBestChromosome(holdBestChromosome,holdLeastFunctionError,...
  83. bestChromosome,leastFunctionError);
  84. circle=circle+1
  85. %minError
  86. %solution
  87. holdLeastFunctionError
  88. if circle>circleN
  89. return
  90. end
  91. %%%%%%%%%%%%%%5:把保留的最好的染色体holdBestChromosome加入到染色体群中
  92. order=round(rand(1)*chromosomeSum);
  93. if order==0
  94. order=1;
  95. end
  96. fatherChromosomeGroup(order,:)=holdBestChromosome;
  97. functionError(order)=holdLeastFunctionError;

  98. %%%%%%%%%%%%%%%6:为每一条染色体(即可能解的序号)定义一个概率(关键步骤)
  99. %%%%%%%%%%%%%%%好的染色体概率高,坏的概率低。依据误差functionError计算概率
  100. [p,trueP]=chromosomeProbability(functionError);
  101. if trueP =='Fail'
  102. '可能解严重不适应方程,请重新开始'
  103. return%结束程序
  104. end
  105. %%%%%%%%%%%%%%%7:按照概率筛选染色体(关键步骤)
  106. %fa=bin2dec(fatherChromosomeGroup)%显示父染色体
  107. %从父染体中选择优秀染色体
  108. %selecteChromosomeGroup=selecteChromosome(fatherChromosomeGroup,p);
  109. %%%%%%%%%%%%%%%8:染色体杂交(关键步骤)
  110. %sle=bin2dec(selecteChromosomeGroup)%显示选择出来的解的序号(染色体)
  111. %用概率筛选出的染色体selecteChromosomeGroup进行杂交,产生子代染色体
  112. %sonChromosomeGroup=crossChromosome(selecteChromosomeGroup,2);
  113. %不用概率筛选出的染色体selecteChromosomeGroup进行杂交,而直接用上一代(父代)的
  114. sonChromosomeGroup=crossChromosome(fatherChromosomeGroup,2);
  115. %sonChromosomeGroup=immunity(fatherChromosomeGroup,holdBestChromosome,3);
  116. %把疫苗接种到其它染色体中
  117. sonChromosomeGroup=immunity(sonChromosomeGroup,holdBestChromosome,3);
  118. %cro=bin2dec(sonChromosomeGroup)%显示杂交后的子代染色体
  119. sonChromosomeGroup=checkSequence(sonChromosomeGroup,solutionN);%检查杂交后的染色体是否越界
  120. %%%%%%%%%%%%%%%9:变异
  121. %不杂交直接变异
  122. %fatherChromosomeGroup=varianceCh(fatherChromosomeGroup,0.1,solutionN);
  123. %杂交后变异
  124. fatherChromosomeGroup=varianceCh(sonChromosomeGroup,0.5,solutionN);
  125. fatherChromosomeGroup=checkSequence(fatherChromosomeGroup,solutionN);%检查变异后的染色体是否越界
  126. end
复制代码
回复
分享到:

使用道具 举报

 楼主| 发表于 2007-7-3 22:28 | 显示全部楼层
接种疫苗函数,这是和遗传算法唯一不同的函数,可以用它代替染色体的交叉操作。
  1. %chromosomeGroup:染色体组
  2. %bachterinChromosome:疫苗染色体,即最好的染色体。从这个染色体上取疫苗
  3. %parameter:接种疫苗的参数,即用什么方法接种
  4. %inoculateChromosome:接种疫苗后的染色体
  5. function inoculateChromosome=immunity(chromosomeGroup,bacterinChromosome,parameter)
  6. [chromosomeGroupSum,chromosomeLength]=size(chromosomeGroup);
  7. [row,bacterinChromosomeLength]=size(bacterinChromosome);
  8. %chromosomeGroupSum:染色体的条数;chromosomeLength:染色体的长度
  9. switch parameter
  10. case 1%随机选择染色体进行接种
  11. for i=1:chromosomeGroupSum
  12. %%%%%%%%%%%%从疫苗染色体上定位疫苗
  13. headDot=fix(rand(1)*bacterinChromosomeLength);
  14. %疫苗在染色体上左边的点位
  15. if headDot==0%防止出现0点位
  16. headDot=1;
  17. end
  18. tailDot=fix(rand(1)*bacterinChromosomeLength);
  19. %疫苗在染色体上右边的点位
  20. if tailDot==0%防止出现0点位
  21. tailDot=1;
  22. end
  23. if tailDot>headDot%防止右边的点位大于左边的点位
  24. dot=headDot;
  25. headDot=tailDot;
  26. tailDot=dot;
  27. end
  28. %%%%%%%%%%%%%接种
  29. randChromosomeSequence=round(rand(1)*chromosomeGroupSum);
  30. %随机产生1条染色体的序号,对这条染色体进行接种
  31. if randChromosomeSequence==0%防止产生0序号
  32. randChromosomeSequence=1;
  33. end
  34. inoculateChromosome(i,:)...%先把输入染色体传给输出
  35. =chromosomeGroup(randChromosomeSequence,:);
  36. %执行免疫,即从疫苗染色体上取出一段基因做疫苗,再注入到其它染色体中
  37. inoculateChromosome(i,headDot:tailDot)...
  38. =bacterinChromosome(1,headDot:tailDot);
  39. end
  40. case 2 %所有染色体挨个接种
  41. for i=1:chromosomeGroupSum
  42. %%%%%%%%%%%%从疫苗染色体上定位疫苗
  43. headDot=fix(rand(1)*bacterinChromosomeLength);
  44. %疫苗在染色体上左边的点位
  45. if headDot==0%防止出现0点位
  46. headDot=1;
  47. end
  48. tailDot=fix(rand(1)*bacterinChromosomeLength);
  49. %疫苗在染色体上右边的点位
  50. if tailDot==0%防止出现0点位
  51. tailDot=1;
  52. end
  53. if tailDot>headDot%防止右边的点位大于左边的点位
  54. dot=headDot;
  55. headDot=tailDot;
  56. tailDot=dot;
  57. end
  58. %%%%%%%%%%%%%接种
  59. inoculateChromosome(i,:)=chromosomeGroup(i,:);%先把输入染色体传给输出
  60. %执行免疫,即从疫苗染色体上取出一段基因做疫苗,再注入到其它染色体中
  61. inoculateChromosome(i,headDot:tailDot)...
  62. =bacterinChromosome(1,headDot:tailDot);
  63. end
  64. case 3 %接种位置是随机的
  65. for i=1:chromosomeGroupSum
  66. %%%%%%%%%%%%从疫苗染色体上定位疫苗
  67. headDot=fix(rand(1)*bacterinChromosomeLength);
  68. %疫苗在染色体上左边的点位
  69. if headDot==0%防止出现0点位
  70. headDot=1;
  71. end
  72. tailDot=fix(rand(1)*bacterinChromosomeLength);
  73. %疫苗在染色体上右边的点位
  74. if tailDot==0%防止出现0点位
  75. tailDot=1;
  76. end
  77. if tailDot>headDot%防止右边的点位大于左边的点位
  78. dot=headDot;
  79. headDot=tailDot;
  80. tailDot=dot;
  81. end
  82. %%%%%%%%%%%%%在染色体上随机定位接种位置
  83. inoculateDot=fix(rand(1)*chromosomeLength);%随机选择染色体的接种点位
  84. if inoculateDot==0
  85. inoculateDot=1;
  86. inoculateChromosome(i,:)=chromosomeGroup(i,:);
  87. inoculateChromosome(i,inoculateDot:tailDot-headDot+1)...
  88. =bacterinChromosome(1,headDot:tailDot);
  89. elseif inoculateDot<=headDot
  90. inoculateChromosome(i,:)=chromosomeGroup(i,:);
  91. inoculateChromosome(i,inoculateDot:inoculateDot+tailDot-headDot)...
  92. =bacterinChromosome(1,headDot:tailDot);
  93. elseif (chromosomeLength-inoculateDot)>=(tailDot-headDot)
  94. inoculateChromosome(i,:)=chromosomeGroup(i,:);
  95. inoculateChromosome(i,inoculateDot:inoculateDot+tailDot-headDot)...
  96. =bacterinChromosome(1,headDot:tailDot);
  97. else
  98. inoculateChromosome(i,:)=chromosomeGroup(i,:);
  99. inoculateChromosome(i,headDot:tailDot)...
  100. =bacterinChromosome(1,headDot:tailDot);
  101. end
  102. end
  103. end
复制代码


来自搜狐博客=〉人工智能
发表于 2007-12-10 11:08 | 显示全部楼层
请教,比较遗传、粒子群一类全局性算法,免疫有什么优势吗
 楼主| 发表于 2007-12-11 15:53 | 显示全部楼层
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-9-29 23:30 , Processed in 0.058622 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表