谷歌OR工具-设置时间窗口维度失败,出现低级错误



因此,我尝试在https://developers.google.com/optimization/routing/vrptw作为我自己的一些代码的基础。

在我的情况下,我想安排多天的多辆车(每辆车在司机家出发/返回(。在本例中,假设有一个停车场,所有车辆在同一天从该停车场出发。时间矩阵的第一列是停车场编号,我相信该代码中的0索引是因为所有车辆都从停车场出发/返回。

// 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]);
} 

因此,在我的情况下,假设我有三天的时间来交付这两辆车,在时间矩阵中,我有以下列:

  • 第1天-车辆1(从位置A开始/返回(
  • 第1天-车辆2(从位置B开始/返回(
  • 第2天-车辆1(从位置A开始/返回(
  • 第2天-车辆2(从位置B开始/返回(
  • 第3天-车辆1(从位置A开始/返回(
  • 第3天-车辆2(从位置B开始/返回(

然后我有一个车辆开始和结束节点的数组,指向这些条目。所有这些都运行良好,我对所提供的结果或工具感到满意。

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

  • 第1天-车辆1时间窗口0-1440
  • 第1天-车辆2时间窗口0-1440
  • 第2天-车辆1时间窗口1440-2880
  • 第2天-车辆2时间窗口1440-2880
  • 第3天-车辆1时间窗口2880-4320
  • 第3天-车辆2时间窗口2880-4320

所以我已经将上面的示例代码更改为下面的代码。我以为代码看起来还可以,但它被";无法获取您的数据。失败";(这似乎是一个相当低的水平错误(。

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.Or工具9.0.9048

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

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

问题:时间维度的车辆容量(也称为地平线(是多少?它必须至少为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。

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

相关内容

最新更新