声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3839|回复: 10

[人工智能] 遗传算法解集合覆盖问题

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

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

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

x
  1. %这是用遗传算法解集合覆盖问题的主程序
  2. %集合覆盖是指:
  3. %集合S={x1,x2,...,xn}
  4. %S上有一个集合族F={F1,F2,...Fm},即S包含F,
  5. %且F覆盖S,即F1UF2U...UFm=S
  6. %从F中找到一个子集Fi,Fj...Fq,使下式成立
  7. %min |Fi|+|Fj|+...+|Fq|
  8. % s.t. FiUFjU...UFq=S

  9. %主程序调用的函数有:
  10. %构造子集函数constructSubset(setN,subsetSum)
  11. %计算一条染色体中所有元素的总和,
  12. %也就是这条染色体(所代表的子集组合)中所有元素的个数
  13. %subsetSetSum=setSum(chromosomeGroup,F)
  14. %判断染色体是否覆盖集合S
  15. %isCover(chromosome,F,SS)
  16. %评价染色的函数:
  17. %valuation=appraisal(chromosomeGroup,F,SS)
  18. %这个函数通过一条染色体中所有元素的个数与集合S元素个数的差
  19. %评价染色体的好坏
  20. %该函数调用
  21. %subsetSetSum=setSum(chromosomeGroup,F)和
  22. %isCover(chromosome,F,SS)。

  23. %选择最优染色体函数:
  24. %[bestChromosome,leastFunctionError]=best_worstChromosome
  25. (fatherChromosomeGroup,functionError);
  26. %误差比较函数:从两个染色体中,选出误差较小的染色体
  27. %[holdBestChromosome,holdLeastFunctionError]...
  28. % =compareBestChromosome
  29. (holdBestChromosome,holdLeastFunctionError,...
  30. % bestChromosome,leastFuntionError)
  31. %为染色体定义概率函数,好的染色体概率高,坏染色体概率低
  32. %p=subsetChromosomeProbability(functionError);
  33. %按概率选择染色体函数:
  34. %slecteChromosomeGroup=selecteChromome(fatherChromosomeGroup,p);
  35. %父代染色体杂交产生子代染色体函数
  36. %sonChrmosomeGroup=crossChromosome(slecteChromosomeGroup,2);
  37. %变异函数
  38. %fatherChromosomeGroup=subsetVarianceCh(sonChromosomeGroup,0.8);

  39. %主程序运行过程
  40. %1 初始化
  41. %2 随机生成初始可能解:染色体
  42. %3 判定染色是不是解,如果是解,给出结果,结束程序
  43. %4 评价可能解,即评价染色体
  44. %5 给染色体赋概率
  45. %6 按概率选择染色体,同时把最好的染色体保留下来
  46. %7 染色体杂交,产生子代染色体
  47. %8 染色体变异:对子代染色修改
  48. %9 到3

  49. clear,clc

  50. setN=30;%setN:集合S中的元素个数
  51. SS=1:setN;
  52. subsetSum=10;%subsetN:子集族F中的子集数
  53. chromosomeGroupN=20;%染色体的条数
  54. F=constructSubset(setN,subsetSum);%构造子集
  55. solutionSumError=5;%染色体的冗余定为5,小于5,这条染色体是最小子集覆盖染
  56. 色体
  57. circleN=50;


  58. %构造一个解用来检查算法的有效性
  59. F{3}=[1 2 3 4 5 6 7];
  60. F{5}=[8 9 10 11 12 13 14 15];
  61. F{6}=[16 17 18 19 20 21 22];
  62. F{9}=[23 24 25 26 27 28 29 30];
  63. %随机产生一组染色体
  64. fatherChromosomeGroup=round(rand(chromosomeGroupN,subsetSum));
  65. holdLeastFunctionError=Inf;%可能解的最小误差的初值
  66. holdBestChromosome=0;%对应最小误差的染色体的初值
  67. fatherChromosomeGroup(1,:)=[0 0 1 0 1 1 0 0 1 0];
  68. %%%%%%%%%%%%%%%%%%开始计算
  69. compute=1;
  70. circle=0;
  71. while compute%开始迭代求解
  72. circle=circle+1;
  73. if circle>circleN
  74. compute=0;
  75. holdBestChromosome
  76. holdLeastFunctionError
  77. functionError
  78. fatherChromosomeGroup
  79. end

  80. %计算染色体的冗余:
  81. %如果染色体不能覆盖S,冗余=无穷大Inf
  82. %反之 冗余=染色体中所有元素个数的总和-S中所有元素的个数
  83. functionError=appraisal(fatherChromosomeGroup,F,SS);
  84. %%%%%%%%%%%%%2: 根据冗余判定是否是最小集合覆盖
  85. [solution,minError,isTrue]=isSolutionSubset
  86. (fatherChromosomeGroup,functionError,solutionSumError);
  87. %isSolution函数根据误差functionError判定方程是否已经解开,isTrue=1,方
  88. 程得解。solution是方程的解
  89. if isTrue==1
  90. '找到最小集合覆盖'
  91. solution
  92. minError
  93. return%结束程序
  94. end
  95. %%%%%%%%%%%%%3:选择最好解对应的最优染色体
  96. [bestChromosome,leastFunctionError]=best_worstChromosome
  97. (fatherChromosomeGroup,functionError);
  98. %%%%%%%%%%%%%4:保留每次迭代产生的最好的染色体
  99. %本次最好解与上次最好解进行比较,如果上次最好解优于本次最好解,保留上
  100. 次最好解;
  101. %反之,保留本次最好解。保留的最好染色体放在holdBestChromosome中
  102. [holdBestChromosome,holdLeastFunctionError]...
  103. =compareBestChromosome
  104. (holdBestChromosome,holdLeastFunctionError,...
  105. bestChromosome,leastFunctionError);

  106. %minError
  107. %solution
  108. %holdLeastFunctionError

  109. %%%%%%%%%%%%%%5:把保留的最好的染色体holdBestChromosome加入到染色体群

  110. order=round(rand(1)*chromosomeGroupN);
  111. if order==0
  112. order=1;
  113. end
  114. fatherChromosomeGroup(order,:)=holdBestChromosome;
  115. functionError(order)=holdLeastFunctionError;

  116. %%%%%%%%%%%%%%%6:为每一条染色体(即可能解的序号)定义一个概率(关键步骤)
  117. %%%%%%%%%%%%%%%好的染色体概率高,坏的概率低。依据误差functionError计
  118. 算概率
  119. [p,trueP]=subsetChromosomeProbability(functionError);
  120. if trueP =='Fail'
  121. '可能解严重不适应方程,请重新开始'
  122. return%结束程序
  123. end
  124. %%%%%%%%%%%%%%%7:按照概率筛选染色体(关键步骤)
  125. %fa=bin2dec(fatherChromosomeGroup)%显示父染色体
  126. %从父染体中选择优秀染色体
  127. %selecteChromosomeGroup=selecteChromosome(fatherChromosomeGroup,p);
  128. %%%%%%%%%%%%%%%8:染色体杂交(关键步骤)
  129. %sle=bin2dec(selecteChromosomeGroup)%显示选择出来的解的序号(染色体)
  130. %用概率筛选出的染色体selecteChromosomeGroup进行杂交,产生子代染色体
  131. %sonChromosomeGroup=crossChromosome(selecteChromosomeGroup,2);
  132. %不用概率筛选出的染色体selecteChromosomeGroup进行杂交,而直接用上一代
  133. (父代)的
  134. sonChromosomeGroup=crossChromosome(fatherChromosomeGroup,2);
  135. %cro=bin2dec(sonChromosomeGroup)%显示杂交后的子代染色体

  136. %%%%%%%%%%%%%%%9:变异
  137. %不杂交直接变异
  138. %fatherChromosomeGroup=varianceCh
  139. (fatherChromosomeGroup,0.1,solutionN);
  140. %杂交后变异
  141. fatherChromosomeGroup=subsetVarianceCh(sonChromosomeGroup,0.1);

  142. end
