Exemple #1
0
        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;
                }
            }
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        protected bool TryCarsX2Reallocate(AllocateRidesToCarDelegate allocateRidesToCarDelegate, int numberOfCars)
        {
            int[] instances = new int[numberOfCars];

            return(TryCarsX2Reallocate_Recurse(allocateRidesToCarDelegate, instances, 0));
        }