Google OR-工具:AddVariableMinimizedByFinalizer TypeError

Google OR-Tools: AddVariableMinimizedByFinalizer TypeError

在我的车辆路径问题中,我试图最小化成本 objective 函数,同时还添加了额外的变量以最小化 routing.AddVariableMinimizedByFinalizer

然而,当我执行以下操作时,我得到一个 TypeError。从两个 CumulVar 创建一个 IntVar 的正确方法是什么,然后您可以将其传递给 AddVariableMinimizedByFinalizer

for i in range(data['num_vehicles']):
    duration = time_dimension.CumulVar(routing.End(vehicle_id)) - time_dimension.CumulVar(routing.Start(vehicle_id))
    routing.AddVariableMinimizedByFinalizer(duration)

错误是:

TypeError                                 Traceback (most recent call last)
<ipython-input-15-d27f070bd2ea> in <module>
      6 #         time_dimension.CumulVar(routing.End(i)))
      7     duration = time_dimension.CumulVar(routing.End(vehicle_id)) - time_dimension.CumulVar(routing.Start(vehicle_id))
----> 8     routing.AddVariableMinimizedByFinalizer(duration)

~/.local/lib/python3.8/site-packages/ortools/constraint_solver/pywrapcp.py in AddVariableMinimizedByFinalizer(self, var)
   3925     def AddVariableMinimizedByFinalizer(self, var: "IntVar") -> "void":
   3926         r""" Adds a variable to minimize in the solution finalizer. The solution finalizer is called each time a solution is found during the search and allows to instantiate secondary variables (such as dimension cumul variables)."""
-> 3927         return _pywrapcp.RoutingModel_AddVariableMinimizedByFinalizer(self, var)
   3928 
   3929     def AddVariableMaximizedByFinalizer(self, var: "IntVar") -> "void":

TypeError: in method 'RoutingModel_AddVariableMinimizedByFinalizer', argument 2 of type 'operations_research::IntVar *'

对于其他上下文,这是我在我的代码中设置时间 windows 的方式:

# Create and register a time callback.
def time_callback(from_index, to_index):
    """Returns the travel time between two nodes."""
    ...
    return transit_time

time_callback_index = routing.RegisterTransitCallback(time_callback)

# Add time windows constraint.
routing.AddDimension(
    time_callback_index,
    10 * MIN_PER_HR * SEC_PER_MIN,  # allow waiting time
    24 * MIN_PER_HR * SEC_PER_MIN,  # maximum time per vehicle
    False,  # Don't force start cumul to zero.
    'Time')
time_dimension = routing.GetDimensionOrDie('Time')

# Add time window constraints for each location.
for location_idx, time_window in enumerate(data['time_windows']):
    index = manager.NodeToIndex(location_idx)
    time_dimension.CumulVar(index).SetRange(time_window[0], time_window[1])
    
for vehicle_id in range(data['num_vehicles']):
    # Limit max on-duty time for each vehicle
    routing.solver().Add(
        time_dimension.CumulVar(routing.End(vehicle_id)) - time_dimension.CumulVar(routing.Start(vehicle_id)) <= MAX_TIME_ON_DUTY)

为什么不直接使用以下代码呢?

routing.AddVariableMaximizedByFinalizer(
  time_dimension.CumulVar(routing.Start(i)))
routing.AddVariableMinimizedByFinalizer(
  time_dimension.CumulVar(routing.End(i)))

这里你的 duration 对象是一个表达式...