Ejemplo n.º 1
0
        public static List <Tour> Swap(Tour tour1, Tour tour2)
        {
            double bestTours = double.MaxValue;

            double      oldValue    = WeightedReindeerWeariness.Calculate(tour1) + WeightedReindeerWeariness.Calculate(tour2);
            List <Tour> newBestTour = new List <Tour>()
            {
                tour1, tour2
            };

            for (int i = 0; i < tour1.Gifts.Count - 1; i++)
            {
                for (int j = 0; j < tour2.Gifts.Count - 1; j++)
                {
                    List <Tour> tourList  = Swap(tour1, tour2, i, j).ToList();
                    double      weariness = WeightedReindeerWeariness.Calculate(tourList);
                    if (weariness < bestTours)
                    {
                        if (Math.Abs(weariness - oldValue) > 0.001)
                        {
                            bestTours   = weariness;
                            newBestTour = tourList;
                        }
                    }
                }
            }

            return(newBestTour);
        }
Ejemplo n.º 2
0
        public void TestCalculation()
        {
            Tour tour  = new Tour();
            Gift gift1 = new Gift(1, 15, 10, 10);
            Gift gift2 = new Gift(2, 30, 90, 30);

            tour.AddGift(gift1);
            tour.AddGift(gift2);

            double calculated = WeightedReindeerWeariness.Calculate(tour);
            double expected   = (gift1.Weight + gift2.Weight + Parameter.BaseSleighWeight) * Parameter.InitialLocation.DistanceTo(gift1.Location) +
                                (gift2.Weight + Parameter.BaseSleighWeight) * gift1.DistanceTo(gift2) +
                                (Parameter.BaseSleighWeight * gift2.Location.DistanceTo(Parameter.InitialLocation));

            Assert.AreEqual(expected, calculated);
        }
Ejemplo n.º 3
0
        public static int FindOptimalInsertionPosition(Tour tour, Gift gift)
        {
            double minWeariness     = double.MaxValue;
            int    positionToInsert = 0;

            for (int i = 0; i < tour.Gifts.Count; i++)
            {
                tour.AddGiftAtPos(gift, i);
                double weariness = WeightedReindeerWeariness.Calculate(tour);
                if (weariness < minWeariness)
                {
                    minWeariness     = weariness;
                    positionToInsert = i;
                }
                tour.RemoveGift(i);
            }

            return(positionToInsert);
        }
Ejemplo n.º 4
0
        public static IEnumerable <Tour> ImproveFinalTour(IEnumerable <Tour> tours)
        {
            List <Tour> result = new List <Tour>();

            foreach (Tour tour in tours)
            {
                double oldWeariness = WeightedReindeerWeariness.Calculate(tour);
                tour.Gifts.Reverse();
                if (WeightedReindeerWeariness.Calculate(tour) < oldWeariness)
                {
                    result.Add(tour);
                }
                else
                {
                    tour.Gifts.Reverse();
                    result.Add(tour);
                }
            }
            return(result);
        }