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

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

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