复制代码
回复
分享到:

使用道具 举报

 楼主| 发表于 2007-7-3 22:13 | 显示全部楼层
函数(1)

  1. %构造子集函数constructSubset(setN,subsetSum)
  2. %这是构造子集函数
  3. %setN:集合S的势(绝对值,大小,元素的个数)
  4. %subsetSum:集族F的势
  5. function F=constructSubset(setN,subsetSum)
  6. for i=1:setN%构造集合S
  7. S(i,:)=cellstr(strcat('x',num2str(i)));
  8. %一般情况下,MATLAB中的的字符矩阵要求矩阵中每行的字符数
  9. %相等,cellstr则可以通过转换矩阵为clle阵,把原矩阵中为求
  10. %每一行字符串相等而加在字串后的空格去掉
  11. %strcat:连接字串函数
  12. end
  13. %构造子集族F
  14. %注意:在这里,F中的子集只包含S中元素的序号
  15. %构造子集族的原理:
  16. %1 确定子集族的大小subsetSum,
  17. % i=0,i:子集的序号
  18. %2 i=i+1,如果i>subsetSum,停止程序
  19. % 确定S的一个副本SS:SS=S
  20. %3 随机确定第i个子集的大小subsetI_setN
  21. % 如果subsetI_setN>setN(集合S的大小),subsetI_setN=setN,Fi=SS
  22. % 反之
  23. % j=0,j:i子集中第j个元素的序号
  24. %4 j=j+1,如果i>subsetSum,此时第i个子集Fi构造完毕,到第5步
  25. % 随机从SS中选出一个元素SS(k)放入子集Fi的第j个位置:F(i,j)=SS(k)
  26. % 把SS(k)从SS中删除
  27. % 到第4步
  28. %5 到第2步
  29. %注意,在实际运算时,SS是S中元素的序号集合。

  30. for i=1:subsetSum%i:子集的序号
  31. subsetI_setN=round(rand(1)*setN)+1;
  32. %随机生成第i个子集的大小,也就是第i个子集所包含的元素个数
  33. %SS中装有S中每个元素的序号
  34. SS=1:setN;%设定集合S中元素序号的集合
  35. %每个子集的大小不得超过S
  36. if subsetI_setN>=setN
  37. subsetI_setN=fix(setN/2);
  38. %如果随机生成的元素个数超过了S,子集的大小等于S的1/2
  39. end
  40. setn=setN;
  41. for j=1:subsetI_setN
  42. %j:第i个子集中的第j个元素,把这个元素定名ij,ij=S中某元素的序号
  43. ij=round(rand(1)*setn)+1;%setN+1-j:SS中的元素数
  44. if ij>setn
  45. ij=setn;
  46. Fi(j)=SS(ij);
  47. SS(ij)=[];
  48. setn=size(SS,2);
  49. %删除SS中的第ij个元素,相当于删除了S中的第ij个元素,
  50. %因为子集中的元素不能相等
  51. else
  52. Fi(j)=SS(ij);
  53. SS(ij)=[];
  54. setn=size(SS,2);
  55. end
  56. end
  57. F{i}=Fi;
  58. Fi=[];
  59. end
