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
相关产品推荐
相关产品推荐

