
#include <iostream>
#include <stdlib.h>

#define LEN 150

double eval(int *vec);


int flip(float p){
  return (random()%1000 < p * 1000 ? 1 : 0);
}


int init(int *vec){
  for(int i = 0; i < LEN; i++) {
    vec[i] = flip(0.5);
  }
  return 0;
}

void copyVec(int *from, int *to){
  for(int i = 0; i < LEN; i++){
    to[i] = from[i];
  }
  return;
}


void modify(int *oldVec, int *newVec, int index){
  copyVec(oldVec, newVec);
  newVec[index] = 1 - newVec[index];
  return;
}

void printVec(int *vec, int n){
  for(int i = 0; i < n; i++){
    std::cout << vec[i] ;
  }
  std::cout << std::endl;
  return;
}


int main(int argc, char *argv[]){


  int oldVec[LEN];
  int newVec[LEN];


  long int nevals = (argc == 2 ? atoi(argv[1]) : 10000);

  double newFitness = -1;
  srandom(time(NULL));
  //init randomly
  init(oldVec);
  double oldFitness = eval(oldVec);

  for(long int i = 0; i < nevals; i++) {
    int index = random()%LEN;
    modify(oldVec, newVec, index);
    newFitness = eval(newVec);
    if (newFitness >= oldFitness) {
      copyVec(newVec, oldVec);
      oldFitness = newFitness;
    }
  }
  //std::cout << "Best solution: ";
  //printVec(oldVec, 150);
  std::cout << "Highest fitness: " << oldFitness << std::endl;

  return 0;
}
