我正在研究路线优化问题,但我发现自己陷入了一些僵局。我正在使用 or-tools 作为具有 .Net 核心的求解器。
问题如下:当我处理时间窗口约束时,可能需要一些等待以适应某个位置时间窗口。这很好。求解器倾向于使用时间窗口约束位置作为第一个节点。这也很好。但是这样我们可能想把车辆的出发日期加上一些完美的延迟。因此,当我将路线持续时间限制设置为 8 小时,并且我们在开始时等待 2 小时,结果我们以 6 小时的工作结束,这不是最佳选择。我不知道如何通知求解器第一个节点等待时间正在增加总持续时间。
这是文档链接:https : //developers.google.com/optimization/routing/vrp
// 这是我的时间维度
_routingModel.AddDimension(
evaluator_index: _absoluteTimeCallbackIndex,
slack_max: (long)TimeSpan.FromDays(1).TotalSeconds,
capacity: (long)TimeSpan.FromDays(1).TotalSeconds,
fix_start_cumul_to_zero: true,
name: PlannerConstants.TIME_DIMENSION_NAME);
Run Code Online (Sandbox Code Playgroud)
// 这段代码是设置时间窗口和持续时间约束
var timeDimension = _routingModel.GetDimensionOrDie(PlannerConstants.TIME_DIMENSION_NAME);
for (int locationNodeIndex = 0; locationNodeIndex < _targets.Count; locationNodeIndex++)
{
var location = _targets[locationNodeIndex].Location;
var index = _manager.NodeToIndex(locationNodeIndex);
var timeWindowMatch = new TimeWindowMatcher(_departureDate, location.TimeSlots.ToList())
.GetTimeWindowsWithGaps();
var start = (long)timeWindowMatch.WideTimeRange.From.TotalSeconds;
var end = (long)timeWindowMatch.WideTimeRange.To.TotalSeconds;
timeDimension
.CumulVar(index)
.SetRange(start, end);
timeWindowMatch.TimeGaps.ForEach(gap =>
{
timeDimension
.CumulVar(index)
.RemoveInterval((long)gap.From.TotalSeconds, (long)gap.To.TotalSeconds);
}); …Run Code Online (Sandbox Code Playgroud)