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]);
}
所以在我的例子中,假设我有三天的时间来交付两辆车,在我的时间矩阵中,我有以下列:
- 第 1 天 - 车辆 1(starts/returns 来自位置 A)
- 第 1 天 - 车辆 2(starts/returns 来自位置 B)
- 第 2 天 - 车辆 1(starts/returns 来自位置 A)
- 第 2 天 - 车辆 2(starts/returns 来自位置 B)
- 第 3 天 - 车辆 1(starts/returns 来自位置 A)
- 第 3 天 - 车辆 2(starts/returns 来自位置 B)
然后我有一个车辆开始和结束节点数组,以指向这些条目。所有这些工作正常,我对 or-tools 提供的结果感到满意。
我现在遇到的问题是我想为每辆车设置时间 windows。所以应该是这样的:
- 第 1 天 - 车辆 1 次 Window 0-1440
- 第 1 天 - 车辆 2 时间 Window 0-1440
- 第 2 天 - 车辆 1 次 Window 1440-2880
- 第 2 天 - 车辆 2 时间 Window 1440-2880
- 第 3 天 - 车辆 1 次 Window 2880-4320
- 第 3 天 - 车辆 2 时间 Window 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.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。
所以我尝试使用 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]);
}
所以在我的例子中,假设我有三天的时间来交付两辆车,在我的时间矩阵中,我有以下列:
- 第 1 天 - 车辆 1(starts/returns 来自位置 A)
- 第 1 天 - 车辆 2(starts/returns 来自位置 B)
- 第 2 天 - 车辆 1(starts/returns 来自位置 A)
- 第 2 天 - 车辆 2(starts/returns 来自位置 B)
- 第 3 天 - 车辆 1(starts/returns 来自位置 A)
- 第 3 天 - 车辆 2(starts/returns 来自位置 B)
然后我有一个车辆开始和结束节点数组,以指向这些条目。所有这些工作正常,我对 or-tools 提供的结果感到满意。
我现在遇到的问题是我想为每辆车设置时间 windows。所以应该是这样的:
- 第 1 天 - 车辆 1 次 Window 0-1440
- 第 1 天 - 车辆 2 时间 Window 0-1440
- 第 2 天 - 车辆 1 次 Window 1440-2880
- 第 2 天 - 车辆 2 时间 Window 1440-2880
- 第 3 天 - 车辆 1 次 Window 2880-4320
- 第 3 天 - 车辆 2 时间 Window 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.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。