private void RunAlgorithmGenetic(object sender, RoutedEventArgs e) { var a = int.Parse(A.Text); var b = int.Parse(B.Text); var d = decimal.Parse(D.Text, CultureInfo.InvariantCulture); var n = int.Parse(N.Text); var t = int.Parse(T.Text); var pk = decimal.Parse(Pk.Text, CultureInfo.InvariantCulture); var pm = decimal.Parse(Pm.Text, CultureInfo.InvariantCulture); var eliteSize = int.Parse(EliteSize.Text); GeneticAlgorithm = new GeneticAlgorithm(a, b, d, pk, pm, n, t, eliteSize); GeneticAlgorithm.Run(); GeneticAlgorithmRun = GeneticAlgorithmRun.MapFrom(GeneticAlgorithm); GeneticAlgorithmResult = GeneticAlgorithmResult.MapFrom(GeneticAlgorithm); GeneticAlgorithmSummary = GeneticAlgorithmSummary.MapFrom(GeneticAlgorithm); TabControl.Visibility = Visibility.Visible; GenerationSlider.Minimum = 1; GenerationSlider.Maximum = t; GenerationSlider.Value = 1; DisplayGenerationInRunDataGrid(1); DisplaySummaryInSummaryDataGrid(); GeneratePlot(); }
/// <summary> /// Executes a single Round of Genetic Algorithm optimization /// </summary> private void ExecuteGeneticAlgorithmRound() { //initialize range if (_ranges == null) { InitializeRangeArray(); } //Initialize Required parameters if (InitializeOptimizationParameters()) { int index; // Start Optimization if ((index = StartOptimizationProcess()) >= 0) { // Get Optimized parameters info Dictionary <int, double> optimizedParameters = ProvideOptimizedParameterInfo(index); // Create result to be displayed on UI var result = new GeneticAlgorithmResult(); foreach (KeyValuePair <int, double> keyValuePair in optimizedParameters) { OptimizationParameterDetail optimizationParameter; if (_optimizationParameters.TryGetValue(keyValuePair.Key, out optimizationParameter)) { // Initialize new value OptimizationParameterDetail optimizationDetail = new OptimizationParameterDetail(); // Set optimized value optimizationDetail.OptimizedValue = keyValuePair.Value; // Save general information optimizationDetail.Description = optimizationParameter.Description; // Add to result result.ParameterList.Add(optimizationDetail); } } // Update Fitness var risk = Math.Round(_populationArray[index].FitnessMax, 5); var tempParameterDetail = new OptimizationParameterDetail(); tempParameterDetail.OptimizedValue = risk; tempParameterDetail.Description = "Risk"; // Add to result result.ParameterList.Add(tempParameterDetail); // Publish event to UI EventSystem.Publish <GeneticAlgorithmResult>(result); ////Dispose(); } } }
/// <summary> /// Displays GA Optimization Result on UI /// </summary> /// <param name="optimizationResult">Contains optimized parameters information</param> private void DisplayResult(GeneticAlgorithmResult optimizationResult) { _currentDispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => { RoundsCompleted++; foreach (OptimizationParameterDetail optimizationParameterDetail in optimizationResult.ParameterList) { OptimizedParameters.Add(optimizationParameterDetail); } if (RoundsCompleted == Rounds) { Status = OptimizationStatus.Completed; } })); }
public static async Task Main(string[] args) { UnweightedDirectedGraph = await GraphService.GetUnweightedDirectedGraphAsync(); WeightedDirectedGraph = await GraphService.GetWeightedDirectedGraphAsync(); if (args != null && args.Contains("debug", OrdinalIgnoreCase)) { DoDebug(); } CreateDirectory($"{AppDomain.CurrentDomain.BaseDirectory}Outputs"); var settings = new JsonSerializerSettings { Formatting = Indented }; var serializer = Create(settings); string path; #region Weighted Sum Algorithm Write("Weighted Sum Algorithm? (Y/N) "); if (ReadLine() == "Y") { var allSimplePaths = WeightedDirectedGraph.AllSimplePaths( "HARROW & WEALDSTONE", "ELEPHANT & CASTLE", EdgeAdder, 25 ).ToList(); var weights = new Dictionary <ObjectiveType, double> { { ObjectiveType.Comfortability, 100 }, { ObjectiveType.Reliability, 50 } }; var weightedSumAlgorithmResults = new List <WeightedSumAlgorithmResult>(); for (var noOfPaths = 100; noOfPaths < allSimplePaths.Count; noOfPaths += 100) { var times = new List <double>(); for (var i = 0; i < 100; i++) { Stopwatch.Restart(); allSimplePaths .Take(noOfPaths) .WeightedSumShortestPath(weights, WeightedSumShortestPathObjectiveSelector); Stopwatch.Stop(); times.Add(Stopwatch.Elapsed.TotalMilliseconds); } var weightedSumAlgorithmResult = new WeightedSumAlgorithmResult( times.Average(), noOfPaths ); weightedSumAlgorithmResults.Add(weightedSumAlgorithmResult); } path = $@"{AppDomain.CurrentDomain.BaseDirectory}Outputs\WeightedSumAlgorithmResults.json"; using (var file = File.CreateText(path)) { serializer.Serialize(file, weightedSumAlgorithmResults); } } #endregion #region Dijkstra's Algorithm Write("Dijkstra's Algorithm? (Y/N) "); if (ReadLine() == "Y") { var dijkstraAlgorithm = new DijkstraShortestWeightedDirectedPathAlgorithm <string, Edge>( WeightedDirectedGraph, EdgeAdder, EdgeComparer ); var dijkstraAlgorithmResults = new List <DijkstraAlgorithmResult>(); foreach (var destination in WeightedDirectedGraph.Vertices.TakeLast(200)) { var times = new List <double>(); var pathDistances = new List <double>(); var pathTimes = new List <double>(); for (var i = 0; i < 10000; i++) { EdgeComparer.NoOfTotalComparisons = 0; EdgeComparer.NoOfInteractiveComparisons = 0; Stopwatch.Restart(); var weightedDirectedPath = dijkstraAlgorithm.Path("HARROW & WEALDSTONE", destination); Stopwatch.Stop(); times.Add(Stopwatch.Elapsed.TotalMilliseconds); pathDistances.Add(weightedDirectedPath.Weight.Distance); pathTimes.Add(weightedDirectedPath.Weight.Time.TotalMinutes); } var dijkstraAlgorithmResult = new DijkstraAlgorithmResult( times.Average(), EdgeComparer.NoOfInteractiveComparisons, EdgeComparer.NoOfTotalComparisons, pathDistances.Average(), pathTimes.Average() ); dijkstraAlgorithmResults.Add(dijkstraAlgorithmResult); } path = $@"{AppDomain.CurrentDomain.BaseDirectory}Outputs\DijkstraAlgorithmResults.json"; using (var file = File.CreateText(path)) { serializer.Serialize(file, dijkstraAlgorithmResults); } } #endregion #region Genetic Algorithm Write("Genetic Algorithm? (Y/N) "); if (ReadLine() == "Y") { var exactSolution = new DijkstraShortestWeightedDirectedPathAlgorithm <string, Edge>( WeightedDirectedGraph, EdgeAdder, EdgeComparer ).Path("HARROW & WEALDSTONE", "ELEPHANT & CASTLE").Weight; var geneticAlgorithmResults = new List <GeneticAlgorithmResult>(); for (var noOfGenerations = 50; noOfGenerations < 550; noOfGenerations += 50) { for (var mutationProbability = 0; mutationProbability < 110; mutationProbability += 10) { var accuracies = new List <double>(); var times = new List <double>(); for (var i = 0; i < 10; i++) { EdgeComparer.NoOfTotalComparisons = 0; EdgeComparer.NoOfInteractiveComparisons = 0; var geneticAlgorithm = new PathGeneticAlgorithm <string, Edge>( noOfGenerations, 50, 100, mutationProbability / 100d, WeightedDirectedGraph, "HARROW & WEALDSTONE", "ELEPHANT & CASTLE", EdgeAdder, EdgeComparer ); geneticAlgorithm.Evolve(); var approximateSolution = geneticAlgorithm.FittestChromosome.Weight; accuracies.Add( 1 - ( Abs((exactSolution.Distance - approximateSolution.Distance) / exactSolution.Distance) + Abs((exactSolution.Time - approximateSolution.Time) / exactSolution.Time) + Abs((exactSolution.Comfortability - approximateSolution.Comfortability) / exactSolution.Comfortability) + Abs((exactSolution.Reliability - approximateSolution.Reliability) / exactSolution.Reliability) ) ); times.Add(geneticAlgorithm.Time.TotalSeconds); } var geneticAlgorithmResult = new GeneticAlgorithmResult( times.Average(), noOfGenerations, mutationProbability / 100d, accuracies.Average() ); geneticAlgorithmResults.Add(geneticAlgorithmResult); } } path = $@"{AppDomain.CurrentDomain.BaseDirectory}Outputs\GeneticAlgorithmResults.json"; using (var file = File.CreateText(path)) { serializer.Serialize(file, geneticAlgorithmResults); } } #endregion }