亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++遺傳算法類文件實例分析

2020-01-26 15:25:38
字體:
來源:轉載
供稿:網友

本文所述為C++實現的遺傳算法的類文件實例。一般來說遺傳算法可以解決許多問題,希望本文所述的C++遺傳算法類文件,可幫助你解決更多問題,并且代碼中為了便于讀者更好的理解,而加入了豐富的注釋內容,是新手學習遺傳算法不可多得的參考代碼。

具體代碼如下所示:

#include "stdafx.h"#include<iostream>#include<cstdio>#include<cstdlib>#include<cmath>#include<ctime>//把日期和時間轉換為字符串using namespace std;//Parametes setting           #define POPSIZE 200   //population size #define MAXGENS 1000  //max number of generation #define NVARS 2     //no of problem variables #define PXOVER  0.75 //probalility of crossover #define PMUTATION 0.15 //probalility of mutation #define TRUE 1#define FALSE 0#define LBOUND 0    #define UBOUND 12   #define STOP 0.001int generation;     //current generation noint cur_best;      //best individualdouble diff;      FILE *galog;      //an output filestruct genotype{   double gene[NVARS];   //a string of variables基因變量   double upper[NVARS];  //individual's variables upper bound 基因變量取值上確界   double lower[NVARS];  //individual's batiables lower bound 基因變量取值下確界   double fitness;     //individual's fitness個體適應值   double rfitness;    //relative fitness個體適應值占種群適應值比例   double cfitness;    //curmulation fitness個體適應值的累加比例 };struct genotype population[POPSIZE+1]; //population 當前種群 population[POPSIZE]用于存放個體最優值并假設最優個體能存活下去//在某些遺傳算法中最優值個體并不一定能夠存活下去struct genotype newpopulation[POPSIZE+1]; //new population replaces the old generation 子種群 /*Declaration of procedures used by the gentic algorithm*/ void initialize(void);          //初始化函數 double randval(double,double);      //隨機函數 double funtion(double x1,double x2);  //目標函數 void evaluate(void);          //評價函數 void keep_the_best(void);        //保留最優個體 void elitist(void);            //當前種群與子代種群最優值比較 void select(void); void crossover(void);          //基因重組函數 void swap(double *,double *);      //交換函數 void mutate(void);            //基因突變函數 double report(void);          //數據記錄函數void initialize(void) {  int i,j;   for(i=0;i<NVARS;i++)   {    for(j=0;j<POPSIZE+1;j++)    {       if(!i)       {        population[j].fitness=0;        population[j].rfitness=0;        population[j].cfitness=0;       }      population[j].lower[i]=LBOUND;      population[j].upper[i]=UBOUND;      population[j].gene[i]=randval(population[j].lower[i],population[j].upper[i]);     }   } }//***************************************************************************//Random value generator:generates a value within bounds//*************************************************************************** double randval(double low,double high) {   double val;   val=((double)(rand()%10000)/10000)*(high-low)+low;  return val; }//目標函數 double funtion(double x,double y){  double result1=sqrt(x*x+y*y)+sqrt((x-12)*(x-12)+y*y)+sqrt((x-8)*(x-8)+(y-6)*(y-6));  return result1;} //*************************************************************************** //Evaluation function:evaluate the individual's fitness.評價函數給出個體適應值//Each time the function is changes,the code has to be recompl //*************************************************************************** void evaluate(void) {  int mem;  int i;  double x[NVARS];  for(mem=0;mem<POPSIZE;mem++)   {    for(i=0;i<NVARS;i++)    x[i]=population[mem].gene[i];    population[mem].fitness=funtion(x[0],x[1]);//將目標函數值作為適應值  } } //*************************************************************************************** //Keep_the_best function:This function keeps track of the best member of the population.//找出種群中的個體最優值并將其移動到最后//*************************************************************************************** void keep_the_best() {   int mem;   int i;   cur_best=0;   for(mem=0;mem<POPSIZE;mem++)//找出最高適應值個體  {     if(population[mem].fitness<population[cur_best].fitness)     {       cur_best=mem;          }  }  //將最優個體復制至population[POSIZE]   if(population[cur_best].fitness<=population[POPSIZE].fitness||population[POPSIZE].fitness<1)//防止出現種群基因退化 故保留歷史最優個體  {    population[POPSIZE].fitness=population[cur_best].fitness;    for(i=0;i<NVARS;i++)    population[POPSIZE].gene[i]=population[cur_best].gene[i];  }  } //*************************************************************************** //last in the array.If the best individual from the new populatin is better//than the best individual from the previous population ,then copy the best //from the new population;else replace the worst individual from the current //population with the best one from the previous generation.防止種群最優值退化//*************************************************************************** void elitist(){   int i;  double best,worst;//適應值  int best_mem,worst_mem;//序號  best_mem=worst_mem=0;  best=population[best_mem].fitness;//最高適應值初始化  worst=population[worst_mem].fitness;//最低適應值初始化  for(i=1;i<POPSIZE;i++)//找出最高和最低適應值 算法有待改進   {         if(population[i].fitness<best)     {       best=population[i].fitness;      best_mem=i;     }    if(population[i].fitness>worst)     {       worst=population[i].fitness;      worst_mem=i;    }     }  if(best<=population[POPSIZE].fitness)//賦值   {    for(i=0;i<NVARS;i++)       population[POPSIZE].gene[i]=population[best_mem].gene[i];    population[POPSIZE].fitness=population[best_mem].fitness;   }   else  {     for(i=0;i<NVARS;i++)       population[worst_mem].gene[i]=population[POPSIZE].gene[i];     population[worst_mem].fitness=population[POPSIZE].fitness;   }} //*************************************************************************** //Select function:Standard proportional selection for maximization problems//incorporating elitist model--makes sure that the best member survives.篩選函數并產生子代//*************************************************************************** void select(void) {   int mem,i,j;   double sum=0;   double p;   for(mem=0;mem<POPSIZE;mem++)//所有適應值求和  {     sum+=population[mem].fitness;   }   for(mem=0;mem<POPSIZE;mem++)   {    population[mem].rfitness=population[mem].fitness/sum;//個人認為還不如建一個種群類 把sum看成類成員  }  population[0].cfitness=population[0].rfitness;  for(mem=1;mem<POPSIZE;mem++)  {    population[mem].cfitness=population[mem-1].cfitness+population[mem].rfitness;  }   for(i=0;i<POPSIZE;i++)  {     p=rand()%1000/1000.0;     if(p<population[0].cfitness)    {       newpopulation[i]=population[0];     }     else    {      for(j=0;j<POPSIZE;j++)         if(p>=population[j].cfitness&&p<population[j+1].cfitness)           newpopulation[i]=population[j+1];     }   }   for(i=0;i<POPSIZE;i++)//子代變父代     population[i]=newpopulation[i];}//*************************************************************************** //Crossover:performs crossover of the selected parents. //***************************************************************************void Xover(int one,int two)//基因重組函數{   int i;  int point;  if(NVARS>1)  {     if(NVARS==2)      point=1;    else      point=(rand()%(NVARS-1))+1;//兩個都重組嗎?    for(i=0;i<point;i++)//只有第一個基因發生重組有待改進      swap(&population[one].gene[i],&population[two].gene[i]);   } }//***************************************************************************//Swapp: a swap procedure the helps in swappling 2 variables//*************************************************************************** void swap(double *x,double *y) {  double temp;  temp=*x;  *x=*y;  *y=temp;} //*************************************************************************** //Crossover function:select two parents that take part in the crossover. //Implements a single point corssover.雜交函數 //***************************************************************************void crossover(void) {   int mem,one;   int first=0;   double x;  for(mem=0;mem<POPSIZE;++mem)  {    x=rand()%1000/1000.0;    if(x<PXOVER)     {       ++first;      if(first%2==0)//選擇雜交的個體對 雜交有待改進 事實上往往是強者與強者雜交 這里沒有考慮雌雄與雜交對象的選擇        Xover(one,mem);      else         one=mem; }  } }//*************************************************************************** //Mutation function:Random uniform mutation.a variable selected for mutation //變異函數 事實基因的變異往往具有某種局部性 //is replaced by a random value between lower and upper bounds of the variables. //*************************************************************************** void mutate(void) {   int i,j;   double lbound,hbound;   double x;   for(i=0;i<POPSIZE;i++)     for(j=0;j<NVARS;j++)     {       x=rand()%1000/1000.0;       if(x<PMUTATION)      {         lbound=population[i].lower[j];         hbound=population[i].upper[j];         population[i].gene[j]=randval(lbound,hbound);       }     } }//*************************************************************************** //Report function:Reports progress of the simulation. //*************************************************************************** double report(void) {  int i;  double best_val;//種群內最優適應值  double avg;//平均個體適應值   //double stddev;  double sum_square;//種群內個體適應值平方和  //double square_sum;  double sum;//種群適應值  sum=0.0;  sum_square=0.0;  for(i=0;i<POPSIZE;i++)   {     sum+=population[i].fitness;     sum_square+=population[i].fitness*population[i].fitness;   }  avg=sum/(double)POPSIZE;   //square_sum=avg*avg*(double)POPSIZE;   //stddev=sqrt((sum_square-square_sum)/(POPSIZE-1));  best_val=population[POPSIZE].fitness;  fprintf(galog,"%6d %6.3f %6.3f %6.3f %6.3f %6.3f/n",generation,best_val,population[POPSIZE].gene[0],population[POPSIZE].gene[1],avg,sum);  return avg; } //***************************************************************************//main function:Each generation involves selecting the best members,performing //crossover & mutation and then evaluating the resulting population,until the//terminating condition is satisfied. //*************************************************************************** void main(void) {   int i;   double temp;   double temp1;   if((galog=fopen("data.txt","w"))==NULL)  {    exit(1);   }  generation=1;  srand(time(NULL));//產生隨機數  fprintf(galog,"number value  x1   x2   avg   sum_value/n");  printf("generation best average standard/n");  initialize();  evaluate();  keep_the_best();  temp=report();//記錄,暫存上一代個體平均適應值     do   {           select();//篩選     crossover();//雜交     mutate();//變異     evaluate();//評價     keep_the_best();//elitist();     temp1=report();     diff=fabs(temp-temp1);//求浮點數x的絕對值     temp=temp1;     generation++;   }while(generation<MAXGENS&&diff>=STOP);   //fprintf(galog,"/n/n Simulation completed/n");   //fprintf(galog,"/n Best member:/n");   printf("/nBest member:/ngeneration:%d/n",generation);   for(i=0;i<NVARS;i++)   {     //fprintf(galog,"/n var(%d)=%3.3f",i,population[POPSIZE].gene[i]);     printf("X%d=%3.3f/n",i,population[POPSIZE].gene[i]);   }   //fprintf(galog,"/n/n Best fitness=%3.3f",population[POPSIZE].fitness);   fclose(galog);   printf("/nBest fitness=%3.3f/n",population[POPSIZE].fitness); }

