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