void InitializeValues()
        {
            totalCities = SharedMethods.TotalCities;

            tourOrder     = new int[totalCities];
            tourLocations = new Vector2[totalCities];

            (tourLocations, tourOrder) = SharedMethods.InitializeLocations(totalCities, random);

            SharedMethods.Order.CopyTo(tourOrder, 0);
            SharedMethods.Locations.CopyTo(tourLocations, 0);

            SharedMethods.DrawPoints(pointsGrid);

            initialDistance = SharedMethods.RoundTripDistance(tourLocations, tourOrder);

            populationSize = SharedMethods.PopulationSize;
            mutationRate   = SharedMethods.MutationRate;
            elitism        = SharedMethods.Elitism;

            count = 0;

            ga = null;
            ga = new GAClass(populationSize, totalCities, elitism, random, mutationRate);
        }
        public static (int[], int) two_opt(int[] order, int count)
        {
            var bestdistance = SharedMethods.RoundTripDistance(SharedMethods.Locations, order);
            int flag         = 0;

            for (int i = 0; i < order.Length - 1; i++)
            {
                for (int j = i + 1; j < order.Length; j++)
                {
                    var newRout = two_opt_swap(order, i, j);
                    var newdis  = SharedMethods.RoundTripDistance(SharedMethods.Locations, newRout);
                    if (bestdistance > newdis)
                    {
                        bestdistance = newdis;
                        order        = newRout;
                        flag         = 1;
                        count++;
                        break;
                    }
                }
                if (flag == 1)
                {
                    break;
                }
            }

            return(order, count);
        }
Ejemplo n.º 3
0
        private async void CanvasAnimatedControl_Draw(Microsoft.Graphics.Canvas.UI.Xaml.ICanvasAnimatedControl sender, Microsoft.Graphics.Canvas.UI.Xaml.CanvasAnimatedDrawEventArgs args)
        {
            if (SharedMethods.isRunnnig)
            {
                var curDistance = SharedMethods.RoundTripDistance(tourLocations, tourOrder);

                bestTourDistance = curDistance;

                tourOrder = SimulatedAnnealing.PerformSimulatedAnnealing(tourOrder, Temperature, random);

                Temperature = Temperature * TemperatureRate;
                UpdateUI();

                count++;

                SharedMethods.DrawPath(args.DrawingSession, tourLocations, tourOrder, Color.FromArgb(85, 255, 255, 255), 2f);
            }
            else
            {
                if (count > 0)
                {
                    SharedMethods.DrawPath(args.DrawingSession, tourLocations, tourOrder, Color.FromArgb(85, 255, 255, 255), 4f);
                }
                await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                {
                    startBtn.Visibility = Visibility.Visible;
                    stopBtn.Visibility  = Visibility.Collapsed;
                });

                sender.Paused = true;
            }
        }
        void SetFitness()
        {
            for (int i = 0; i < PopulationSize; i++)
            {
                Population[i].Fitness = (float)SharedMethods.RoundTripDistance(
                    SharedMethods.Locations, Population[i].Genes);

                if (Population[i].Fitness < BestFitnes)
                {
                    BestFitnes = Population[i].Fitness;
                    Population[i].Genes.CopyTo(BestGenes, 0);
                }
            }

            Population = Population.OrderBy(x => x.Fitness).ToList();

            var inverse              = Population.Select(x => 1 / x.Fitness).ToList();
            var sum                  = inverse.Sum();
            var inverseProportion    = inverse.Select(x => x / sum).ToList();
            var proportionSum        = inverseProportion.Sum();
            var normalizedProportion = inverseProportion.Select(x => x / proportionSum).ToList();

            cumuProportion.Clear();
            var cumuTotal = 0f;

            foreach (var item in normalizedProportion)
            {
                cumuTotal += item;
                cumuProportion.Add(cumuTotal);
            }

            cumuProportion[PopulationSize - 1] = 1;
        }
        private async void CanvasAnimatedControl_Draw(Microsoft.Graphics.Canvas.UI.Xaml.ICanvasAnimatedControl sender, Microsoft.Graphics.Canvas.UI.Xaml.CanvasAnimatedDrawEventArgs args)
        {
            if (SharedMethods.isRunnnig)
            {
                var curDistance = SharedMethods.RoundTripDistance(tourLocations, tourOrder);

                if (curDistance < bestTourDistance)
                {
                    bestTourDistance = curDistance;
                    tourOrder.CopyTo(bestTourOrder, 0);
                }

                currentIteration++;

                UpdateUI();

                tourOrder = LexicographicOrder.Lexicography(tourOrder);


                if (currentIteration >= totalIterations)
                {
                    SharedMethods.isRunnnig = false;
                }
                else
                {
                    SharedMethods.DrawPath(args.DrawingSession, tourLocations, tourOrder, Color.FromArgb(85, 255, 255, 255), 2f);
                    SharedMethods.DrawPath(args.DrawingSession, tourLocations, bestTourOrder, Color.FromArgb(85, 255, 255, 255), 4f);
                }
            }
            else
            {
                if (currentIteration > 0)
                {
                    SharedMethods.DrawPath(args.DrawingSession, tourLocations, bestTourOrder, Color.FromArgb(85, 255, 255, 255), 4f);
                }
                await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                {
                    startBtn.Visibility = Visibility.Visible;
                    stopBtn.Visibility  = Visibility.Collapsed;
                });

                sender.Paused = true;
            }
        }
        public static int[] PerformSimulatedAnnealing(int[] x, double Temp, Random random)
        {
            var newOrder = AnnealingSwap(x, random);

            var d1 = SharedMethods.RoundTripDistance(SharedMethods.Locations, x);
            var d2 = SharedMethods.RoundTripDistance(SharedMethods.Locations, newOrder);

            var prob = probability(d1, d2, Temp);
            var rand = random.NextDouble();

            if (rand < prob)
            {
                x = newOrder;
            }

            //Temp = Temp * 0.999f;

            return(x);
        }
