Google/OR-Tools 获取持续时间和距离

问题描述

我正在尝试理解 MVRP 示例中的解决方调用

我有两个矩阵,持续时间和距离是通过调用 google 返回的

我的解决方案基于距离,但鉴于我已经返回了数据,我想找到与持续时间相关的索引。 不幸的是,我不完全确定路由调用背后发生了什么,所以希望有一个简单的快速查找答案以及要使用的索引

为了简单起见,我将展示谷歌示例而不是我的代码并突出显示我正在寻找的内容

    public string PrintSolution()
        {
            // Inspect solution.
            string ret = "";
            long maxRoutedistance = 0;
            for (int i = 0; i < _data.Drivers; ++i)
            {
                ret += $"Route for Vehicle {i}:";
                ret += Environment.NewLine;
                long routedistance = 0;
                var index = _routing.Start(i);
                while (_routing.IsEnd(index) == false)
                {
                    ret += $"{_manager.IndexToNode((int) index)} -> ";

                    var prevIoUsIndex = index;
                    index = _solution.Value(_routing.Nextvar(index));
                    long legdistance = _routing.GetArcCostForVehicle(prevIoUsIndex,index,i);
                    //LOOKING FOR
                    //long legDuration = ??? what index am is using here to find in my duration matrix which is built the same as indexes as distance
                    ret += " leg distance: " + legdistance;
                    routedistance += legdistance;
                }

                ret += $"{_manager.IndexToNode((int) index)}";
                ret += Environment.NewLine;
                ret += $"distance of the route: {routedistance}m";
                ret += Environment.NewLine;
                ret += Environment.NewLine;
                maxRoutedistance = Math.Max(routedistance,maxRoutedistance);
            }

            ret += $"Maximum distance of the routes: {maxRoutedistance}m";
            ret += Environment.NewLine;
            return ret;
        }

@Mizux

解决方法

免责声明:这是一个简化,但应该有助于您理解。

在 OR-Tools Routing 中有一个没有名称的原始“隐藏”维度,但您可以使用 RoutingModel::GetArcCostForVehicle()

检索成本

对于任何“常规”维度,您都可以检查每个节点的 CumulVar。 例如假设您使用名称为“距离”和“持续时间”的 RoutingModel::AddDimension() 创建了两个维度。 注意:CumulVar 是一个累加器,所以如果你想要“弧成本”,你需要这样的东西 dim.CumulVar(next_index) - dim.CumulVar(index)

然后在您的 PrintFunction 中您可以使用:

public string PrintSolution()
{
  ...
  RoutingDimension distanceDimension = routing.GetMutableDimension("Distance");
  RoutingDimension durationDimension = routing.GetMutableDimension("Duration");
  for (int i = 0; i < _manager.getNumberOfVehicles(); ++i)
  {
    while (_routing.IsEnd(index) == false)
    {
      ...
      IntVar distanceVar = distanceDimension.CumulVar(index);
      IntVar durationVar = durationDimension.CumulVar(index);
      long distance = _solution.Value(distanceVar);
      long duration = _solution.Value(durationVar);
      ...
    }
  }
}