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

首頁(yè) > 編程 > C++ > 正文

C++實(shí)現(xiàn)簡(jiǎn)單遺傳算法

2020-01-26 15:06:10
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文實(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ì)有所幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 阜康市| 行唐县| 马公市| 天镇县| 濮阳县| 张家港市| 大理市| 江山市| 忻州市| 新宁县| 滦平县| 额济纳旗| 灵璧县| 临颍县| 乌海市| 贵南县| 饶河县| 靖远县| 广州市| 阜平县| 太康县| 柯坪县| 衢州市| 福安市| 潮州市| 色达县| 苏尼特右旗| 遂平县| 洛宁县| 扶绥县| 武隆县| 临泽县| 信阳市| 武平县| 潼关县| 汝南县| 德兴市| 茂名市| 临武县| 临武县| 海宁市|