复制代码
 楼主| 发表于 2007-7-3 22:13 | 显示全部楼层
函数(2)
  1. %计算一条染色体中所有元素的总和,
  2. %也就是这条染色体(所代表的子集组合)中所有元素的个数
  3. %subsetSetSum=setSum(chromosomeGroup,F)
  4. %判断染色体是否覆盖集合S
  5. %计算染色体组中每一条染色体(若干个子集的组合)中的元素和
  6. %chromosomeGroup:染色体组,每一条染色体是一个子集组合,染色体中的基因=1,
  7. %这个基因位对应的子集加入到组合中
  8. function subsetSetSum=setSum(chromosomeGroup,F)
  9. [chromosomeGroupN,chromosomeLength]=size(chromosomeGroup);
  10. for i=1:chromosomeGroupN%对每一条染色体循环,相当于取出第一个染色体
  11. allSubsetN=0;%i染色体中所有子集元素数的和
  12. for j=1:chromosomeLength%计算第i条染色体中所有子集元素数的和
  13. if chromosomeGroup(i,j)==1
  14. subset_j_N=size(F{j},2);%F{j}:子集族F中的第j个子集中元素的个数
  15. allSubsetN=allSubsetN+subset_j_N;
  16. end
  17. end
  18. subsetSetSum(i,1)=allSubsetN;
  19. end
复制代码
 楼主| 发表于 2007-7-3 22:13 | 显示全部楼层
