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); }
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); }
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); }
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); }