Example #1
0
        // find vehicle without ride, find "best" ride for this vehicle
        // Go through rides
        // find ride that we can reach early enough
        // calculate event times
        private void FindRides()
        {
            foreach (var v in Vehicles)
            {
                if (v.WithoutRide)
                {
                    Ride r = FindRide(v);
                    if (r != null)
                    {
                        // The vehicle is going to do this ride.
                        v.ActiveRide = r;
                        Rides.Remove(r); // Remove from list of all.
                        v.Rides.Add(r);  // Add to vehicle list.
                        v.EmptyRideToRow        = r.StartRow;
                        v.EmptyRideToColumn     = r.StartColumn;
                        v.PassengerRideToRow    = r.FinishRow;
                        v.PassengerRideToColumn = r.FinishColumn;

                        // NextEvent is the step, in which we delivered the passenger.
                        int emptyRide     = Distance(v.ActualPosRow, v.ActualPosColumn, r.StartRow, r.StartColumn);
                        int passengerRide = Distance(r.StartRow, r.StartColumn, r.FinishRow, r.FinishColumn);

                        if (StepNo + emptyRide < r.EarliestStart)
                        {
                            v.NextEvent = r.EarliestStart + passengerRide;
                        }
                        else
                        {
                            v.NextEvent = StepNo + emptyRide + passengerRide;
                        }

                        HashSet <Vehicle> value;
                        if (VehicleEvents.TryGetValue(v.NextEvent, out value))
                        {
                            value.Add(v);
                        }
                        else
                        {
                            HashSet <Vehicle> hsv = new HashSet <Vehicle>();
                            hsv.Add(v);
                            VehicleEvents.Add(v.NextEvent, hsv);
                        }
                    }
                }
            }
        }
Example #2
0
        private void Solve()
        {
            var vehicles = Vehicles.ToList();

            foreach (var vehicle in vehicles)
            {
                vehicle.RideScores = GetRideScores(vehicle);
            }
            while (true)
            {
                // pop all ride scores for already assigned rides
                foreach (var vehicle in vehicles)
                {
                    while (vehicle.RideScores.Count > 0 && vehicle.RideScores.Peek().Ride.Assigned)
                    {
                        vehicle.RideScores.Pop();
                    }
                }

                // remove vehicles without any ride scores (they cannot increase our score)
                vehicles = vehicles.Where(z => z.RideScores.Count > 0).ToList();
                if (vehicles.Count == 0)
                {
                    return;
                }

                var bestVehicle = vehicles.OrderBy(z => z.RideScores.Peek().Score).First();
                var bestRide    = bestVehicle.RideScores.Pop().Ride;
                var(endPos, endTick, _) = Drive(bestVehicle, bestRide);
                bestVehicle.Assignments.Add(bestRide);
                bestVehicle.Pos      = endPos;
                bestVehicle.TickFree = endTick;
                bestRide.Assigned    = true;
                Rides.Remove(bestRide.Index);
                bestVehicle.RideScores = GetRideScores(bestVehicle);
            }
        }
        public override void Solve()
        {
            Rides.Sort(new Ride.CompareByStartTime());
            Rides.Reverse();
            Vehicle.CompareByTimeDriveEnd carSortTimeDriveEnd = new Vehicle.CompareByTimeDriveEnd();
            Vehicles.Sort(carSortTimeDriveEnd);
            int currentTime = -1;

            while (Rides.Count > 0)
            {
                Vehicles.Sort(carSortTimeDriveEnd);

                currentTime++;
                if (Vehicles[0].TimeDriveEnd > currentTime)
                {
                    currentTime = Vehicles[0].TimeDriveEnd;
                }

                if (currentTime >= this.Steps)
                {
                    break;
                }

                // Clean rides list
                for (int ridePos = Rides.Count - 1; ridePos >= 0; ridePos--)
                {
                    Ride ride = Rides[ridePos];

                    // If ride not possible
                    if (ride.TimeLatestStart < currentTime)
                    {
                        Rides.RemoveAt(ridePos);
                        continue;
                    }
                }

                for (int i = 0; i < Vehicles.Count; i++)
                {
                    Vehicle car = Vehicles[i];

                    // This car (and all after) can't do rides in time
                    if (car.TimeDriveEnd > currentTime)
                    {
                        break;
                    }

                    Ride bestRide;
                    int  bestStartTime;
                    FindBestRideForCarMaxTime(car, currentTime, out bestRide, out bestStartTime);

                    if (bestRide == null)
                    {
                        continue;
                    }

                    // Check if valid
                    // Complete ride on time
                    int rideStartTime = Math.Max(bestRide.TimeStart, bestStartTime);
                    if (rideStartTime + bestRide.Distance >= bestRide.TimeEnd)
                    {
                        continue;
                    }

                    if (rideStartTime + bestRide.Distance >= Steps)
                    {
                        continue;
                    }

                    // Add ride to car
                    car.AddRide(bestRide, bestRide.EndR, bestRide.EndC, rideStartTime + bestRide.Distance);
                    Rides.Remove(bestRide);
                }
            }
        }
Example #4
0
        public override void Solve()
        {
            foreach (Ride ride in Rides)
            {
                ride.CalculateClosestRide(Rides);
            }

            while (true)
            {
                bool rideAdded = false;

                foreach (Vehicle car in Vehicles)
                {
                    Ride bestRide         = null;
                    int  bestCompleteTime = 0;

                    if (UseBonusMethod == false)
                    {
                        FindBestRideForCar(car, out bestRide, out bestCompleteTime);
                    }
                    else
                    {
                        FindBestRideForCarBonus(car, out bestRide, out bestCompleteTime);
                    }

                    if (bestRide == null)
                    {
                        continue;
                    }

                    rideAdded = true;
                    car.AddRide(bestRide, bestCompleteTime);
                    Rides.Remove(bestRide);
                }

                if (rideAdded == false)
                {
                    break;
                }
            }

            // Optimization phase
            while (true)
            {
                if (TryCarsX2Reallocate(AllocateRidesToCar_FindEarlyStartSimple, 1))
                {
                    continue;
                }

                if (TryCarsX2Reallocate(AllocateRidesToCar_FindEarlyStartClosest, 1))
                {
                    continue;
                }

                if (TryCarsX2Reallocate(AllocateRidesToCar_FindEarlyStartClosestV2, 1))
                {
                    continue;
                }

                if (TryCarsPushRide())
                {
                    continue;
                }

                //int score = this.CalculateScore();
                //this.WriteOutput(InputFileName + "." + score + ".out.txt");

                if (TryCarsX2Reallocate(AllocateRidesToCar_FindEarlyStartSimple, 2))
                {
                    continue;
                }

                if (TryCarsX2Reallocate(AllocateRidesToCar_FindEarlyStartClosest, 2))
                {
                    continue;
                }

                if (TryCarsX2Reallocate(AllocateRidesToCar_FindEarlyStartClosestV2, 2))
                {
                    continue;
                }

                /*
                 * if (TryCarsX2Reallocate(AllocateRidesToCar_FindEarlyStartSimple, 3))
                 *  continue;
                 *
                 * if (TryCarsX2Reallocate(AllocateRidesToCar_FindEarlyStartClosest, 3))
                 *  continue;
                 *
                 * if (TryCarsX2Reallocate(AllocateRidesToCar_FindEarlyStartClosestV2, 3))
                 *  continue;
                 */
                break;
            }
        }