调用SetArcCostEvaluatorOfAllVehicles函数遇CS1660错误,求解决方法
解决CS1660错误:正确设置OR-Tools路径成本
错误原因:
SetArcCostEvaluatorOfAllVehicles方法接收的参数是成本评估器的ID(int类型),而非直接传入lambda表达式。你直接传递lambda时,编译器会尝试将其转换为int类型,因此触发报错。正确实现步骤:
- 先通过
RegisterTransitCallback方法注册成本计算逻辑,该方法会返回一个int类型的评估器ID。 - 将这个ID传入
SetArcCostEvaluatorOfAllVehicles方法,完成所有车辆的路径成本设置。
- 先通过
修正后的代码:
// 注册成本评估逻辑,获取对应的评估器ID var costEvaluatorId = routing.RegisterTransitCallback((long fromIndex, long toIndex) => { int fromNode = manager.IndexToNode((int)fromIndex); int toNode = manager.IndexToNode((int)toIndex); return (long)distanciaMatriz[fromNode, toNode]; }); // 为所有车辆绑定该成本评估器 routing.SetArcCostEvaluatorOfAllVehicles(costEvaluatorId);
- 额外说明:
RegisterTransitCallback要求的委托类型是Func<long, long, long>,所以参数和返回值都需使用long类型(OR-Tools内部用long处理成本,避免数值溢出)。- 若你的
distanciaMatriz存储的是int类型,直接强制转换为long即可,无需反向转int,否则可能丢失精度或引发溢出问题。
内容的提问来源于stack exchange,提问作者Bruno Raphael Facundo
相关产品推荐
相关产品推荐

