int main(void){

	struct parameters *params = NULL;
	struct chromosome *chromo = NULL;

	int numInputs = 1;
	int numNodes = 20;
	int numOutputs = 1;
	int nodeArity = 5;

	int numGens = 25000;
	double targetFitness = 0.5;
	int updateFrequency = 500;

	double weightRange = 5;

	params = initialiseParameters(numInputs, numNodes, numOutputs, nodeArity);

	setTargetFitness(params, targetFitness);

	setUpdateFrequency(params, updateFrequency);

	setConnectionWeightRange(params, weightRange);

	setCustomFitnessFunction(params, sinWave, "sinWave");

	addNodeFunction(params, "tanh,softsign");

	chromo = runCGP(params, NULL, numGens);

	printChromosome(chromo, 1);

	freeChromosome(chromo);
	freeParameters(params);

	return 0;
}
Exemple #2
0
// Runs a full round of experiments
void performExperiments(struct parameters* params,
                        unsigned int nGenerations,
                        unsigned int nRepeats,
                        const std::string& nodeFunctions) {
  setCustomFitnessFunction(params, fitness, "PocMan Level 1");

  struct chromosome* bestChromosome = nullptr;
  double bestFitness = DBL_MAX;
  std::vector<double> fitnesses;
  std::vector<double> durations;
  fitnesses.reserve(nRepeats);
  durations.reserve(nRepeats);

  for (unsigned int i = 0; i < nRepeats; i++) {
    // Run CGP, record the results
    auto start = std::chrono::steady_clock::now();
    struct chromosome* chromo = runCGP(params, nullptr, nGenerations);
    auto end = std::chrono::steady_clock::now();

    double fitness = getChromosomeFitness(chromo);
    fitnesses.push_back(fitness);

    std::chrono::duration<double> diff = end - start;
    double duration = diff.count();
    durations.push_back(duration);

    // Should we keep this chromosome?
    if (fitness < bestFitness) {
      if (bestChromosome != nullptr)
        freeChromosome(bestChromosome);
      bestChromosome = chromo;
      bestFitness = fitness;
    } else {
      freeChromosome(chromo);
    }
  }

  // Stats!
  double meanFitness, stdevFitness, minFitness, maxFitness;
  std::tie(meanFitness, stdevFitness, minFitness, maxFitness) = calculateStats(fitnesses);

  double meanDuration, stdevDuration, minDuration, maxDuration;
  std::tie(meanDuration, stdevDuration, minDuration, maxDuration) = calculateStats(durations);

  // Logging!
  log("### PARAMETERS\n");
  log(parametersToString(params));
  log("generations: " + std::to_string(nGenerations) + "\n");
  log("\n--------------------\n\n");
  log("### FITNESS VALUES\n");
  for (unsigned int i = 0; i < nRepeats; i++)
    log("(" + std::to_string(i + 1) + "):\t" + std::to_string(fitnesses[i]) + "\n");
  log("\n--------------------\n\n");
  log("### STATISTICS (FITNESS)\n");
  log("mean : " + std::to_string(meanFitness) + "\n");
  log("std  : " + std::to_string(stdevFitness) + "\n");
  log("rng  : " + std::to_string(minFitness) +":" + std::to_string(maxFitness) + "\n");
  log("\n--------------------\n\n");
  log("### DURATION VALUES\n");
  for (unsigned int i = 0; i < nRepeats; i++)
    log("(" + std::to_string(i + 1) + "):\t" + std::to_string(durations[i]) + "\n");
  log("\n--------------------\n\n");
  log("### STATISTICS (DURATIONS)\n");
  log("mean : " + std::to_string(meanDuration) + "\n");
  log("std  : " + std::to_string(stdevDuration) + "\n");
  log("rng  : " + std::to_string(minDuration) + ":" + std::to_string(maxDuration) + "\n");
  log("\n--------------------\n\n");
  log("### BEST CHROMOSOME\n");
  log(chromosomeToString(bestChromosome, 0));
  log("\n--------------------\n\n");
  log("### GAMEPLAY TRACE\n");
  log(controller.generateGameTrace(bestChromosome));
}