Google 或工具 - 设置时间 window 维度因低级错误而失败

Google OR Tools - Setting time window dimensions fails with low level error

所以我尝试使用 https://developers.google.com/optimization/routing/vrptw 中的 VRPTW 示例作为我自己的一些代码的基础。

就我而言,我想安排多天使用多辆车(每辆 starting/returning 在 driver 的家中)。 在示例中,假设有一个站点,所有车辆都在某一天发车。时间矩阵的第一列是站点编号,我相信该代码中的 0 索引是因为所有车辆 leave/return 来自站点。

// Add time window constraints for each vehicle start node.
for (int i = 0; i < data.VehicleNumber; ++i)
{
    long index = routing.Start(i);
    timeDimension.CumulVar(index).SetRange(data.TimeWindows[0, 0], data.TimeWindows[0, 1]);
} 

所以在我的例子中,假设我有三天的时间来交付两辆车,在我的时间矩阵中,我有以下列:

然后我有一个车辆开始和结束节点数组,以指向这些条目。所有这些工作正常,我对 or-tools 提供的结果感到满意。

我现在遇到的问题是我想为每辆车设置时间 windows。所以应该是这样的:

所以我将上面的示例代码更改为下面的代码。我认为代码看起来不错,但它在指示的行上显示“无法获取您的数据。失败”(这似乎是一个非常低级的错误)。

        var useIndex = 0;
        for (int i = 0; i < data.DayCount; i++)
        {
            var fromTime = i * 1440;
            var toTime = (i + 1) * 1440;
            for (int j = 0; j < data.VehicleCount; ++j)
            {
                long index = routing.Start(useIndex);
                timeDimension.CumulVar(index).SetRange(fromTime, toTime);   <---- FAILS HERE

                useIndex++;
            }
        }

第一天一切顺利,将值设置为 0-1440。当它执行第二个循环并尝试将值设置为 1440-2880 时,它失败了。如果我在每个循环中将所有值都设置为 0-1440 就可以了。因此,只有当我尝试更改存在问题的值时。有什么想法吗?

编辑 1 错误消息的堆栈跟踪显示错误发生在这里:

在 Google.OrTools.ConstraintSolver.IntExpr.SetRange(Int64 l, Int64 u)

我正在使用 Google.OrTools 9.0.9048

编辑 2 看起来 from 值必须以 0 开头(0-1440 可以)。如果我尝试将所有范围分配给 1440-2880,它会立即失败。

不要使用 SetRange。使用 Solver.Add(solver.MakeBetweenCt())。 SetRange API 用于搜索内部。

TLDR:SetRange() 检查请求的新范围是否在域中,否则失败。

问题:时间维度的车辆容量(又名 horizon)是多少? 必须至少为 4320 !

即当你使用这样的东西时

routing.AddDimension(
  transit_evaluator_index,
  X, # max Slack time aka waiting time here
  Y, # <=== HERE vehicle capacity
  False, # Force start cumul to zero (not wanted for time dimension) 
  "Time") # name of the dimension and used as uid

我的意思是,所有范围值都必须小于或等于 Y。