问题描述
我有两个矩阵,持续时间和距离是通过调用 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);
...
}
}
}