最新可用版本(
7.0-beta.1
)尚不支持将lambda表达式用作Transit回调函数的参数。然而,它是
committed to the code repository
将在下一版本中提供。
目前,在新版本发布之前,有两种可能的解决方案:
-
第一个解决方案是您可以下载
或者工具,然后在您的机器上编译它
those
instructions
用于从源安装。
-
第二种解决方案是将参数替换为
派生类来自
Google.OrTools.ConstraintSolver.LongLongToLong
如下:
LongLongToLong timeCallback = new TimeCallback(data, manager);
int transitCallbackIndex = routing.RegisterTransitCallback(timeCallback);
在哪里?
TimeCallback
类可以具有以下实现:
class TimeCallback : LongLongToLong
{
private long[,] timeMatrix;
private RoutingIndexManager indexManager;
public TimeCallback(DataModel data, RoutingIndexManager manager)
{
timeMatrix = data.GetTimeMatrix();
indexManager = manager;
}
override public long Run(long fromIndex, long toIndex)
{
// Convert from routing variable Index to time matrix NodeIndex.
int fromNode = indexManager.IndexToNode(fromIndex);
int toNode = indexManager.IndexToNode(toIndex);
return timeMatrix[fromNode, toNode];
}
}
注:
LongLongToLong timeCallback = new TimeCallback(Data, manager);
垃圾收集器可以销毁此对象,因为在C中,寄存器不能使其保持活动状态(注意:在final 7.0中,将使用委托和正确管理所有权对其进行更改)。为了避免GC,您必须拨打
GC.KeepAlive
上
时间回溯
对象后
SolveWithParameters
方法。
以下是使用上述方法的示例:
https://github.com/Muhammad-Altabba/workforce-distribution-sample/