Beispiel #1
0
        public void SimpleLogConfigAndDump()
        {
            var c = new RouteConfiguration()
                    .AddAction(new ActionSequenceConfiguration("Sequence")
                               .AddAction(new WriteActionConfiguration("n°1")
            {
                FileName = @"File n°1"
            })
                               .AddAction(new WriteActionConfiguration("n°2")
            {
                FileName = @"File n°2"
            }));

            Assert.That(_host.ObtainRoute(""), Is.SameAs(FinalRoute.Empty));

            Assert.That(_host.ConfigurationAttemptCount, Is.EqualTo(0));
            Assert.That(_host.SetConfiguration(TestHelper.ConsoleMonitor, c));
            Assert.That(_host.SuccessfulConfigurationCount, Is.EqualTo(1));

            _defaultRoute = _host.ObtainRoute(null);
            Assert.That(_defaultRoute.Actions.Length, Is.EqualTo(1));
            Assert.That(_defaultRoute.Actions[0], Is.InstanceOf <TestSequence>());

            var f1 = File.AllFiles["File n°1"];
            var f2 = File.AllFiles["File n°2"];

            Assert.That(f1.IsOpened && f2.IsOpened);
            _defaultRoute.Run(0);
            CheckContent(f1, "0");
            CheckContent(f2, "0");
            _defaultRoute.Run(1);
            _defaultRoute.Run(2);
            CheckContent(f1, "0", "1", "2");
            CheckContent(f2, "0", "1", "2");

            var c2 = new RouteConfiguration()
                     .AddAction(new WriteActionConfiguration("n°1")
            {
                FileName = @"File n°1"
            });

            Assert.That(_host.SetConfiguration(TestHelper.ConsoleMonitor, c2));
            Assert.That(_host.ConfigurationAttemptCount, Is.EqualTo(2));
            Assert.That(_host.SuccessfulConfigurationCount, Is.EqualTo(2));

            var r2 = _host.ObtainRoute(null);

            Assert.That(r2, Is.Not.SameAs(_defaultRoute));
            _defaultRoute = r2;
            _defaultRoute.Run(3);
            _defaultRoute.Run(4);
            CheckContent(f1, "0", "1", "2", "3", "4");
            CheckContent(f2, "0", "1", "2");

            Assert.That(ActivityMonitor.CriticalErrorCollector.ToArray().Length, Is.EqualTo(0));
        }
        /// <summary>
        /// Metoda rozwiązująca problem komiwojażera algorytmem genetycznym
        /// </summary>
        /// <param name="numOfGenerations"></param>
        public void StartGeneticAlgorithm(int numOfGenerations)
        {
            CreatePopulation();
            numberOfGenerations = 0;

            while (numberOfGenerations <= numOfGenerations)
            {
                int        populationCount     = Population.Count();
                int        numOfChildrenToBorn = 50;
                Individual firstParent;
                Individual secondParent;

                for (int i = 0; i < numOfChildrenToBorn; i++)
                {
                    do
                    {
                        firstParent  = new Individual(Population.ElementAt(randomGenerator.Next(0, populationCount - 1)));
                        secondParent = new Individual(Population.ElementAt(randomGenerator.Next(0, populationCount - 1)));
                    } while (firstParent.Equals(secondParent) && firstParent.IsItParent() && secondParent.IsItParent());
                    // sprawdzamy czy dwa wylosowane osobniki nie są takie same
                    // oraz sprawdzamy czy są rodzicami
                    crossProbability = (float)randomGenerator.NextDouble();

                    if (crossProbability >= 0.6)
                    {
                        Individual child = new Individual(PMXChildCreation(firstParent, secondParent));
                        Population.Add(child);
                    }
                }

                SetAllAsParents(Population);
                mutationProbability = (float)randomGenerator.NextDouble();

                if (mutationProbability > 0.01 && mutationProbability < 0.1)
                {
                    var individualToMutate = Population.ElementAt(randomGenerator.Next(0, Population.Count));
                    Mutate(individualToMutate);
                }

                PopulationSelection(Population);
                numberOfGenerations++;
            }

            var bestIndividual = Population.First();

            if (bestIndividual.PathCost < BestCycleCost)
            {
                for (int i = 0; i < numOfCities; i++)
                {
                    FinalRoute.Push(bestIndividual.Path[i]);
                }
                BestCycleCost = bestIndividual.PathCost;
            }
        }