Ejemplo n.º 7
0
        void InitializeValues()
        {
            totalCities = SharedMethods.TotalCities;

            tourOrder     = new int[totalCities];
            tourLocations = new Vector2[totalCities];
            bestTourOrder = new int[totalCities];

            (tourLocations, tourOrder) = SharedMethods.InitializeLocations(totalCities, random);

            SharedMethods.Order.CopyTo(tourOrder, 0);
            SharedMethods.Locations.CopyTo(tourLocations, 0);

            SharedMethods.DrawPoints(pointsGrid);

            initialDistance = SharedMethods.RoundTripDistance(tourLocations, tourOrder);

            bestTourDistance = float.PositiveInfinity;
            swaps            = 0;
        }
        void InitializeValues()
        {
            totalCities = SharedMethods.TotalCities;

            tourOrder     = new int[totalCities];
            tourLocations = new Vector2[totalCities];
            bestTourOrder = new int[totalCities];

            (tourLocations, tourOrder) = SharedMethods.InitializeLocations(totalCities, random);

            SharedMethods.Order.CopyTo(tourOrder, 0);
            SharedMethods.Locations.CopyTo(tourLocations, 0);

            SharedMethods.DrawPoints(pointsGrid);

            initialDistance = SharedMethods.RoundTripDistance(tourLocations, tourOrder);
            totalIterations = SharedMethods.Factorial(totalCities);

            currentIteration = 0;
            bestTourDistance = double.PositiveInfinity;
        }
Ejemplo n.º 9
0
        void InitializeValues()
        {
            totalCities = SharedMethods.TotalCities;

            tourOrder     = new int[totalCities];
            tourLocations = new Vector2[totalCities];

            (tourLocations, tourOrder) = SharedMethods.InitializeLocations(totalCities, random);

            SharedMethods.Order.CopyTo(tourOrder, 0);
            SharedMethods.Locations.CopyTo(tourLocations, 0);

            SharedMethods.DrawPoints(pointsGrid);

            initialDistance = SharedMethods.RoundTripDistance(tourLocations, tourOrder);

            Temperature     = SharedMethods.Temperature;
            TemperatureRate = SharedMethods.TemperatureRate;

            count = 0;
        }