感興趣的讀者可以動手測試一下代碼,希望對大家學習C++算法能有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩亚洲综合在线| 91精品视频在线免费观看| 中文字幕日韩在线视频| 亚洲全黄一级网站| 在线电影中文日韩| 91大神福利视频在线| 欧美一区二区大胆人体摄影专业网站| 91在线观看免费网站| 亚洲va久久久噜噜噜久久天堂| 国产成人免费91av在线| 91精品免费视频| 亚洲男人第一网站| 亚洲丝袜一区在线| 久久人人爽人人| 中文字幕欧美视频在线| 欧美亚洲另类视频| 亚洲一区二区在线播放| 日韩一区视频在线| 亚洲视频视频在线| 亚洲夜晚福利在线观看| 久久久久久97| 精品亚洲精品福利线在观看| 狠狠色狠色综合曰曰| 欧美第一页在线| 久热精品视频在线| 国产欧美日韩中文字幕| 色偷偷888欧美精品久久久| 久久成人精品一区二区三区| 国产一区二区美女视频| 欧美日韩另类视频| 美日韩精品视频免费看| 亚洲综合第一页| 在线观看欧美成人| 日本久久久久久久久| 欧美激情亚洲一区| 欧美高清视频在线播放| 国产精品国产三级国产专播精品人| 亚洲网站视频福利| 97久久精品在线| 精品亚洲aⅴ在线观看| 韩日精品中文字幕| 97精品欧美一区二区三区| 成人在线播放av| 日韩视频免费中文字幕| 91精品国产免费久久久久久| 精品亚洲国产成av人片传媒| 亚洲天堂男人天堂女人天堂| 亚洲国产第一页| 日韩在线视频导航| 欧美大片在线看免费观看| 深夜福利日韩在线看| 欧美专区福利在线| 亚洲新中文字幕| 日韩专区在线观看| 欧美主播福利视频| 国产综合福利在线| 日韩在线视频导航| 91豆花精品一区| 久久久久久噜噜噜久久久精品| 久久久久久国产精品| 国语自产精品视频在线看抢先版图片| 久久久伊人日本| 成人中心免费视频| 亚洲国内精品在线| 一区二区三区四区在线观看视频| 日韩av资源在线播放| 中文字幕精品www乱入免费视频| 国产成人精品视| 国产精品一区二区三区成人| 久久夜色精品国产| 久久久久久久一| 亚洲欧美中文字幕| 亚洲成年人在线播放| 狠狠久久亚洲欧美专区| 亚洲精品国产欧美| 疯狂蹂躏欧美一区二区精品| 国产成人高潮免费观看精品| 亚洲奶大毛多的老太婆| 国产精品久久久久久久久久久久久| 亚洲精品综合久久中文字幕| 精品久久久久久久久久久久久| 国产精品久久久久av免费| 欧美视频在线免费| 性色av一区二区三区在线观看| 韩国国内大量揄拍精品视频| 美女啪啪无遮挡免费久久网站| 久久综合伊人77777蜜臀| 欧美另类老肥妇| 性欧美xxxx视频在线观看| 最新的欧美黄色| 欧美激情中文字幕在线| 久久中文字幕在线视频| 国产精品入口免费视| 亚洲激情在线视频| 日韩中文字幕国产| 在线成人激情视频| 欧美精品videosex牲欧美| 性色av一区二区三区免费| 最近2019年日本中文免费字幕| 欧美中文字幕在线播放| 亚洲美女免费精品视频在线观看| 日韩免费黄色av| 久久久久久午夜| 精品福利一区二区| 久久99国产精品久久久久久久久| 国产69精品久久久久99| 精品福利视频导航| 欧美激情精品久久久久| 久久久亚洲精品视频| 亚洲视频自拍偷拍| 热久久这里只有精品| 成人黄色大片在线免费观看| 欧美视频在线视频| 欧美日韩亚洲天堂| 91成人国产在线观看| 日韩欧美中文第一页| 乱亲女秽乱长久久久| 国模吧一区二区三区| 日韩精品福利网站| 精品国内产的精品视频在线观看| 亚洲国产成人av在线| 亚洲精品久久久久久久久| 亚洲护士老师的毛茸茸最新章节| 久久久女人电视剧免费播放下载| 久久人91精品久久久久久不卡| 日韩在线免费高清视频| 久久伊人免费视频| 国产欧美精品在线播放| 午夜精品福利视频| 欧美精品在线极品| 亚洲人成77777在线观看网| 国产成人精品免高潮在线观看| 97久久精品国产| 成人xvideos免费视频| 欧美大片免费观看在线观看网站推荐| 国产精品久久久久久网站| 日韩在线观看免费高清| 激情亚洲一区二区三区四区| 国产亚洲一区二区精品| 一区二区欧美日韩视频| 久久九九热免费视频| 亚洲黄色在线观看| 欧美极品美女电影一区| 色先锋资源久久综合5566| 国产在线视频91| 国内精品久久久久久久久| 国内精品中文字幕| 亚洲国产高清高潮精品美女| 成人精品一区二区三区| 成人观看高清在线观看免费| 亚洲裸体xxxx| 日本一欧美一欧美一亚洲视频| 欧美日韩中国免费专区在线看| 国产成人精品久久二区二区91| 亚洲激情电影中文字幕| 欧美性xxxxxx| 91久久久国产精品| 国产精品久久久久久久久久99| 久久这里只有精品视频首页| 在线播放日韩精品| 自拍偷拍亚洲一区| 欧美日韩精品二区| 精品精品国产国产自在线| 69久久夜色精品国产69乱青草|