首页 > 编程 > C++ > 正文

C++实现简单遗传算法

2020-05-23 14:19:45
字体:大 中 小
来源:转载
供稿:网友

这篇文章主要介绍了C++实现简单遗传算法,以实例形式较为详细的分析了遗传算法的C++实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了C++实现简单遗传算法。分享给大家供大家参考。具体实现方法如下:

 

 
  1. //遗传算法 GA  
  2. #include<iostream> 
  3. #include <cstdlib> 
  4. #include<bitset> 
  5. using namespace std; 
  6. const int L=5; //定义编码的长度  
  7. int f(int x) //定义测设函数f(x)  
  8. { 
  9. int result; 
  10. result=x*x*x-60*x*x+900*x+100; 
  11. return result; 
  12. } 
  13. int main(int argc,char *argv[]) 
  14. { 
  15. int a(0),b(32); //定义x的定义域范围 
  16. const int pop_size=8; //定义种群大小 
  17. // int L; //指定编码的长度  
  18. const int NG=20; //指定种群最大的繁殖的代数  
  19. int t=0; //当前繁殖的代数  
  20. int p[pop_size]; //定义种群  
  21. int q[pop_size]; //定义繁殖种群 即种群的下一代  
  22. srand(6553); //定义随机数生成的种子  
  23. double sum; //适值总和  
  24. double avl_sum; //适度平均值  
  25. double p_probability[pop_size]; //适值概率  
  26. double pp[pop_size]; 
  27. double pro; //定义随机生成的概率  
  28. float pc=0.90; //定义交叉的概率  
  29. float pm=0.05; //定义变异的概率  
  30. cout<<"初始的种群 ";  
  31. for(int i=0;i<pop_size;i++) //生成初始的第0代种群  
  32. { 
  33. p[i]=rand()%31; 
  34. cout<<p[i]<<" "; 
  35. } 
  36. cout<<endl; 
  37. cout<<endl; 
  38. void Xover(int &,int &); //声明交叉函数  
  39. //当停止准则不满足 即繁殖代数没到最大代数 ,继续繁殖 
  40. while(t<=NG)  
  41. {  
  42. cout<<"繁殖的代数:t="<<t<<endl; 
  43. sum=0.0; 
  44. for(int i=0;i<pop_size;i++)  
  45. { 
  46. q[i]=p[i]; 
  47. cout<<q[i]<<" "; 
  48. } 
  49. cout<<endl; 
  50. for(int i=0;i<pop_size;i++) //计算sum  
  51. sum +=f(p[i]); 
  52. avl_sum=sum/pop_size; 
  53. cout<<"sum="<<sum<<endl; 
  54. cout<<"适度平均值="<<avl_sum<<endl;  
  55. for(int i=0;i<pop_size;i++) //计算适值概率  
  56. { 
  57. p_probability[i]=f(p[i])/sum; 
  58. if(i==0) 
  59. { 
  60. pp[i]=p_probability[i]; 
  61. cout<<"pp"<<i<<"="<<pp[i]<<endl; 
  62. } 
  63. else 
  64. { 
  65. pp[i]=p_probability[i]+pp[i-1]; 
  66. cout<<"pp"<<i<<"="<<pp[i]<<endl; 
  67. } 
  68. //cout<<"p_probability"<<i<<"="<<p_probability[i]<<endl; 
  69. } 
  70. //选择双亲 
  71. for(int i=0;i<pop_size;i++)  
  72. { 
  73. pro=rand()%1000/1000.0; 
  74. if(pro>=pp[0]&&pro<pp[1]) 
  75. p[i]=q[0];  
  76. else if(pro>=pp[1]&&pro<pp[2]) 
  77. p[i]=q[1]; 
  78. else if(pro>=pp[2]&&pro<pp[3]) 
  79. p[i]=q[2]; 
  80. else if(pro>=pp[3]&&pro<pp[4]) 
  81. p[i]=q[3]; 
  82. else if(pro>=pp[4]&&pro<pp[5]) 
  83. p[i]=q[4]; 
  84. else 
  85. p[i]=q[5];  
  86. } 
  87. //杂交算子 
  88. int r=0; 
  89. int z=0;  
  90. for(int j=0;j<pop_size;j++)  
  91. { 
  92. pro=rand()%1000/1000.0; 
  93. if(pro<pc) 
  94. { 
  95. ++z; 
  96. if(z%2==0) 
  97. Xover(p[r],p[j]); 
  98. else 
  99. r=j;  
  100. }  
  101. }  
  102. //变异算子  
  103. for(int i=1;i<=pop_size;i++) 
  104. for(int j=0;j<L;j++) 
  105. { 
  106. pro=rand()%1000/1000.0; //在【0,1】区间产生随机数 
  107. if(pro<pm) 
  108. { 
  109. bitset<L>v(p[i]);  
  110. v.flip(j); 
  111. p[i]=v.to_ulong(); 
  112. }  
  113. }  
  114. t++; 
  115. cout<<endl; //种群繁殖一代  
  116. } 
  117. cout<<"最终结果:";  
  118. for(int i(0);i<pop_size;i++) //算法结束,输出结果  
  119. { 
  120. cout<<p[i]<<" "; 
  121. } 
  122. cout<<endl; 
  123. return 0; 
  124. } 
  125. //定义杂交操作  
  126. void Xover(int &a,int &b)  
  127. {  
  128. int pos; //随机生成杂交点 即第几个分量进行相互交换 
  129. pos=rand()%5+1; //在n个分量中,随机确定第pos个分量  
  130. int j,k; 
  131. j=pos; 
  132. k=pos; 
  133. bitset<L>e(a); 
  134. bitset<L>f(b); //前pos个分量进行相互交换 
  135. bitset<L>g;  
  136. bitset<L>h; 
  137. for(int i=0;i<pos;i++) 
  138. { 
  139. if(e[i]==1) 
  140. g.set(i);  
  141. } 
  142. for(int i=0;i<pos;i++) 
  143. { 
  144. if(f[i]==1) 
  145. h.set(i); 
  146. } 
  147. for(j;j<L;j++) 
  148. { 
  149. if(f[j]==1) 
  150. g.set(j); 
  151. } 
  152. for(k;k<L;k++) 
  153. { 
  154. if(e[k]==1) 
  155. h.set(k); 
  156. } 
  157. a=g.to_ulong(); 
  158. b=h.to_ulong();  
  159. } 

希望本文所述对大家的C++程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表