函数(3):检查染色体(F中若干个子集的组合)是否可以覆盖S
  1. %这个函数检查染色体(F中若干个子集的组合)是否可以覆盖S
  2. %cover=1:染色体可以覆盖集合S;cover=0:染色体不能覆盖S
  3. function cover=isCover(chromosome,F,SS)
  4. %chromosome:染色体,代表一个子集组合
  5. %F:子集族,采用cell阵组织
  6. %SS:相当于S集的一个副本,存放S中所有元素的序列号
  7. cN=size(chromosome,2);%一条染色体中的基因数,也是F中的子集数
  8. SN=size(SS,2);%集合S中的元素数
  9. s=SS;
  10. sn=SN;
  11. %检查染色体是否覆盖S的算法如下
  12. %1 从染色体中取出一个子集Fi
  13. %2 把Fi中的元素逐一取出与s中的元素比较,如果相同,从s中把这个元素删除。
  14. %3 如果s={},s被染色体覆盖,检查停止
  15. %4 到1
  16. for i=1:cN%对基因循环,也就是取出子集i
  17. if chromosome(i)==1
  18. %染色体中的第i个基因为1,这个子集参与覆盖组合。
  19. %基因的位置号i是F中子集的序号
  20. Fi=F{i};%F采用cell阵组织。把第i个子集中的全部元素传给Fi
  21. FiN=size(Fi,2);%获得子集中的元素个数
  22. for j=1:FiN%对第i个子集中的每个元素循环,也就是把每个元素取出
  23. for k=1:sn%把集合S中的每个元素取出与Fi子集中的比对
  24. if Fi(j)==s(k)
  25. s(k)=[];%从s中删除与Fi子集相同的元素
  26. sn=size(s,2);
  27. if sn==0%s={},s为空,s被染色体覆盖
  28. cover=1;
  29. return
  30. end
  31. break
  32. end
  33. end
  34. end
  35. end
  36. end
  37. cover=0;
复制代码
 楼主| 发表于 2007-7-3 22:14 | 显示全部楼层
函数(4)评价染色的函数:
  1. %valuation=appraisal(chromosomeGroup,F,SS)
  2. %这个函数通过一条染色体中所有元素的个数与集合S元素个数的差
  3. %评价染色体的好坏
  4. %该函数调用
  5. %subsetSetSum=setSum(chromosomeGroup,F)和
  6. %isCover(chromosome,F,SS)。
  7. %评价染色体优劣的函数
  8. %chromosomeGroup:参与评价的染色体
  9. %一条染色体就是集族F中若个子集的一个组合
  10. %F:集族
  11. %SS:集合S的序号集,相当于S的副本
  12. function valuation=appraisal(chromosomeGroup,F,SS)
  13. %chromosomeGroupN:染色体的条数
  14. %subsetSum:集族F中子集的个数
  15. %染色体上的一个基因代表一个子集Fj
  16. %基因的位置是j,基因=0,第j个子集Fj不参与评价
  17. %基因=1,第j个子集Fj参与评价
  18. %评价原则:
  19. %1 覆盖优先:染色体中所有的子集Fj能够覆盖S,对这样的染色体再进行评价
  20. %2 冗余越多,染色体越不好。
  21. % 冗余定义如下:
  22. % 一条染色体上所有子集的势(子集中元素个数)的和allsubsetN
  23. % 冗余=allSubsetsN-S的势(S中元素的个数)
  24. %冗余放在valuation中
  25. [chromosomeGroupN,subsetSum]=size(chromosomeGroup);
  26. SSN=size(SS,2);
  27. %计算每条染色体所包含子集的元素的总和
  28. allSubsetN=setSum(chromosomeGroup,F);

  29. for i=1:chromosomeGroupN%染色体的序号
  30. cover(i,1)=isCover(chromosomeGroup(i,:),F,SS);
  31. end
  32. for i=1:chromosomeGroupN
  33. if cover(i,1)==1%染色体覆盖了集合S
  34. valuation(i,1)=allSubsetN(i,1)-SSN;%计算冗余
  35. else
  36. valuation(i,1)=Inf;%染色体不能覆盖冗余
  37. end
  38. end
复制代码
 楼主| 发表于 2007-7-3 22:14 | 显示全部楼层
函数(5)
  1. %选择最优染色体函数:
  2. %[bestChromosome,leastFunctionError]=best_worstChromosome
  3. (fatherChromosomeGroup,functionError);
  4. %找出最小误差所对应的最好染色体,最大误差所对应的最坏染色体
  5. function [bestChromosome,leastFunctionError]=best_worstChromosome(chromosomeGroup,functionError)
  6. [leastFunctionError minErrorOrder]=min(functionError);
  7. %[maxFunctionError maxErrorOrder]=max(functionError);
  8. bestChromosome=chromosomeGroup(minErrorOrder,:);
  9. %worstChromosome=chromosomeGroup(maxErrorOrder,:);
复制代码
 楼主| 发表于 2007-7-3 22:14 | 显示全部楼层
