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
- 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 )
- i tried setting time window_start_time and window_start_time from 540 to 2880(2880 extending to next day as well)
scenarios: working
- 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);