Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Google或Tools-设置时间窗口维度失败,出现低级错误_C#_Or Tools - Fatal编程技术网

C# Google或Tools-设置时间窗口维度失败,出现低级错误

C# Google或Tools-设置时间窗口维度失败,出现低级错误,c#,or-tools,C#,Or Tools,因此,我试图使用的VRPTW的例子作为我自己的一些代码的基础 在我的情况下,我想安排多天的多辆车(每辆车在司机家出发/返回)。 在本例中,假设有一个停车场,所有车辆在一天内从该停车场出发。时间矩阵的第一列是车辆段编号,我认为该代码中的0索引是因为所有车辆离开/返回车辆段 // Add time window constraints for each vehicle start node. for (int i = 0; i < data.VehicleNumber; ++i) {

因此,我试图使用的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]);
} 
//为每个车辆启动节点添加时间窗口约束。
对于(int i=0;i
因此,在我的情况下,假设我有三天时间由两辆车交付,在我的时间矩阵中,我有以下列:

  • 第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++;
            }
        }
var useIndex=0;
对于(int i=0;itimeDimension.CumulVar(index).SetRange(fromTime,toTime);不要使用SetRange。请使用Solver.Add(Solver.MakeBetweenCt())。
SetRange API将在搜索中使用。

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

问题:时间维度的车辆容量(又称地平线)是多少? 至少是4320

i、 当你用这种东西的时候

routing.AddDimension(
交通评价者指数,
十、 #此处的最大空闲时间即等待时间

Y、 #我将Y设置为100000。我正在尝试将范围设置为1440-2880,因此应该可以。但是,对于我设置为true的第四个属性,您的值为false。如果我将其设置为false,我将不再得到错误。如果将其设置为true,则意味着您将强制时间维度。CumulVar(任何_start_节点)为零,但如果同时您具有要设置的开始节点的范围[1440-2880]或[2880-4320]你只是让你的问题变得不可行,因为0不在范围内…我不得不回到资源约束的例子,以了解你在这里得到了什么以及它可能如何工作。我想我了解了你的来源,我可以看到它在我仍然要做的一些其他事情中的用途,但从时间窗口约束推断根据我对Mizux答案的评论,我认为我目前可以不使用MakeBetweenCt,除非我遗漏了一些令人信服的原因。