1、但是交叉操作要在一定的概率下进行,这个概率称为交叉率,一般设置为0.5到0.95之间。交叉后产生的新个体组成的新种群如下:图3黑体字表示子代染色体继承母代个体的基因情况。五、变异变异就是对染色体的结构进行变异,使其改变原来的结构(值也就改变),达到突变进化的目的。变异操作也要遵从一定的概率来进行,一般设置为0到0.5之间。本文的变异方法直接采取基因位反转变异法,即0变为1,1变为0。要进行变异的基因位的选取也是随机的。六、终止规则遗传算法是要一代一代更替的,那么什么时候停止迭代呢?这个规则就叫终止规则。一般常用的终止规则有:若干代后终止,得到的解达到一定目标后终止,计算时间达到一定限度后终止等
2、方法。本文采用迭代数来限制。全文代码如下:view plaincopy to clipboardprint?1. #include /调用输入输出函数所需要的头文件 2. #include /调用getche函数所需要的头文件 3. #include /调用随机函数所需要的头文件 4. 5. typedef struct Chrom / 结构体类型,为单个染色体的结构; 6. 7. short int bit6;8. int fit;9. chrom;10. 11. void *evpop(chrom popcurrent4); /定义将会用到的几个函数;12. int x(chrom pop
3、current);13. int y(int x);14. void *pickchroms(chrom popcurrent4);15. void *crossover(chrom popnext4);16. void *mutation(chrom popnext4);17. 18. void main() / 主函数;19. 20. int num; / 迭代次数;21. int i,j,l,Max,k;22. Max=0; / 函数最大值 23. 24. printf(nWelcome to the Genetic Algorithm coded by Luay Al-wesi,edi
4、td by xujinpengn); / introduction to the program,欢迎词;25. printf(The Algorithm is based on the function y = -x2 + 5 to find the maximum value of the function.n26. 27. enter:printf(nPlease enter the no. of iterationsn 请输入您要设定的迭代数: 28. scanf(%d,&num); / 输入迭代次数,传送给参数num;29. 30. chrom popcurrent4; / 初始种群
5、规模为4;31. chrom popnext4; / 更新后种群规模仍为4;32. 33. 34. if(num1) 35. goto enter; / 判断输入的迭代次数是否为负或零,是的话重新输入;36. 37. evpop(popcurrent); / 随机产生初始种群;38. 39. for(i=0;inum;i+) / 开始迭代;40. 41. 42. printf(ni = %dn,i); / 输出当前迭代次数;43. 44. for(j=0;j4;j+) 45. 46. popnextj=popcurrentj; / 更新种群;47. 48. 49. pickchroms(pop
6、next); / 挑选优秀个体;50. crossover(popnext); / 交叉得到新个体;51. mutation(popnext); / 变异得到新个体;52. 53. for(j=0;54. 55. popcurrentj=popnextj; / 种群更替;56. 57. 58. / 等待迭代终止;59. 60. for(l=0;l Max) 63. 64. Max=popcurrentl.fit;65. k=l;66. 67. 68. 69. printf(n当x等于%d时,函数得到最大值为:%d ,k,Max);70. printf(nPress any key to end
7、 !71. 72. flushall(); / 清除所有缓冲区;73. getche(); / 从控制台取字符,不以回车为结束;74. 75. 76. 77. 78. 79. void *evpop(chrom popcurrent4) / 函数:随机生成初始种群;80. 81. int i,j,value;82. int random;83. for(j=0;j+) / 从种群中的第1个染色体到第4个染色体 84. 85. for(i=0;6;i+) / 从染色体的第1个基因位到第6个基因位 86. 87. random=rand(); / 产生一个随机值 88. random=(rando
8、m%2); / 随机产生0或者1 89. popcurrentj.biti=random; / 随机产生染色体上每一个基因位的值,0或1;90. 91. 92. value=x(popcurrentj); / 将二进制换算为十进制,得到一个整数值;93. popcurrentj.fit=y(x(popcurrentj); / 计算染色体的适应度值;94. printf(n popcurrent%d=%d%d%d%d%d%d value=%d fitness = %d,j,popcurrentj.bit5,popcurrentj.bit4,popcurrentj.bit3,popcurrentj
9、.bit2,popcurrentj.bit1,popcurrentj.bit0,value,popcurrentj.fit);95. / 输出整条染色体的编码情况, 96. 97. 98. return(0);99. 100. 101. 102. int x(chrom popcurrent) / 函数:将二进制换算为十进制;103. 104. int z;105. z=(popcurrent.bit0*1)+(popcurrent.bit1*2)+(popcurrent.bit2*4)+(popcurrent.bit3*8)+(popcurrent.bit4*16);106. 107. if
10、(popcurrent.bit5=1) 108. 109. z=z*(-1); / 考虑到符号;110. 111. 112. return(z);113. 114. 115. int y(int x) / 函数:求个体的适应度;116. 117. int y;118. y=-(x*x)+5; / 目标函数: y= - ( x 2 ) +5;119. return(y);120. 121. 122. void *pickchroms(chrom popcurrent4) / 函数:选择个体;123. 124. int i,j;125. chrom temp; / 中间变量 126. 127. f
11、or(i=0;i+) / 根据个体适应度来排序;(冒泡法) 128. 129. for(j=0;130. 131. if(popcurrentj+1.fitpopcurrentj.fit) 132. 133. temp=popcurrentj+1;134. popcurrentj+1=popcurrentj;135. popcurrentj=temp;136. 137. 138. 139. 140. for(i=0;i+) 141. 142. printf(nSorting:popnext%d fitness=%d,i,popcurrenti.fit);143. printf(n144. 14
12、5. flushall();146. return(0);147. 148. 149. void *crossover(chrom popnext4) / 函数:交叉操作;150. 151. 152. int random;153. int i;154. random=rand(); / 随机产生交叉点;155. random=(random%5)+1); / 交叉点控制在1到5之间;156. for(i=0;random;157. 158. popnext2.biti=popnext0.biti; / child 1 cross over 159. popnext3.biti=popnext
13、1.biti; / child 2 cross over 160. 161. 162. for(i=random;i+) / crossing the bits beyond the cross point index 163. 164. popnext2.biti=popnext1.biti;165. popnext3.biti=popnext0.biti; / chlid 2 cross over 166. 167. 168. for(i=0;169. 170. popnexti.fit=y(x(popnexti); / 为新个体计算适应度值;171. 172. 173. for(i=0;
14、174. 175. printf(nCrossOver popnext%d=%d%d%d%d%d%d value=%d fitness = %d,i,popnexti.bit5,popnexti.bit4,popnexti.bit3,popnexti.bit2,popnexti.bit1,popnexti.bit0,x(popnexti),popnexti.fit);176. / 输出新个体;177. 178. return(0);179. 180. 181. void *mutation(chrom popnext4) / 函数:变异操作;182. 183. 184. int random;
15、185. int row,col,value;186. random=rand()%50; / 随机产生0到49之间的数;187. 188. if(random=25) / random=25的概率只有2%,即变异率为0.02;189. 190. col=rand()%6; / 随机产生要变异的基因位号;191. row=rand()%4; / 随机产生要变异的染色体号;192. 193. if(popnextrow.bitcol=0) / 1变为0;194. 195. popnextrow.bitcol=1 ;196. 197. else if(popnextrow.bitcol=1) /
16、0变为1;198. 199. popnextrow.bitcol=0;200. 201. popnextrow.fit=y(x(popnextrow); / 计算变异后的适应度值;202. value=x(popnextrow);203. printf(nMutation occured in popnext%d bit%d:=%d%d%d%d%d%d value=%d fitness=%d,row,col,popnextrow.bit5,popnextrow.bit4,popnextrow.bit3,popnextrow.bit2,popnextrow.bit1,popnextrow.bit0,value,popnextrow.fit);204. 205. / 输出变异后的新个体;206. 207. 208. return(0);209.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1