本文實例講述了C++實現簡單遺傳算法。分享給大家供大家參考。具體實現方法如下:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 //遺傳算法 GA #include<iostream> #include <cstdlib> #include<bitset> using namespace std; const int L=5; //定義編碼的長度 int f(int x) //定義測設函數f(x) { int result; result=x*x*x-60*x*x+900*x+100; return result; } int main(int argc,char *argv[]) { int a(0),b(32); //定義x的定義域范圍 const int pop_size=8; //定義種群大小 // int L; //指定編碼的長度 const int NG=20; //指定種群最大的繁殖的代數 int t=0; //當前繁殖的代數 int p[pop_size]; //定義種群 int q[pop_size]; //定義繁殖種群 即種群的下一代 srand(6553); //定義隨機數生成的種子 double sum; //適值總和 double avl_sum; //適度平均值 double p_probability[pop_size]; //適值概率 double pp[pop_size]; double pro; //定義隨機生成的概率 float pc=0.90; //定義交叉的概率 float pm=0.05; //定義變異的概率 cout<<"初始的種群 "; for(int i=0;i<pop_size;i++) //生成初始的第0代種群 { p[i]=rand()%31; cout<<p[i]<<" "; } cout<<endl; cout<<endl; void Xover(int &,int &); //聲明交叉函數 //當停止准則不滿足 即繁殖代數沒到最大代數 ,繼續繁殖 while(t<=NG) { cout<<"繁殖的代數:t="<<t<<endl; sum=0.0; for(int i=0;i<pop_size;i++) { q[i]=p[i]; cout<<q[i]<<" "; } cout<<endl; for(int i=0;i<pop_size;i++) //計算sum sum +=f(p[i]); avl_sum=sum/pop_size; cout<<"sum="<<sum<<endl; cout<<"適度平均值="<<avl_sum<<endl; for(int i=0;i<pop_size;i++) //計算適值概率 { p_probability[i]=f(p[i])/sum; if(i==0) { pp[i]=p_probability[i]; cout<<"pp"<<i<<"="<<pp[i]<<endl; } else { pp[i]=p_probability[i]+pp[i-1]; cout<<"pp"<<i<<"="<<pp[i]<<endl; } //cout<<"p_probability"<<i<<"="<<p_probability[i]<<endl; } //選擇雙親 for(int i=0;i<pop_size;i++) { pro=rand()%1000/1000.0; if(pro>=pp[0]&&pro<pp[1]) p[i]=q[0]; else if(pro>=pp[1]&&pro<pp[2]) p[i]=q[1]; else if(pro>=pp[2]&&pro<pp[3]) p[i]=q[2]; else if(pro>=pp[3]&&pro<pp[4]) p[i]=q[3]; else if(pro>=pp[4]&&pro<pp[5]) p[i]=q[4]; else p[i]=q[5]; } //雜交算子 int r=0; int z=0; for(int j=0;j<pop_size;j++) { pro=rand()%1000/1000.0; if(pro<pc) { ++z; if(z%2==0) Xover(p[r],p[j]); else r=j; } } //變異算子 for(int i=1;i<=pop_size;i++) for(int j=0;j<L;j++) { pro=rand()%1000/1000.0; //在【0,1】區間產生隨機數 if(pro<pm) { bitset<L>v(p[i]); v.flip(j); p[i]=v.to_ulong(); } } t++; cout<<endl; //種群繁殖一代 } cout<<"最終結果:"; for(int i(0);i<pop_size;i++) //算法結束,輸出結果 { cout<<p[i]<<" "; } cout<<endl; return 0; } //定義雜交操作 void Xover(int &a,int &b) { int pos; //隨機生成雜交點 即第幾個分量進行相互交換 pos=rand()%5+1; //在n個分量中,隨機確定第pos個分量 int j,k; j=pos; k=pos; bitset<L>e(a); bitset<L>f(b); //前pos個分量進行相互交換 bitset<L>g; bitset<L>h; for(int i=0;i<pos;i++) { if(e[i]==1) g.set(i); } for(int i=0;i<pos;i++) { if(f[i]==1) h.set(i); } for(j;j<L;j++) { if(f[j]==1) g.set(j); } for(k;k<L;k++) {