private IEnumerator RunSingleGeneration(int populationSize, int generation, GenerationComplete callback) { FileLogger.Log("==== Generation {0}, N={1}", generation, populationSize); Creature[] population = CreatePopulation(populationSize, generation); // reset player player.transform.position = resetPlayerPosition; player.transform.rotation = resetPlayerQuaternion; // simulation loop float startTime = Time.time; do { yield return(WaitForNextUpdate()); } while (Time.time - startTime < TerminationTime && population.Select(t => t) .Any(t => t.state != Creature.State.Dead)); float duration = Time.time - startTime; FileLogger.Log(" completed in {1}s", generation, duration); // evaluate fitness of population float[] fitnesses = population .Select(t => FitnessEvaluator.ComputeForCreature(t)) .ToArray(); // keep generation PreviousGenerationDnasByFitness = new SortedList <float, DNA>(populationSize, Comparer); for (int i = 0; i < populationSize; i++) { PreviousGenerationDnasByFitness.Add(fitnesses[i], population[i].DNA); // also add to Hall of Fame HallOfFame.Add(fitnesses[i], population[i].DNA); } // add to Hall of Fame HallOfFame.KeepFirstN(HallOfFameCount); FileLogger.Log(" population fitness evaluation;"); PreviousGenerationDnasByFitness.ForEach((kvp, i) => { FileLogger.Log(" {0}. [fitness={1}, dna={2}]", i + 1, kvp.Key, kvp.Value); } ); callback(generation, duration, PreviousGenerationDnasByFitness, HallOfFame); FileLogger.Log("==== Generation {0} complete", generation); // end all creatures population.ForEach(t => t.EndCreature()); }
private IEnumerator RunMultipleGenerations(int populationSize, GenerationComplete callback, int numGenerations) { for (int gen = 1; gen <= numGenerations; ++gen) { yield return(StartCoroutine(RunSingleGeneration(populationSize, gen, callback))); FileLogger.Log("\n"); } }
public void Initialize(LevelConfig levelConfig, LevelDepthConfig levelDepthConfig, GenerationComplete callback) { completeCallback = callback; depthConfig = levelDepthConfig; config = levelConfig; mapPopulatorPrefab = Resources.Load <MapPopulator>("MapPopulator"); world = new Rect(0, 0, config.Width, config.Height); rooms = new List <MazeRoom>(); Debug.Log("Creating world with size: " + config.Width + ", " + config.Height); }
protected virtual void OnGenerationComplete(object sender, ProjectItemGenerationCompleteEventArgs args) { GenerationComplete?.Invoke(sender, args); }
public void Run(int populationSize, GenerationComplete callback, int numRuns) { resetPlayerPosition = player.transform.position; resetPlayerQuaternion = player.transform.rotation; StartCoroutine(RunMultipleGenerations(populationSize, callback, numRuns)); }
/// <summary> /// Invokes the <see cref="GenerationComplete"/> event /// </summary> /// <param name="ge"><see cref="GaEventArgs{TIndividual, TGene}"/> for the completed generation</param> protected virtual void OnGenerationComplete(GaEventArgs <TIndividual, TGene> ge) { GenerationComplete?.Invoke(ge); }