You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google OR-Tools:AddVariableMinimizedByFinalizer的TypeError问题求解

解决OR-Tools中AddVariableMinimizedByFinalizer的TypeError问题

这个问题我之前也碰到过!本质原因是你计算的duration是一个线性表达式(LinearExpr),但AddVariableMinimizedByFinalizer方法要求传入的必须是IntVar类型的变量,所以才会触发类型不匹配的错误。

要解决这个问题,你需要先创建一个显式的IntVar来存储两CumulVar的差值,再通过约束把这个变量和差值绑定,最后把变量传给方法。具体步骤如下:

修改后的代码实现

替换你原来的循环代码,改成下面这样:

for vehicle_id in range(data['num_vehicles']):
    # 1. 创建IntVar来存储当前车辆的执勤时长,范围匹配你的最大执勤时间约束
    duty_duration = routing.solver().IntVar(0, MAX_TIME_ON_DUTY, f"duty_duration_vehicle_{vehicle_id}")
    
    # 2. 添加约束:让这个变量等于车辆结束累积时间减去开始累积时间
    start_cumul = time_dimension.CumulVar(routing.Start(vehicle_id))
    end_cumul = time_dimension.CumulVar(routing.End(vehicle_id))
    routing.solver().Add(duty_duration == end_cumul - start_cumul)
    
    # 3. 将IntVar传入AddVariableMinimizedByFinalizer进行最小化
    routing.AddVariableMinimizedByFinalizer(duty_duration)

为什么这样有效?

  • routing.solver().IntVar()会创建一个可被求解器操作的整数变量,完全符合AddVariableMinimizedByFinalizer的参数要求
  • 通过Add(duty_duration == end_cumul - start_cumul)约束,把变量和你需要的差值绑定在一起,确保变量的值始终等于车辆的实际执勤时长
  • 因为你已经有duty_duration <= MAX_TIME_ON_DUTY的约束,所以设置IntVar的上界为MAX_TIME_ON_DUTY可以帮助求解器缩小搜索范围,提升运算效率

这样修改后,就能成功将每辆车的执勤时长加入到最终的最小化目标中了。

内容的提问来源于stack exchange,提问作者haudarren

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 20:32:51