// Blind Watchmaker program clone, by Adam Ward - 12/04/2001
// Original written by Richard Dawkins (circa 1985 approx)
// Original program featured in book of same name.

#include <iostream.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <conio.h>

#define num 2
#define blank   "AAAAAAAAAAAAAAAAAAAAAAAAAAAA"

string target = "METHINKS IT IS LIKE A WEASEL";

class offspring
{
 public:
        string dna;

        offspring() { dna = blank; }

        int getscore()
        {
         dnascore = 0;
         for(int i=0;i<28;i++) {if(dna[i]==target[i]) dnascore++;}
         return dnascore;
        }

 private:
        int dnascore;
};

int main()
{
 srandom(time(0));
 string alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ "; /*chars that are allowed*/
 string winner = blank;
 offspring pop[num];
 int i,j,cc,best,max,gen=0;

 clrscr();

 //randomly initialise the DNA...
 for(i=0;i<28;i++)
 winner[i] = (char)alpha[random()%27];
 //initialisation complete

 while(max < 28)
 {
  best=0;

  //breed and mutate from winner's dna...
  for(i=0;i<num;i++)
  pop[i].dna = winner;

  for(i=0;i<28;i++)
  {
   if(winner[i]!=target[i])
   {
    for(j=0;j<num;j++)
    pop[j].dna[i] = (char)alpha[random()%27];
   }
  }

  max=0;
  for(i=0;i<num;i++)
  {
   cc = pop[i].getscore();
   if(cc > max)
   {
    max = cc;
    best = i;
   }
  }

  winner = pop[best].dna;
  gen++;
  cout << winner << " - letters matched: " << max << " in gen: " << gen << "\n";

 }

 cout << "Target phrase matched in " << gen << " generations.";

 return 0;
}

