小编Rom*_*ski的帖子

如何在 Google Or-Tools 中限制路线持续时间?

我正在研究路线优化问题,但我发现自己陷入了一些僵局。我正在使用 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)

c# mathematical-optimization or-tools

5
推荐指数
1
解决办法
755
查看次数

标签 统计

c# ×1

mathematical-optimization ×1

or-tools ×1