微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Google OR 工具 - 设置时间窗口尺寸失败并出现低级错误

如何解决Google OR 工具 - 设置时间窗口尺寸失败并出现低级错误

所以我尝试使用 https://developers.google.com/optimization/routing/vrptw 中的 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.OrTools 9.0.9048

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

解决方法

不要使用 SetRange。使用 Solver.Add(solver.MakeBetweenCt())。 SetRange API 旨在在搜索中使用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。