函数(6)

  1. %误差比较函数:从两个染色体中,选出误差较小的染色体
  2. %[holdBestChromosome,holdLeastFunctionError]...
  3. % =compareBestChromosome
  4. (holdBestChromosome,holdLeastFunctionError,...
  5. % bestChromosome,leastFuntionError)
  6. %选择最好的基因保留下来
  7. function [newBestChromosome,newLeastFunctionError]...
  8. =compareBestChromosome(oldBestChromosome,oldLeastFunctionError,...
  9. bestChromosome,leastFunctionError)
  10. if oldLeastFunctionError>leastFunctionError
  11. newLeastFunctionError=leastFunctionError;
  12. newBestChromosome=bestChromosome;
  13. else
  14. newLeastFunctionError=oldLeastFunctionError;
  15. newBestChromosome=oldBestChromosome;
  16. end
复制代码
 楼主| 发表于 2007-7-3 22:15 | 显示全部楼层
函数(7)
  1. %为染色体定义概率函数,好的染色体概率高,坏染色体概率低
  2. %p=subsetChromosomeProbability(functionError);
  3. %根据子集的冗余计算染色体的概率
  4. function [p,isP]=subsetChromosomeProbability(chromosomeRedundance)
  5. redundanceSum=size(chromosomeRedundance,1);
  6. InfN=sum(isinf(chromosomeRedundance));%估计非线性方程计算的结果

  7. if InfN==redundanceSum
  8. isP='Fail';
  9. p=0;
  10. return
  11. else
  12. isP='True';
  13. errorReciprocal=1./chromosomeRedundance;
  14. sumReciprocal=sum(errorReciprocal);
  15. p=errorReciprocal/sumReciprocal;%p:可能解所对应的染色体的概率
  16. end
复制代码
 楼主| 发表于 2007-7-3 22:15 | 显示全部楼层
函数(8)

  1. %按概率选择染色体函数:
  2. %slecteChromosomeGroup=selecteChromome(fatherChromosomeGroup,p);
  3. function chromosome=selecteChromosome(chromosomeGroup,p)
  4. cumuP=cumsum(p);%累积概率,也就是把每个染色体的概率映射到0~1的区间
  5. [chromosomeSum,chromosomeLength]=size(chromosomeGroup);
  6. for i=1:chromosomeSum%这个循环产生概率值
  7. rN=rand(1);
  8. if rN==1
  9. chromosome(i,:)=chromosomeGroup(chromosomeSum,:);
  10. elseif (0<=rN) && (rN<cumuP(1))
  11. chromosome(i,:)=chromosomeGroup(1,:);%第1条染色体被选中
  12. else
  13. for j=2:chromosomeSum%这个循环确定第1条以后的哪一条染色体被选中
  14. if (cumuP(j-1)<=rN) && (rN<cumuP(j))
  15. chromosome(i,:)=chromosomeGroup(j,:);
  16. break
  17. end
  18. end
  19. end
  20. end
复制代码
 楼主| 发表于 2007-7-3 22:15 | 显示全部楼层
