OR-工具错误:无法将lambda表达式转换为类型“ ...”,因为它不是委托类型

时间:2019-01-31 12:35:10

标签: c# lambda or-tools

在尝试运行示例: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

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/