protected void AllocateRidesToCar_StartEarliest(AllocateRidesToCarDelegate allocateRidesToCarDelegate, Vehicle newCar, List <Ride> freeRides, int bonusValue) { while (true) { Ride bestRide; int bestCompleteTime; allocateRidesToCarDelegate(newCar, freeRides, bonusValue, out bestRide, out bestCompleteTime); if (bestRide != null) { newCar.AddRide(bestRide, bestCompleteTime); // Remove ride from list for (int i = 0; i < freeRides.Count; i++) { if (freeRides[i].ID == bestRide.ID) { freeRides.RemoveAt(i); break; } } } else { break; } } }
private bool TryCarsX2Reallocate_Perform(AllocateRidesToCarDelegate allocateRidesToCarDelegate, int[] instances) { bool improved = false; List <Vehicle> cars = new List <Vehicle>(); for (int i = 0; i < instances.Length; i++) { cars.Add(Vehicles[instances[i]]); } List <Ride> freeRides = new List <Ride>(Rides); List <Vehicle> newCars = new List <Vehicle>(); foreach (Vehicle car in cars) { freeRides.AddRange(car.RidesAssigned); newCars.Add(new Vehicle(car.ID)); } foreach (Vehicle newCar in newCars) { AllocateRidesToCar_StartEarliest(allocateRidesToCarDelegate, newCar, freeRides, this.Bonus); } int oldScore = 0; foreach (Vehicle car in cars) { oldScore += car.GetScore(this.Bonus); } int newScore = 0; foreach (Vehicle newCar in newCars) { newScore += newCar.GetScore(this.Bonus); } if (newScore > oldScore) { Rides = freeRides; for (int i = 0; i < instances.Length; i++) { Vehicles[instances[i]] = newCars[i]; } improved = true; } return(improved); }
protected bool TryCarsReallocate(AllocateRidesToCarDelegate allocateRidesToCarDelegate) { for (int i = 0; i < Vehicles.Count; i++) { Vehicle car = Vehicles[i]; List <Ride> freeRides = new List <Ride>(Rides); freeRides.AddRange(car.RidesAssigned); Vehicle newCar = new Vehicle(car.ID); AllocateRidesToCar_StartEarliest(allocateRidesToCarDelegate, newCar, freeRides, this.Bonus); if (newCar.DriveDistance + newCar.BonusCollected * this.Bonus > car.DriveDistance + car.BonusCollected * this.Bonus) { Rides = freeRides; Vehicles[i] = newCar; return(true); } } return(false); }
private bool TryCarsX2Reallocate_Recurse(AllocateRidesToCarDelegate allocateRidesToCarDelegate, int[] instances, int nextPos) { if (nextPos == instances.Length) { return(TryCarsX2Reallocate_Perform(allocateRidesToCarDelegate, instances)); } bool improved = false; int minCar = 0; if (nextPos > 0) { minCar = instances[nextPos - 1] + 1; } for (int i = minCar; i < Vehicles.Count; i++) { instances[nextPos] = i; bool newImproved = TryCarsX2Reallocate_Recurse(allocateRidesToCarDelegate, instances, nextPos + 1); improved = improved || newImproved; } return(improved); }
protected bool TryCarsX2Reallocate(AllocateRidesToCarDelegate allocateRidesToCarDelegate, int numberOfCars) { int[] instances = new int[numberOfCars]; return(TryCarsX2Reallocate_Recurse(allocateRidesToCarDelegate, instances, 0)); }