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; }
// 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)); }