本文實(shí)例講述了C++實(shí)現(xiàn)簡(jiǎn)單遺傳算法。分享給大家供大家參考。具體實(shí)現(xiàn)方法如下:
//遺傳算法 GA #include<iostream>#include <cstdlib>#include<bitset>using namespace std;const int L=5; //定義編碼的長(zhǎng)度 int f(int x) //定義測(cè)設(shè)函數(shù)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; //指定編碼的長(zhǎng)度 const int NG=20; //指定種群最大的繁殖的代數(shù) int t=0; //當(dāng)前繁殖的代數(shù) int p[pop_size]; //定義種群 int q[pop_size]; //定義繁殖種群 即種群的下一代 srand(6553); //定義隨機(jī)數(shù)生成的種子 double sum; //適值總和 double avl_sum; //適度平均值 double p_probability[pop_size]; //適值概率 double pp[pop_size];double pro; //定義隨機(jī)生成的概率 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 &); //聲明交叉函數(shù) //當(dāng)停止準(zhǔn)則不滿足 即繁殖代數(shù)沒(méi)到最大代數(shù) ,繼續(xù)繁殖while(t<=NG) { cout<<"繁殖的代數(shù):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++) //計(jì)算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++) //計(jì)算適值概率 { 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】區(qū)間產(chǎn)生隨機(jī)數(shù)if(pro<pm){bitset<L>v(p[i]); v.flip(j);p[i]=v.to_ulong();} } t++;cout<<endl; //種群繁殖一代 } cout<<"最終結(jié)果:"; for(int i(0);i<pop_size;i++) //算法結(jié)束,輸出結(jié)果 { cout<<p[i]<<" "; } cout<<endl;return 0;}//定義雜交操作 void Xover(int &a,int &b) { int pos; //隨機(jī)生成雜交點(diǎn) 即第幾個(gè)分量進(jìn)行相互交換pos=rand()%5+1; //在n個(gè)分量中,隨機(jī)確定第pos個(gè)分量 int j,k; j=pos; k=pos;bitset<L>e(a);bitset<L>f(b); //前pos個(gè)分量進(jìn)行相互交換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++) { if(e[k]==1) h.set(k); }a=g.to_ulong();b=h.to_ulong(); }希望本文所述對(duì)大家的C++程序設(shè)計(jì)有所幫助。
新聞熱點(diǎn)
疑難解答