Google Or-Tools Vehicle Routing Problem - Solution is null while adding time window constrain

40 Views Asked by At

i have 6 locations i need to add time window to reach 1st location by 9:00 am (lets take) and 4th location by 11:00 am

scenarios: not working

  1. i tried setting time window_start_time and window_start_time from 540 min to 1440 min (540 to start from 9 am and 1440 to end of day )
  2. i tried setting time window_start_time and window_start_time from 540 to 2880(2880 extending to next day as well)

scenarios: working

  1. i tried setting time window_start_time and window_start_time from 0 min to 1440 min (0 to start of day and 1440 to end of day ) this scenario working but i need to start my day by visiting location at 9 am , but this is giving optimized route with other locations to reach 1st

    IDictionary<int, TravelLocationlTimeWindowModel> locations = new Dictionary<int, TravelLocationlTimeWindowModel>();
    
    for (int i = 0; i < 7; i++)
    {
        string _from_lat = (i * 50).ToString();
        string _from_lng = (i * 100).ToString();
        TravelLocationlTimeWindowModel locationTravelTimeModel = new TravelLocationlTimeWindowModel();
        var location = new GeoLocationEntity {lat= _from_lat,lng= _from_lng };
    
        locationTravelTimeModel.time_window_start = 535;
        locationTravelTimeModel.time_window_end = 1440;//1440
    
        if (i == 1)
        {
            locationTravelTimeModel.time_window_start = 535;
            locationTravelTimeModel.time_window_end = 615;
        }
        else if (i == 5)
        {
            locationTravelTimeModel.time_window_start = 660;
            locationTravelTimeModel.time_window_end = 780;
        }
        else if (i == 6)
        {
            locationTravelTimeModel.time_window_start = 600;
            locationTravelTimeModel.time_window_end = 630;
        }
        locationTravelTimeModel.geo_location = location;
        locations.Add(i, locationTravelTimeModel);
      
    }
    
     _time_matrix = new int[,]
                     {
                         {0, 127, 177, 52, 148, 147, 176},
                         {127, 0, 180, 163, 168, 167, 190},
                         {177, 180, 0, 193, 45, 44, 35},
                         {52, 163, 193, 0, 165, 163, 196},
                         {148, 168, 45, 165, 0, 10, 44},
                         {147, 167, 44, 163, 10, 0, 42},
                         {176, 190, 35, 196, 44, 42, 0}
                     };
     int _vehicle_number = 1;
     int _depot = 0;
     int _locatons_count = locations.Count();
    
     RoutingIndexManager _manager = new RoutingIndexManager(_time_matrix.GetLength(0), _vehicle_number, _depot);
     RoutingModel _routing = new RoutingModel(_manager);
    
    
     // transit callback
     int transitCallbackIndex = _routing.RegisterTransitCallback((long fromIndex, long toIndex) =>
     {
         // Convert from routing variable Index to time
         // matrix NodeIndex.
         var _from_node = _manager.IndexToNode(fromIndex);
         var _to_node = _manager.IndexToNode(toIndex);
         return _time_matrix[_from_node, _to_node];
     });
    
     _routing.SetArcCostEvaluatorOfAllVehicles(transitCallbackIndex);
     long _slack_max = 5; // allow waiting time
                           // long[] _capacities = new long[_locatons_count];
     long _capacity = 1000; // vehicle/clinician maximum capacities
     bool _fix_start_cumul_to_zero = false;//  fixStartCumulToZero  -  start cumul to zero 
     string _dimension_name = "Time"; //  dimensionName =>Distance
    
     _routing.AddDimension(transitCallbackIndex, _slack_max, _capacity, _fix_start_cumul_to_zero, _dimension_name);
    
     //routing.AddDimensionWithVehicleCapacity(transitCallbackIndex, _slack_max, _capacities, _fix_start_cumul_to_zero, _dimension_name);
    
    
     RoutingDimension timeDimension = _routing.GetMutableDimension("Time");
    
     // Add time window constraints for each location except depot.
    
     for (int i = 0; i < locations.Count(); ++i)
     {
         long _index = _manager.NodeToIndex(i);
         var _time_window = locations[i];
         // _routing.AddVariableMinimizedByFinalizer(i, tasks[i], 100);
         timeDimension.CumulVar(_index).SetRange(_time_window.time_window_start, _time_window.time_window_end);               
     }
    
     long index = _manager.NodeToIndex(0);
     timeDimension.CumulVar(index).SetRange(0, 1440);
    
     _routing.AddVariableMinimizedByFinalizer(timeDimension.CumulVar(_routing.Start(0)));
     _routing.AddVariableMinimizedByFinalizer(timeDimension.CumulVar(_routing.End(0)));
    
     RoutingSearchParameters searchParameters = operations_research_constraint_solver.DefaultRoutingSearchParameters();
    
     searchParameters.FirstSolutionStrategy = FirstSolutionStrategy.Types.Value.PathCheapestArc;
     searchParameters.LocalSearchMetaheuristic = LocalSearchMetaheuristic.Types.Value.GuidedLocalSearch;
     searchParameters.TimeLimit = new Duration { Seconds = 30 };
     searchParameters.LogSearch = true;
     //solve
     Assignment _solution = _routing.SolveWithParameters(searchParameters);
0

There are 0 best solutions below