private ICanvasJSDataPoint MapToCanvasJsDataPoint(IPopulationResult populationResult, ChromosomeFactor factor) { return(new CanvasJSDataPoint { X = populationResult.Iteration, Y = populationResult.Population.Members.Sum(x => x.Factors.Where(y => y.Key == factor).Sum(z => z.Value)), }); }
public IEvolutionIterationResult RunIteration(IPopulationResult populationResult, IMatrix matrix, int maxDiffBetweenNode) { var halfOfElementsCount = (int)Math.Floor(populationResult.Population.Members.Count() / 2.0d); var bestChromosomesByEdgeCount = GetBestChromosomes(ChromosomePart.First, populationResult.Population, halfOfElementsCount); var bestChromosomesByConnectedEdge = GetBestChromosomes(ChromosomePart.Second, populationResult.Population, halfOfElementsCount); if (bestChromosomesByEdgeCount.Count() != halfOfElementsCount && bestChromosomesByConnectedEdge.Count() != halfOfElementsCount) { throw new InvalidOperationException("Invalid best chromosome member count after turnament part"); } var mutatedChromosomes = MutateChromosomeByNodeFlipping(bestChromosomesByEdgeCount, bestChromosomesByConnectedEdge, matrix, maxDiffBetweenNode); var members = mutatedChromosomes.OrderBy(x => Guid.NewGuid()).ToArray(); return(new EvolutionIterationResult(new Population(members), populationResult.Iteration + 1)); }
public IDictionary <ChromosomeFactor, List <ICanvasJSDataPoint> > MapPopulationToDataPoints(IPopulationResult populationResult) { return(new Dictionary <ChromosomeFactor, List <ICanvasJSDataPoint> >() { [ChromosomeFactor.EdgeCount] = new List <ICanvasJSDataPoint> { MapToCanvasJsDataPoint(populationResult, ChromosomeFactor.EdgeCount) }, [ChromosomeFactor.ConnectedEdgeWeigthSum] = new List <ICanvasJSDataPoint> { MapToCanvasJsDataPoint(populationResult, ChromosomeFactor.ConnectedEdgeWeigthSum) }, }); }
public IEvolutionIterationResult[] RunIterations(int iterations, int maxDiffBetweenNode, IPopulationResult population, IMatrix matrix) { var result = new IEvolutionIterationResult[iterations]; result[0] = RunIteration(population, matrix, maxDiffBetweenNode); for (var i = 1; i < iterations; i++) { result[i] = RunIteration(result[i - 1], matrix, maxDiffBetweenNode); } return(result); }