⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gaincga.c

📁 这是一个面向对象的GA遗传算法库GAlib: A C++ Library of Genetic Algorithm Components)
💻 C
字号:
// $Header$/* ----------------------------------------------------------------------------  gainc.C  mbwall 28jul94  Copyright (c) 1995 Massachusetts Institute of Technology                     all rights reserved  Source file for the incremental genetic algorithm object.---------------------------------------------------------------------------- */#include <ga/GAIncGA.h>#include <ga/garandom.h>GAParameterList&GAIncrementalGA::registerDefaultParameters(GAParameterList& p) {  GAGeneticAlgorithm::registerDefaultParameters(p);  p.add(gaNnOffspring, gaSNnOffspring,	GAParameter::INT, &gaDefNumOff);  p.set(gaNscoreFrequency, &gaDefScoreFrequency2);  return p;}GAIncrementalGA::GAIncrementalGA(const GAGenome& c) : GAGeneticAlgorithm(c) {  child1 = pop->individual(0).clone(GAGenome::ATTRIBUTES);  child2 = pop->individual(0).clone(GAGenome::ATTRIBUTES);  child1->geneticAlgorithm(*this);  child2->geneticAlgorithm(*this);  rs = WORST;  rf = 0;  noffspr = gaDefNumOff;  params.add(gaNnOffspring, gaSNnOffspring, GAParameter::INT, &noffspr);  stats.scoreFrequency(gaDefScoreFrequency2);  params.set(gaNscoreFrequency, &gaDefScoreFrequency2);}GAIncrementalGA::GAIncrementalGA(const GAPopulation& p): GAGeneticAlgorithm(p){  child1 = pop->individual(0).clone(GAGenome::ATTRIBUTES);  child2 = pop->individual(0).clone(GAGenome::ATTRIBUTES);  child1->geneticAlgorithm(*this);  child2->geneticAlgorithm(*this);  rs = WORST;  rf = 0;  noffspr = gaDefNumOff;  params.add(gaNnOffspring, gaSNnOffspring, GAParameter::INT, &noffspr);  stats.scoreFrequency(gaDefScoreFrequency2);  params.set(gaNscoreFrequency, &gaDefScoreFrequency2);}GAIncrementalGA::GAIncrementalGA(const GAIncrementalGA& ga) :GAGeneticAlgorithm(ga){  child1 = (GAGenome *)0;  child2 = (GAGenome *)0;  copy(ga);}GAIncrementalGA::~GAIncrementalGA(){  delete child1;   delete child2;}GAIncrementalGA&GAIncrementalGA::operator=(const GAIncrementalGA& ga){  if(&ga != this) copy(ga);   return *this;}void GAIncrementalGA::copy(const GAGeneticAlgorithm & g){  GAGeneticAlgorithm::copy(g);  const GAIncrementalGA& ga = DYN_CAST(const GAIncrementalGA&, g);    rs = ga.rs;  rf = ga.rf;  noffspr = ga.noffspr;  if(child1) child1->copy(*ga.child1);  else child1 = ga.child1->clone();  if(child2) child2->copy(*ga.child2);  else child2 = ga.child2->clone();  child1->geneticAlgorithm(*this);  child2->geneticAlgorithm(*this);}intGAIncrementalGA::setptr(const char* name, const void* value){  int status = GAGeneticAlgorithm::setptr(name, value);  if(strcmp(name, gaNnOffspring) == 0 ||      strcmp(name, gaSNnOffspring) == 0){    nOffspring(*((int*)value));    status = 0;  }  return status;}intGAIncrementalGA::get(const char* name, void* value) const {  int status = GAGeneticAlgorithm::get(name, value);  if(strcmp(name, gaNnOffspring) == 0 ||      strcmp(name, gaSNnOffspring) == 0){    *((int*)value) = noffspr;    status = 0;  }  return status;}void GAIncrementalGA::objectiveFunction(GAGenome::Evaluator f){  GAGeneticAlgorithm::objectiveFunction(f);  child1->evaluator(f);  child2->evaluator(f);}void GAIncrementalGA::objectiveData(const GAEvalData& v){  GAGeneticAlgorithm::objectiveData(v);  child1->evalData(v);  child2->evalData(v);}GAIncrementalGA::ReplacementSchemeGAIncrementalGA::replacement(GAIncrementalGA::ReplacementScheme n, 	    GAIncrementalGA::ReplacementFunction f){  switch(n){  case BEST:  case WORST:  case RANDOM:  case PARENT:    rs = n;    break;  case CUSTOM:    if(f){ rs = n; rf = f; }    else GAErr(GA_LOC, className(), "replacement", gaErrNeedRS);    break;  default:    GAErr(GA_LOC, className(), "replacement", gaErrBadRS);    break;  }  return rs;}intGAIncrementalGA::nOffspring(unsigned int value){  if(value != 1 && value != 2){    GAErr(GA_LOC, className(), "numCrossStrategy", gaErrBadCS);    noffspr = 1;  }  else{    noffspr = value;  }  params.set(gaNnOffspring, value);  return noffspr;}// Do some basic stupidity checks then initialize the population.  We must // also initialize our temporary genomes, but we don't have to evaluate// them.  Finally, reset the statistics.voidGAIncrementalGA::initialize(unsigned int seed){  GARandomSeed(seed);  pop->initialize();  pop->evaluate(gaTrue);  stats.reset(*pop);  if(!scross) GAErr(GA_LOC, className(), "initialize", gaErrNoSexualMating);}//   Evolve a new generation of genomes.  A steady-state GA has no 'old'// and 'new' populations - we pick from the current population and replace its// members with the new ones we create.  We generate either one or two children// each 'generation'.  The replacement strategy is set by the GA.voidGAIncrementalGA::step(){  int mut, c1, c2;  GAGenome *mom, *dad;          // tmp holders for selected genomes  mom = &(pop->select());   dad = &(pop->select());   stats.numsel += 2;		// keep track of the number of selections  if(noffspr == 1){    c1 = 0;    if(GAFlipCoin(pCrossover())){      stats.numcro += (*scross)(*mom, *dad, child1, (GAGenome*)0);      c1 = 1;    }    else{      if(GARandomBit())	child1->copy(*mom);      else	child1->copy(*dad);    }    stats.nummut += (mut = child1->mutate(pMutation()));    if(mut > 0) c1 = 1;    stats.numeval += c1;    if(rs == PARENT)      child1 = pop->replace(child1, mom);    else if(rs == CUSTOM)      child1 = pop->replace(child1, &(rf(*child1, *pop)));    else      child1 = pop->replace(child1, rs);    stats.numrep += 1;  }  else{    c1 = c2 = 0;    if(GAFlipCoin(pCrossover())){      stats.numcro += (*scross)(*mom, *dad, child1, child2);      c1 = c2 = 1;    }    else{      child1->copy(*mom);      child2->copy(*dad);    }    stats.nummut += (mut = child1->mutate(pMutation()));    if(mut > 0) c1 = 1;    stats.nummut += (mut = child2->mutate(pMutation()));    if(mut > 0) c2 = 1;    stats.numeval += c1 + c2;    if(rs == PARENT){      child1 = pop->replace(child1, mom);      if(mom == dad)		// this is a possibility, if so do worst	child2 = pop->replace(child2, GAPopulation::WORST);      else	child2 = pop->replace(child2, dad);    }    else if(rs == CUSTOM){      child1 = pop->replace(child1, &(rf(*child1, *pop)));      child2 = pop->replace(child2, &(rf(*child2, *pop)));    }    else{      child1 = pop->replace(child1, rs);      child2 = pop->replace(child2, rs);    }    stats.numrep += 2;  }  pop->evaluate(gaTrue);        // allow pop-based evaluators to do their thing  stats.update(*pop);		// update the statistics for this generation}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -