public async Task <GeneticEvolutionStates> EvolveUntil( IPopulation population, Func <GeneticEvolutionStates, bool> termination, CancellationToken token = default) { var statesHolder = new StatesHolder(); await Evolve(population, termination, token, statesHolder); return(statesHolder.States); }
public async Task <(GeneticEvolutionStates, bool)> TryEvolveUntil( IPopulation population, Func <GeneticEvolutionStates, bool> termination, CancellationToken token) { var statesHolder = new StatesHolder(); try { await Evolve(population, termination, token, statesHolder); } catch (OperationCanceledException) { return(statesHolder.States, false); } return(statesHolder.States, true); }
private async Task Evolve( IPopulation population, Func <GeneticEvolutionStates, bool> termination, CancellationToken token, StatesHolder statesHolder) { try { while (!termination.Invoke(statesHolder.States)) { var startTime = DateTime.Now; var offspring = await _strategy.Operate(population.Chromosomes, population.Capacity, token); statesHolder.EvolutionTime += DateTime.Now - startTime; population.Chromosomes = offspring; statesHolder.EvolutionCount++; } } finally { _statesHolder.Extend(statesHolder.States); } }