Python带容量约束VRP:addVariableMinimizedFinalizer()最小化总距离用法
OR-Tools VRP中
addVariableMinimizedFinalizer()使用指南 方法核心逻辑
很多人容易误解这个方法的入参要求——它不是让你传自己定义的Python普通变量,而是要传OR-Tools路由框架内部的求解变量句柄,作用是告诉求解器“我要把这个变量的值尽可能压到最小”。做带容量约束的VRP时,我们需要传入的变量,就是从距离维度里提取的、代表所有车辆路径总行驶距离的全局累计变量。
代码插入位置
需要把该方法的调用逻辑放在距离维度创建完成、成功获取distance_dimension实例之后,调用求解器执行求解之前,不能提前插到维度创建流程的前面,否则会触发维度不存在的报错。
具体代码实现
# 你已经写好的距离维度创建逻辑 dimension_name = 'Distance' routing.AddDimension( transit_callback_index, 0, 3000, True, dimension_name) distance_dimension = routing.GetDimensionOrDie(dimension_name) # 新增的目标绑定逻辑 # 从距离维度获取全局总距离变量 total_distance_var = distance_dimension.GetGlobalCumulVar( routing.GetEndIndex(routing.Start(0)) ) # 注册为需要最小化的优化目标 routing.AddVariableMinimizedFinalizer(total_distance_var)
实现细节说明
- 调用
GetGlobalCumulVar()时,只需要传入任意一辆车的终点索引,框架会自动把所有车辆的路径累计距离做求和,绑定为全局总距离变量,完全不需要你手动遍历所有车辆做距离累加 - 绑定完成后,求解器会自动把最小化全车队总距离作为优化目标,和你设置的容量约束、车辆最大行驶里程约束等规则互不冲突
常见踩坑提示
- 不要把其他维度(比如容量维度)的变量传入这个方法,否则会出现优化目标和预期不匹配的问题
- 这个方法的调用不需要在容量维度创建之后,只要距离维度已经初始化完成就可以调用,顺序没有强制要求
内容的提问来源于stack exchange,提问作者Marco Varalda
相关产品推荐
相关产品推荐

