国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > 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++程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 莱阳市| 日喀则市| 若尔盖县| 察隅县| 溧水县| 称多县| 景宁| 滁州市| 新乡县| 开封县| 衡阳市| 离岛区| 舞阳县| 南木林县| 峨山| 宁德市| 资源县| 子长县| 米泉市| 民权县| 鄂尔多斯市| 天峨县| 历史| 德州市| 页游| 石首市| 财经| 达拉特旗| 司法| 漳州市| 镇安县| 桦川县| 宝坻区| 华宁县| 罗甸县| 竹山县| 乡城县| 壶关县| 永顺县| 清远市| 枣强县|