Esempio n. 1
0
        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); });
        }
Esempio n. 3
0
        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();
 }
Esempio n. 7
0
        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();
        }
Esempio n. 8
0
        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();
        }
Esempio n. 9
0
 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}")));
         }
     }
 }
Esempio n. 10
0
        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.");
            }
        }
Esempio n. 11
0
        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);
        }
Esempio n. 12
0
        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;
                }
            }
        }
Esempio n. 13
0
 public GeneticAlgorithmViewModel(GeneticAlgorithmParameters gap)
 {
     this.Parameters      = gap;
     this.CreateGACommand = new CreateGACommand(this);
 }