// end of metrics public RoutingSolutionObject(RoutingSolver routingSolver, Assignment solution) { _routingSolver = routingSolver; _solution = solution; ComputeSolutionData(_solution); //SolutionToVehicleRouteMetrics(_solution); MetricsContainer = new MetricsContainer(); RegisterAllMetrics(); }
public RoutingDataModel CreateInitialSimulationDataModel(bool allowDropNodes, Simulation.Simulation simulation) { var numberCustomers = simulation.Params.NumberInitialRequests; var numberVehicles = simulation.Params.VehicleNumber; Console.WriteLine(this.ToString() + "Creating new random DataModel for " + numberVehicles + " Vehicles and " + numberCustomers + " Customers, AllowDropNodes: " + allowDropNodes); GenerateNewDataModelLabel: List <Vehicle> dataModelVehicles = new List <Vehicle>(); List <long> startDepotsArrivalTime = new List <long>(numberVehicles); //Creates two available vehicles to be able to perform flexible routing for the pdtwdatamodel for (int i = 0; i < numberVehicles; i++) { var vehicle = new Vehicle(simulation.Params.VehicleSpeed, simulation.Params.VehicleCapacity, simulation.Context.Depot, simulation.Context.Depot); dataModelVehicles.Add(vehicle); startDepotsArrivalTime.Add(0);//startDepotArrival time = 0 for all the vehicles } var customersToBeServed = new List <Customer>(); List <Stop> excludedStops = new List <Stop>(); foreach (var vehicle in dataModelVehicles) { if (!excludedStops.Contains(vehicle.StartStop)) { excludedStops.Add(vehicle.StartStop); } if (!excludedStops.Contains(vehicle.EndStop)) { excludedStops.Add(vehicle.EndStop); } } for (int i = 0; i < numberCustomers; i++) //generate 5 customers with random timeWindows and random pickup and delivery stops { var requestTime = 0; var pickupTimeWindow = new int[] { requestTime, simulation.Params.SimulationTimeWindow[1] }; //the customer pickup time will be between the current request time and the end of simulation time var customer = CustomerFactory.Instance().CreateRandomCustomer(simulation.Context.Stops, excludedStops, requestTime, pickupTimeWindow, false, simulation.Params.VehicleSpeed); //Generates a random static customer customersToBeServed.Add(customer); } var indexManager = new DataModelIndexManager(dataModelVehicles, customersToBeServed, startDepotsArrivalTime); var routingDataModel = new RoutingDataModel(indexManager, simulation.Params.MaximumRelativeCustomerRideTime, simulation.Params.MaximumAllowedDeliveryDelay); var solver = new RoutingSolver(routingDataModel, allowDropNodes); RoutingSearchParameters searchParameters = operations_research_constraint_solver.DefaultRoutingSearchParameters(); searchParameters.LocalSearchMetaheuristic = LocalSearchMetaheuristic.Types.Value.Automatic; searchParameters.SolutionLimit = 1; //until it finds 1 solution var solution = solver.TryGetSolution(searchParameters); if (solution == null) { goto GenerateNewDataModelLabel; } return(routingDataModel); }