函数(9)

  1. %父代染色体杂交产生子代染色体函数
  2. %sonChrmosomeGroup=crossChromosome(slecteChromosomeGroup,2);
  3. function sonChromosome=crossChromosome(fatherChromosome,parameter)
  4. [chromosomeSum,chromosomeLength]=size(fatherChromosome);
  5. %chromosomeSum:染色体的条数;chromosomeLength:染色体的长度
  6. switch parameter
  7. case 1%随机选择父染色体进行交叉重组
  8. for i=1:chromosomeSum/2
  9. crossDot=fix(rand(1)*chromosomeLength);%随机选择染色体的交叉点位
  10. randChromosomeSequence1=round(rand(1)*chromosomeSum);
  11. %随机产生第1条染色体的序号
  12. randChromosomeSequence2=round(rand(1)*chromosomeSum);
  13. %随机产生第2条染色体的序号,这两条染色体要进行杂交
  14. if randChromosomeSequence1==0%防止产生0序号
  15. randChromosomeSequence1=1;
  16. end
  17. if randChromosomeSequence2==0%防止产生0序号
  18. randChromosomeSequence2=1;
  19. end
  20. if crossDot==0 || crossDot==1
  21. sonChromosome(i*2-1,:)=fatherChromosome(randChromosomeSequence1,:);
  22. sonChromosome(i*2,:)=fatherChromosome(randChromosomeSequence2,:);
  23. else
  24. %执行两条染色体的交叉
  25. sonChromosome(i*2-1,:)=fatherChromosome(randChromosomeSequence1,:);
  26. %把父染色体整条传给子染色体
  27. sonChromosome(i*2-1,crossDot:chromosomeLength)=...
  28. fatherChromosome(randChromosomeSequence2,crossDot:chromosomeLength)
  29. %下一条父染色体上交叉点crossDot后的基因传给子染色体,完成前一条染色体的交叉
  30. sonChromosome(i*2,:)=fatherChromosome(randChromosomeSequence2,:);
  31. sonChromosome(i*2,crossDot:chromosomeLength)...
  32. =fatherChromosome(randChromosomeSequence1,crossDot:chromosomeLength)
  33. end
  34. end
  35. case 2 %父染色体的第i号与第chromosomeSum+1-i号交叉
  36. for i=1:chromosomeSum/2
  37. crossDot=fix(rand(1)*chromosomeLength);%随机选择染色体的交叉点位
  38. if crossDot==0 || crossDot==1
  39. sonChromosome(i*2-1,:)=fatherChromosome(i,:);
  40. sonChromosome(i*2,:)=fatherChromosome(chromosomeSum+1-i,:);
  41. else
  42. %执行两条染色体的交叉
  43. sonChromosome(i*2-1,:)=fatherChromosome(i,:);%把父染色体整条传给子染色体
  44. sonChromosome(i*2-1,crossDot:chromosomeLength)...
  45. =fatherChromosome(chromosomeSum+1-i,crossDot:chromosomeLength);
  46. %下一条父染色体上交叉点crossDot后的基因传给子染色体,完成前一条染色体的交叉
  47. sonChromosome(i*2,:)=fatherChromosome(chromosomeSum+1-i,:);
  48. sonChromosome(i*2,crossDot:chromosomeLength)...
  49. =fatherChromosome(i,crossDot:chromosomeLength);
  50. end
  51. end
  52. case 3 %父染色体的第i号与第i+chromosomeSum/2号交叉
  53. for i=1:chromosomeSum/2
  54. crossDot=fix(rand(1)*chromosomeLength);%随机选择染色体的交叉点位
  55. if crossDot==0 || crossDot==1
  56. sonChromosome(i*2-1,:)=fatherChromosome(i,:);
  57. sonChromosome(i*2,:)=fatherChromosome(i+chromosomeSum/2,:);
  58. else
  59. %执行两条染色体的交叉
  60. sonChromosome(i*2-1,:)=fatherChromosome(i,:);%把父染色体整条传给子染色体
  61. sonChromosome(i*2-1,crossDot:chromosomeLength)...
  62. =fatherChromosome(i+chromosomeSum/2,crossDot:chromosomeLength);
  63. %下一条父染色体上交叉点crossDot后的基因传给子染色体,完成前一条染色体的交叉
  64. sonChromosome(i*2,:)=fatherChromosome(i+chromosomeSum/2,:);
  65. sonChromosome(i*2,crossDot:chromosomeLength)...
  66. =fatherChromosome(i,crossDot:chromosomeLength);
  67. end
  68. end
  69. end
复制代码
 楼主| 发表于 2007-7-3 22:15 | 显示全部楼层
函数(10)
  1. %变异函数
  2. %fatherChromosomeGroup=subsetVarianceCh(sonChromosomeGroup,0.8);
  3. %基因变异.染色体群中的1/10变异。vR是变异概率。solutionN是解空间中全部可能解的个数
  4. function aberranceChromosomeGroup=subsetVarianceCh(chromosomeGroup,vR)
  5. [chromosomeSum,chromosomeLength]=size(chromosomeGroup);
  6. if chromosomeSum<10
  7. N=1;
  8. else
  9. N=round(chromosomeSum/10);
  10. end

  11. if rand(1)>vR %变异操作
  12. for i=1:N
  13. chromosomeOrder=round(rand(1)*chromosomeSum);%产生变异染色体序号
  14. if chromosomeOrder==0
  15. chromosomeOrder=1;
  16. end
  17. aberrancePosition=round(rand(1)*chromosomeLength);%产生变异位置
  18. if aberrancePosition==0
  19. aberrancePosition=1;
  20. end
  21. if chromosomeGroup(chromosomeOrder,aberrancePosition)==1
  22. chromosomeGroup(chromosomeOrder,aberrancePosition)=0;%变异
  23. else
  24. chromosomeGroup(chromosomeOrder,aberrancePosition)=1;%变异
  25. end
  26. end
  27. aberranceChromosomeGroup=chromosomeGroup;
  28. else
  29. aberranceChromosomeGroup=chromosomeGroup;
  30. end
复制代码


来自:搜狐博客=〉人工智能
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-17 19:31 , Processed in 0.067128 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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