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

📄 mastermind.h

📁 这是linux下的进化计算的源代码。 === === === === === === === === === === === ===== check latest news at http:
💻 H
字号:
//-----------------------------------------------------------------------------// mastermind.h//-----------------------------------------------------------------------------#ifndef mastermind_h#define mastermind_h//-----------------------------------------------------------------------------#include <stdlib.h>               // exit EXIT_FAILURE#include <eoVector.h>             // eoVectorLength#include <eoOp.h>                 // eoMonOp eoQuadraticOp#include <eoInit.h>               // eoInit#include "utils/rnd_generators.h" // uniform_generator//-----------------------------------------------------------------------------// phenotype//-----------------------------------------------------------------------------typedef float phenotype;//-----------------------------------------------------------------------------// genotype//-----------------------------------------------------------------------------typedef std::vector<int> genotype;//-----------------------------------------------------------------------------// Chrom//-----------------------------------------------------------------------------typedef eoVector<phenotype, int> Chrom;//-----------------------------------------------------------------------------// eoChromEvaluator//-----------------------------------------------------------------------------// const unsigned points_per_black = 3, points_per_white = 1;Chrom solution;phenotype eoChromEvaluator(const Chrom& chrom){  Chrom tmp = solution;  unsigned black = 0, white = 0;  // look for blacks  for (unsigned i = 0; i < chrom.size(); ++i)    if (chrom[i] == tmp[i])      {	++black;	tmp[i] = -1;      }  // look for whites  for (unsigned i = 0; i < chrom.size(); ++i)    for (unsigned j = 0; j < tmp.size(); ++j)      if (chrom[i] == tmp[j])	{	  ++white;	  tmp[j] = -1;	  break;	}  //  return black * points_per_black + white * points_per_white;  return black * chrom.size() + white;};const unsigned default_length = 8;const unsigned default_colors = 8;const std::string default_solution = "01234567";unsigned num_colors;void init_eoChromEvaluator(const unsigned& c, const unsigned& l, std::string s){  num_colors = c;  // check consistency between parameters  if (s != default_solution)    {      // check length      if (l != default_length && s.size() != l)	{	  std::cerr << "solution length != length" << std::endl;	  exit(EXIT_FAILURE);	}      // check number of colors      if ((c != default_colors) && (c < unsigned(*max_element(s.begin(), s.end()) - '0')))	{	  std::cerr << "too high color number found!" << std::endl;	  exit(EXIT_FAILURE);	}    }  else    if (l != default_length || c != default_colors )      // generate a random solution      if(num_colors <= 10)	{	  uniform_generator<char> color('0', static_cast<char>('0' + c));	  s.resize(l);	  generate(s.begin(), s.end(), color);	}  // put the solution parameter on the solution chromosome  if (num_colors <= 10)    {      solution.resize(s.size());      for (unsigned i = 0; i < solution.size(); ++i)	solution[i] = s[i] - '0';    }  else    {      solution.resize(l);      uniform_generator<int> color(0, num_colors);      generate(solution.begin(), solution.end(), color);    }  solution.fitness(eoChromEvaluator(solution));}//-----------------------------------------------------------------------------// eoChromInit//-----------------------------------------------------------------------------class eoInitChrom: public eoInit<Chrom>{public:  void operator()(Chrom& chrom)  {    uniform_generator<int> color(0, num_colors);    chrom.resize(solution.size());    generate(chrom.begin(), chrom.end(), color);    chrom.invalidate();  }};//-----------------------------------------------------------------------------// eoChromMutation//-----------------------------------------------------------------------------class eoChromMutation: public eoMonOp<Chrom>{  // many operators in one :(  bool operator()(Chrom& chrom)  {    uniform_generator<unsigned> what(0, 2);    uniform_generator<unsigned> position(0, chrom.size());    switch(what())      {      case 0:	{	  // mutation	  uniform_generator<int> color(0, num_colors);	  chrom[position()] = color();	  break;	}      case 1:	{	  // transposition	  std::swap(chrom[position()], chrom[position()]);	  break;	}      default:	{	  std::cerr << "unknown operator!" << std::endl;	  exit(EXIT_FAILURE);	  break;	}      }    return true;  }};//-----------------------------------------------------------------------------// eoChromXover//-----------------------------------------------------------------------------class eoChromXover: public eoQuadOp<Chrom>{public:  bool operator()(Chrom& chrom1, Chrom& chrom2)  {    uniform_generator<unsigned> position(0, chrom1.size());    swap_ranges(chrom1.begin(), chrom1.begin() + position(), chrom2.begin());    return true;  }};//-----------------------------------------------------------------------------#endif // mastermind_h// Local Variables:// mode:C++// End:

⌨️ 快捷键说明

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