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

📄 moea.c

📁 moealib
💻 C
字号:
#include "MOEA.h"#include <stdlib.h>#include <strstream.h>MOEA::MOEA() :   pop1_initSz(INVALID_VALUE), pop2_initSz(INVALID_VALUE),  pop1_maxSz(INVALID_VALUE), pop2_maxSz(INVALID_VALUE),  ppop1(NULL), ppop2(NULL),   indTemplate(NULL),  slctor(NULL), asiner(NULL), razor(NULL),   niche_radius(INVALID_VALUE),  maxGen(DEFAULT_MAX_GENERATIONS),   pcross(DEFAULT_PCROSS), pmut(DEFAULT_PMUT) {  paraList.add("help message", "--help", "-h", Help,0);  paraList.add("initial population 1 size", "pop1_initSize", "pop1InitSz", Int, &pop1_initSz);  paraList.add("initial populaiton 2 size", "pop2_initSize", "pop2InitSz", Int, &pop2_initSz);  paraList.add("maximum population 1 size", "pop1_maxSize", "pop1MaxSz", Int, &pop1_maxSz);  paraList.add("maximum population 2 size", "pop2_maxSize", "pop2MaxSz", Int, &pop2_maxSz);  paraList.add("initial and maximum population 1 size", "pop1Size", "pop1Sz", Int, &pop1_initSz);  paraList.add("initial and maximum population 1 size", "pop1Size", "pop1Sz", Int, &pop1_maxSz);  paraList.add("initial and maximum population 2 size", "pop2Size", "pop2Sz", Int, &pop2_initSz);  paraList.add("initial and maximum population 2 size", "pop2Size", "pop2Sz", Int, &pop2_maxSz);  paraList.add("maximum generations", "maxGenerations", "gens", Int, &maxGen);  paraList.add("current generation", NULL, NULL, Int, &curGen);  paraList.add("probability of crossover", "pCrossover", "pc", Float, &pcross);  paraList.add("probability of mutation", "pMutate", "pm", Float, &pmut);  paraList.add("minimize(0) or maximize(1)", "minMax", "mM", minMaxT, &mM);  paraList.add("dimensions of objective space", "objectiveDimensions", "objs", Int, &dimens);  paraList.add("random seed", "seed", "s", Long, &originalSeed);  paraList.add("niche radius", "nicheRadius", "nr", Double, &niche_radius);}MOEA::~MOEA() {  delete ppop1; delete ppop2;   delete slctor; delete asiner; delete razor;}void MOEA::initialize(const IND& ind) {  curGen = 0;   Seed = originalSeed;   indTemplate = ind.clone();} void MOEA::generate(POP& tmpPop) {  assert(!tmpPop.currentSize());  init_select();  const IND *mom, *dad;  IND *sis, *bro;  while((mom=select(), dad=select())) {    mom->crossover(pcross, *dad, sis, bro);    sis->mutate(pmut);    bro->mutate(pmut);    if( strcmp(className(), "PTSGA")==0 && sis->scoresValid())      delete sis;    else       tmpPop.append(sis);    if(strcmp(className(), "PTSGA")==0 && bro->scoresValid())      delete bro;    else       tmpPop.append(bro);  }}/*--------------- output member functions -----------------------------------------*/void MOEA :: parameters(ostream& os) const  {   os << ".....Algorithms " << className() << ".... current generation ";  os << currentGeneration() << ".........\n\n";  if(ptr2pop1())     os << "current population 1 size              " << population1().currentSize() << endl;  if(ptr2pop2())     os << "current populaiton 2 size              " << population2().currentSize() << endl;  os << paraList;  if(razor)    os << "reduction strategy                     " << razor->className() << endl;  if(asiner)    os << "fitness  strategy                      " << asiner->className() << endl;  if(slctor)        os << "selection strategy                     " << slctor->className() << endl;  if(!ppop1 || !population1().currentSize()) return;  IND::Distance dist_fp = population1()[0]->metric();   if(!dist_fp) return;  os << "distance metric                        ";  if(dist_fp == DefaultObjectiveDistance)             os << "Default Objective Metric";   else if(dist_fp==DefaultNormalizedObjectiveDistance)os << "Default Normalized Objective Metric";  else if(dist_fp==DefaultPhenotypicDistance)         os << "Default Phenotypic Metric";  else if(dist_fp==DefaultNormalizedPhenotypicDistance)os<<"Defalt Normalized Phenotypic Metric";   else if(dist_fp==DefaultGenotypicHammingDistance)     os<<"Default Genotypic Hamming Metric";   else                                                 os<<"user defined metric";  os << endl;}char* MOEA::parametersString() const { // out put parameters as a string.  ostrstream oss;  oss << className() << '_';  if(razor)    oss << "_" << razor->classShortName();  if(asiner)    oss << "_" << asiner->classShortName();  if(slctor)        oss << "_" << slctor->classShortName();  IND::Distance dist_fp = 0;  if(ppop1 && population1().currentSize())    dist_fp = population1()[0]->metric();   if(!dist_fp && ppop2 && population2().currentSize())    dist_fp = population2()[0]->metric();   if(dist_fp) {    if(dist_fp == DefaultObjectiveDistance)              oss << "_oM";     else if(dist_fp==DefaultNormalizedObjectiveDistance) oss << "_noM";    else if(dist_fp==DefaultPhenotypicDistance)          oss << "_pM";    else if(dist_fp==DefaultNormalizedPhenotypicDistance)oss << "_npM";     else if(dist_fp==DefaultGenotypicHammingDistance)     oss << "_ghM";     else /* user defined metric */                       oss << "_uM";     }  char *tmp = paraList.str();  oss << tmp; delete tmp;  return oss.str();}void MOEA :: printFitnesses(ostream& os) const {   MOEA* This = (MOEA*) this;  This->assignFitnesses();  os << "\n++++ Fitnesses infomation on generation " << curGen << "++++++++++++\n";  if(ptr2pop1()) {    os << "in population 1........\n";    population1().printFitnesses(os);   }   if(ptr2pop2()) {    os << "\nin population 2........\n";    population2().printFitnesses(os);   }  os << endl;}void MOEA :: printScores(ostream& os) const {   os << "\n++++++++ Scores infomation on generation " << curGen << "++++++++++++\n";  if(ptr2pop1()) {    os << "..........in population 1........\n";    population1().printScores(os);   }  if(ptr2pop2()) {    os << "\n..........in population 2........\n";    population2().printScores(os);   }  os << endl;}void MOEA :: printResult(ostream& os) const {   if(ptr2pop1())     population1().printScores(os);   if(ptr2pop2())    population2().printScores(os);   os << endl;}void MOEA :: printSolutions(ostream& os) const {   os << "\n++++ Solutions infomation on generation " << curGen << "++++++++++++\n";  if(ptr2pop1()) {    os << "in population 1........\n";    population1().printSolutions(os);   }  if(ptr2pop2()) {    os << "in population 2........\n";    population2().printSolutions(os);   }  os << endl;}void MOEA :: printGenomes(ostream& os) const {   os << "\n++++ Genomes infomation on generation " << curGen << "++++++++++++\n";  if(ptr2pop1()) {    os << "in population 1........\n";    population1().printGenomes(os);   }  if(ptr2pop2()) {    os << "in population 2........\n";    population2().printGenomes(os);   }  os << endl;}void MOEA :: printAll(ostream& os) const {   MOEA* This = (MOEA*) this;  This->assignFitnesses();  os << "\n++++ All infomation on generation " << curGen << "++++++++++++\n";  if(ptr2pop1()) {    os << "in population 1........\n";    population1().printAll(os);   }  if(ptr2pop2()) {    os << "in population 2........\n";    population2().printAll(os);   }  os << endl;}

⌨️ 快捷键说明

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