在尝试运行示例:VrpTimeWindows中的Google OR-Tools时,以下代码块会产生错误:
int transitCallbackIndex = routing.RegisterTransitCallback(
(long fromIndex, long toIndex) => {
// Convert from routing variable Index to time matrix NodeIndex.
var fromNode = manager.IndexToNode(fromIndex);
var toNode = manager.IndexToNode(toIndex);
return data.GetTimeMatrix()[fromNode, toNode]; }
);
错误CS1660:无法将lambda表达式转换为类型 'SWIGTYPE_p_std__functionT_long_long_flong_long_long_longF_t'因为 它不是委托类型
我正在使用可用的最新版本:7.0-beta.1
答案 0 :(得分:2)
最新的可用版本(7.0-beta.1)尚不支持将lambda表达式用作转接回调函数的参数。但是,它是committed to the code repository,将在下一版本中提供。
目前,在有新版本发布之前,有两种可能的解决方案:
第一个解决方案是您可以下载最新版本的 OR-Tools,然后按照those instructions在您的计算机上进行编译,以从Source安装。
第二种解决方案是将参数替换为的实例
从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#中保持活动状态(注意:在最终的7.0中,将使用委托并正确管理所有权对此进行更改)。为了避免GC,您必须在GC.KeepAlive
方法之后在TimeCallback
对象上调用SolveWithParameters
。
以下是使用以上示例的示例:https://github.com/Muhammad-Altabba/workforce-distribution-sample/