代码之家  ›  专栏  ›  技术社区  ›  Muhammad Altabba

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

  •  0
  • Muhammad Altabba  · 技术社区  · 5 年前

    尝试运行示例时: 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_uuu functiont_long_long_flong_long_long_long_long_t'因为 它不是委托类型

    我使用的是最新版本: 7.0-beta.1

    1 回复  |  直到 5 年前
        1
  •  1
  •   Muhammad Altabba    5 年前

    最新可用版本( 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/