private async void RunOptimizer([NotNull] object sender, [NotNull] RoutedEventArgs args) { await Task.Run(() => { var parameters = new GeneticAlgorithmParameters { CrossoverRate = 0.85, ElitismRate = 0.1, Generations = 300, MutationRate = 0.7, PopulationSize = 50 }; var optimizer = new GeneticCompoundFDPOptimizer(parameters); optimizer.GenerationExtincts += OnGenerationExtincts; optimizer.Run(); optimizer.GenerationExtincts -= OnGenerationExtincts; PrintChromosomes(optimizer); void OnGenerationExtincts(int generation) { Dispatcher.Invoke(() => { FeedbackLabel.Text = $"Generation {generation}/{parameters.Generations}"; GenerationResult.Text = PrintChromosomes(optimizer); }); } }); }
/// <summary> /// Request <seealso cref="OptimizationManagerGeneticAlgorithm"/> to start the Optimization Process /// </summary> private void StartGeneticOptimization() { // Reset Value RoundsCompleted = 0; // Array of object to be used as parameters for given strategy var parameterValues = GetParameterValues(SelectedStrategy.ParameterDetails).ToArray(); var optimizationParametersDetail = new SortedDictionary <int, OptimizationParameterDetail>(); foreach (var optimizationParameterDetail in OptimizationParameters) { optimizationParametersDetail.Add(optimizationParameterDetail.Index, optimizationParameterDetail); } var strategyDetails = new GeneticAlgorithmParameters(SelectedStrategy.StrategyType, parameterValues, optimizationParametersDetail, _iterations, _populationSize, _rounds); // Change Status Status = OptimizationStatus.Working; // Clear existing data OptimizedParameters.Clear(); // Raise Event to notify listeners to start Optimization Process Task.Factory.StartNew(() => { EventSystem.Publish <GeneticAlgorithmParameters>(strategyDetails); }); }
public void ButtonStartOnClick() { if (!IsFormValid()) { ValidationMessage.enabled = true; SetTimestampToNow(); return; } var geneticAlgorithmParameters = new GeneticAlgorithmParameters() { PopulationCount = 2 * int.Parse(PopulationPairCount.text), MaxGenerationCount = int.Parse(MaxGenerationCount.text), NeuralNetworkWeightInitializationDistribution = new Normal(0f, double.Parse(WeightInitStdDev.text)), MinSensorCount = int.Parse(MinSensorCount.text), MaxSensorCount = int.Parse(MaxSensorCount.text), MinHiddenLayerNeuronCount = int.Parse(MinHiddenLayerNeuronCount.text), MaxHiddenLayerNeuronCount = int.Parse(MaxHiddenLayerNeuronCount.text), EvolveNetworkTopology = EvolveNetworkTopology.isOn, NeuralNetworkHiddenLayerActivationFunction = GetHiddenLayerActivationFunction(), NeuralNetworkOutputLayerActivationFunction = x => (float)Math.Tanh(x), SelectionStrategy = GetSelectionStrategy(), CrossoverStrategy = GetCrossoverStrategy() }; geneticAlgorithmParameters.MutationStrategy = GetMutationStrategy(geneticAlgorithmParameters); IFitnessAccumulatorFactory fitnessAccumulatorFactory = GetFitnessAccumulatorFactory(); Scenes.Data.Add(DataTags.GeneticAlgorithmParameters, geneticAlgorithmParameters); Scenes.Data.Add(DataTags.FitnessAccumulatorFactory, fitnessAccumulatorFactory); Scenes.Load(SceneId.MainScene); }
/// <summary> /// Handles incoming strategy optimization requests /// </summary> /// <param name="strategyInfo">Information to optimized specified strategy</param> private void OptimizeStrategy(GeneticAlgorithmParameters strategyInfo) { // Save constructor arguments _ctorArguments = strategyInfo.CtorArgs; // Save user strategy type _strategyType = strategyInfo.StrategyType; // Save optimization parameters info _optimizationParameters = strategyInfo.OptimzationParameters; //save iterations _iterations = strategyInfo.Iterations; //save population size _populationSize = strategyInfo.PopulationSize; int roundCount = 0; // Execute GA for the specified No. of times while (++roundCount <= strategyInfo.Rounds) { // Executes a single Round of Genetic Algorithm optimization ExecuteGeneticAlgorithmRound(); } }
public GeneticService(GeneticAlgorithmParameters parameters, Network network, PathFinder paths) { _parameters = parameters; _network = network; _pathFinder = paths; _isNetworkFromFile = false; _outputWriter = new OutputWriter(); }
public GeneticService(GeneticAlgorithmParameters parameters, Network network, PathFinder paths, string fileName) { _parameters = parameters; _network = network; _pathFinder = paths; _currentFileName = fileName; _isNetworkFromFile = true; _outputWriter = new OutputWriter(); }
static void Main(string[] args) { var parser = new InputFileParser(); // get input network from user Console.WriteLine("Please specify network topology which you want to solve."); Console.Write("How many nodes are in the network? "); var nodesCountInput = Console.ReadLine(); if (nodesCountInput is null) { Console.WriteLine("Invalid input."); return; } var nodesCount = int.Parse(nodesCountInput); var nodeConnections = new List <string>(nodesCount); for (var i = 1; i <= nodesCount; i++) { Console.WriteLine($"Enter nodes reachable from node {i} separated by comma: "); var currentNodeConnectionsInput = Console.ReadLine(); nodeConnections.Add($"{i}:{currentNodeConnectionsInput}"); } var inputNetwork = parser.ReadNetworkFromInput(nodeConnections); // find all node pairs PathFinder pathFinder = new PathFinder(); for (int i = 1; i < inputNetwork.Nodes.Count; i++) { for (int j = i + 1; j < inputNetwork.Nodes.Count + 1; j++) { pathFinder.FindAllPaths(i, j, inputNetwork); } } // all paths generated. Finding perfect combination. GeneticAlgorithmParameters parameters = new GeneticAlgorithmParameters { InitialPopulationSize = 100, CrossoverProbability = (float)0.2, MutationProbability = (float)0.1, RandomSeed = 4253, LimitValue = 30, StoppingCriteria = StoppingCriteria.NoImprovement }; new GeneticService(parameters, inputNetwork, pathFinder).Solve(); }
static void Main(string[] args) { InputFileParser parser = new InputFileParser(); Console.WriteLine("Choose network to optimize:"); Console.WriteLine("1: Network_1.txt"); Console.WriteLine("2: Network_2.txt"); string choice = Console.ReadLine(); Network inputNetwork = new Network(); if (choice.Equals("1") || choice.Equals("2")) { inputNetwork = parser.ReadNetwork("Network_" + choice + ".txt"); } else { return; } //Find all node pairs AllPathFinder pathFinder = new AllPathFinder(); for (int i = 1; i < inputNetwork.Nodes.Count; i++) { for (int j = i + 1; j < inputNetwork.Nodes.Count + 1; j++) { pathFinder.FindAllPaths(i, j, inputNetwork); } } // all paths generated. Finding perfect combination. GeneticAlgorithmParameters parameters = new GeneticAlgorithmParameters(); parameters.InitialPopulationSize = 100; parameters.CrossoverProbability = (float)0.2; parameters.MutationProbability = (float)0.1; parameters.RandomSeed = 4253; parameters.LimitValue = 30; parameters.StoppingCriteria = StoppingCriteria.NoImprovement; string fileName = "Network_" + choice; GeneticService geneticService = new GeneticService(parameters, inputNetwork, pathFinder, fileName); geneticService.Solve(); }
public IEnumerable <ValidationResult> Validate(ValidationContext validationContext) { // Check the selected algorithm. if (Algorithm == AnalysisAlgorithm.Greedy.ToString()) { // Check if the parameters don't match the algorithm. if (GreedyAlgorithmParameters == null) { // Return an error. yield return(new ValidationResult("The parameters do not match the chosen algorithm.", new List <string> { string.Empty })); } // Get the validation results for the parameters. var validationResults = GreedyAlgorithmParameters.Validate(validationContext); // Go over each validation error. foreach (var validationResult in validationResults) { // Return an error. yield return(new ValidationResult(validationResult.ErrorMessage, validationResult.MemberNames.Select(item => $"Input.{nameof(GreedyAlgorithmParameters)}.{item}"))); } } else if (Algorithm == AnalysisAlgorithm.Genetic.ToString()) { // Check if the parameters don't match the algorithm. if (GeneticAlgorithmParameters == null) { // Return an error. yield return(new ValidationResult("The parameters do not match the chosen algorithm.", new List <string> { string.Empty })); } // Get the validation results for the parameters. var validationResults = GeneticAlgorithmParameters.Validate(validationContext); // Go over each validation error. foreach (var validationResult in validationResults) { // Return an error. yield return(new ValidationResult(validationResult.ErrorMessage, validationResult.MemberNames.Select(item => $"Input.{nameof(GeneticAlgorithmParameters)}.{item}"))); } } }
private IMutationStrategy GetMutationStrategy(GeneticAlgorithmParameters geneticAlgorithmParameters) { switch (MutationStrategy.value) { case 0: double mutationRangeD2 = double.Parse(MutationRange.text) / 2; var parameters = new StandardMutationStrategyParameters() { MinSensorCount = geneticAlgorithmParameters.MinSensorCount, MaxSensorCount = geneticAlgorithmParameters.MaxSensorCount, MinHiddenLayerNeuronCount = geneticAlgorithmParameters.MinHiddenLayerNeuronCount, MaxHiddenLayerNeuronCount = geneticAlgorithmParameters.MaxHiddenLayerNeuronCount, EvolveNetworkTopology = EvolveNetworkTopology.isOn, NeuralNetworkWeightInitializationDistribution = geneticAlgorithmParameters.NeuralNetworkWeightInitializationDistribution, MutationRate = float.Parse(MutationRate.text), NeuralNetworkWeightMutationDistribution = new ContinuousUniform(-mutationRangeD2, mutationRangeD2) }; return(new StandardMutationStrategy(parameters)); default: throw new Exception("Invalid dropdown value."); } }
private static bool RunGeneticAlgorithm <T>(AbstractGeneticAlgorithm <T> algo, bool verbose = true, GeneticAlgorithmParameters param = null) where T : IChromosome { bool interrupted = false; if (verbose) { param = GetParamGA(out interrupted); if (interrupted) { return(false); } //param = new RecuitSimuleParameters(qap.N); Console.WriteLine("Tout les paramètres sont entrées, commencer l'exécution ? ( o/n, y/n )"); Console.WriteLine(param.ToString()); string str = ""; if (!GetCorrectString(out str, (s) => IsValidation(s))) { return(false); } if (!IsYes(str)) { return(false); } } //Lancer l'exécution algo.Verbose = true; algo.WithLogs = true; bestFitness = algo.Run(param).Fitness; Console.WriteLine("Paramètres :"); Console.WriteLine(param.ToString()); Console.WriteLine("Résultats :"); Console.WriteLine(algo.Logs.FinalLog.ToString()); paramString = param.ToString(); resultString = algo.Logs.FinalLog.ToString(); //Save Results SaveResults(); Console.WriteLine("Résultats sauvegardées dans " + GetResultPath() + "!"); //Save Logs algo.Logs.SaveLogsTo(GetCSVPath()); Console.WriteLine("Logs sauvegardées dans " + GetCSVPath() + "!\n"); if (verbose) { Console.WriteLine("\nAppuyez sur une touche pour revenir au menu."); Console.ReadKey(); Console.WriteLine(); } return(true); }
static void Main() { seed = new Random().Next(0, 1000); //random default seed RandomSingleton.Instance.Seed = seed; string[] line; qap = new QuadraticAssignment(GetInstancePath(filename)); bestKnownSolution = new QuadraticAssignmentSolution(GetSolutionPath(filename), true); List <string> allNames = new List <string>(); bool interrupted = false; string allText; while (state != State.Quit) { Console.WriteLine("------------"); Console.WriteLine(WelcomeMessage()); Console.WriteLine(GetInstanceInfo()); Console.WriteLine("------------"); line = GetLine(); RandomSingleton.Instance.ResetCurrentAlgoRandom(); switch (line[0].ToLower()) { case "q": case "quit": state = State.Quit; break; case "s": case "seed": Console.WriteLine("Veuillez entrer un nouveau seed > 0:"); int newSeed = -1; if (!GetCorrectInt(out newSeed, val => val > 0)) { break; } seed = newSeed; RandomSingleton.Instance.Seed = seed; Console.WriteLine("Le nouveau seed est : " + seed); break; case "t": case "tai": bool found = false; while (!found) { Console.WriteLine("Tapez le nom de l'instance de taillard à charger (sans son .dat):"); line = GetLine(); //early exit or quit if (TryExitOrQuit(line[0])) { break; } found = FindTaillardInstance(line[0]); if (!found) { Console.WriteLine("Fichier non trouvé ! Réessayer ou quitter (x or exit):"); } else { //Update QAP filename = line[0]; qap = new QuadraticAssignment(GetInstancePath(filename)); bestKnownSolution = new QuadraticAssignmentSolution(GetSolutionPath(filename), true); } } break; case "r": case "rec": case "recuit": RunRecuit(); break; case "tab": case "tabou": RunTabou(); break; case "ga": case "genetic": algo = Algo.GA; GeneticAlgorithmQAP ga = new GeneticAlgorithmQAP(qap); Console.WriteLine("Vous avez sélectionné l'Algorithme Génétique !"); RunGeneticAlgorithm(ga); break; case "recga": case "recuitga": case "garecuit": case "garec": algo = Algo.RecuitGA; RecuitSimule recuit = new RecuitSimule(qap); recuit.Verbose = false; GeneticAlgorithmRecuit garec = new GeneticAlgorithmRecuit(recuit); Console.WriteLine("Vous avez sélectionné l'Algorithme Génétique pour RECUIT SIMULE !"); RunGeneticAlgorithm(garec); break; case "alltab": case "allt": allNames = GetAllInstances(); interrupted = false; TabouParameters paramTabou = GetParamTabou(out interrupted); allText = paramTabou.ToString(); if (interrupted) { break; } foreach (string instanceName in allNames) { ChangeInstance(instanceName); paramTabou.InitialSol = new QuadraticAssignmentSolution(qap.N); RunTabou(false, paramTabou); allText += "\n\n" + instanceName + ":\n"; allText += "Resultats:\n" + resultString + ComparisonWithBest(); allText += "\n----"; } allText = allText.Replace("\r\n", "\n").Replace("\r", "\n").Replace("\n", "\r\n"); string fullNameAllTabou = Path.Combine(resultPath, "all_" + algo.GetString() + "_s" + seed + ".txt"); System.IO.File.WriteAllText(fullNameAllTabou, allText); break; case "allrec": case "allr": allNames = GetAllInstances(); interrupted = false; RecuitSimuleParameters paramRec = GetParamRecuit(out interrupted); allText = paramRec.ToString(); if (interrupted) { break; } foreach (string instanceName in allNames) { ChangeInstance(instanceName); paramRec.InitialSol = new QuadraticAssignmentSolution(qap.N); RunRecuit(false, paramRec); allText += "\n\n" + instanceName + ":\n"; allText += "Resultats:\n" + resultString + ComparisonWithBest(); allText += "\n----"; } allText = allText.Replace("\r\n", "\n").Replace("\r", "\n").Replace("\n", "\r\n"); string fullNameAllRec = Path.Combine(resultPath, "all_" + algo.GetString() + "_s" + seed + ".txt"); System.IO.File.WriteAllText(fullNameAllRec, allText); break; case "allga": case "allg": allNames = GetAllInstances(); interrupted = false; algo = Algo.GA; GeneticAlgorithmParameters paramGA = GetParamGA(out interrupted); allText = paramGA.ToString(); if (interrupted) { break; } foreach (string instanceName in allNames) { ChangeInstance(instanceName); GeneticAlgorithmQAP geneticAlgo = new GeneticAlgorithmQAP(qap); //paramGA. = new QuadraticAssignmentSolution(qap.N); RunGeneticAlgorithm <QuadraticAssignmentSolution>(geneticAlgo, false, paramGA); allText += "\n\n" + instanceName + ":\n"; allText += "Resultats:\n" + resultString + ComparisonWithBest(); allText += "\n----"; } allText = allText.Replace("\r\n", "\n").Replace("\r", "\n").Replace("\n", "\r\n"); string fullNameAllGA = Path.Combine(resultPath, "all_" + algo.GetString() + "_s" + seed + ".txt"); System.IO.File.WriteAllText(fullNameAllGA, allText); break; case "autoga": string instanceCurrent = "tai12a"; ChangeInstance(instanceCurrent); algo = Algo.GA; List <GeneticAlgorithmParameters> paramsGa = new List <GeneticAlgorithmParameters>(); paramsGa.Add(new GeneticAlgorithmParameters(100, 25, 0.005, 0, 0)); paramsGa.Add(new GeneticAlgorithmParameters(300, 25, 0.005, 0, 0)); paramsGa.Add(new GeneticAlgorithmParameters(100, 50, 0.005, 0, 0)); paramsGa.Add(new GeneticAlgorithmParameters(100, 25, 0.1, 0, 0)); paramsGa.Add(new GeneticAlgorithmParameters(100, 25, 0.005, 5, 0)); paramsGa.Add(new GeneticAlgorithmParameters(100, 25, 0.005, 20, 0)); paramsGa.Add(new GeneticAlgorithmParameters(100, 25, 0.005, 0, 20)); paramsGa.Add(new GeneticAlgorithmParameters(100, 25, 0.005, 0, 50)); paramsGa.Add(new GeneticAlgorithmParameters(100, 25, 0.005, 2, 20)); GeneticAlgorithmQAP geneticAlgoAll = new GeneticAlgorithmQAP(qap); allText = instanceCurrent + "\n"; foreach (GeneticAlgorithmParameters parGA in paramsGa) { RunGeneticAlgorithm <QuadraticAssignmentSolution>(geneticAlgoAll, false, parGA); allText += parGA.ToString(); allText += "\nResultats:\n" + resultString + ComparisonWithBest(); allText += "\n----"; } allText = allText.Replace("\r\n", "\n").Replace("\r", "\n").Replace("\n", "\r\n"); string fulenamega = Path.Combine(resultPath, "all_" + algo.GetString() + "_s" + seed + ".txt"); System.IO.File.WriteAllText(fulenamega, allText); break; default: Console.WriteLine("\nCommande invalide!"); break; } } }
public GeneticAlgorithmViewModel(GeneticAlgorithmParameters gap) { this.Parameters = gap; this.CreateGACommand = new CreateGACommand(this); }