Google-ИЛИ: как установить минимальное ограничение с помощью измерения

#optimization #or-tools

Вопрос:

Согласно Google-ИЛИ doc: https://developers.google.com/optimization/reference/constraint_solver/routing/RoutingModel#AddDimension add dimension это позволяет только установить верхнюю границу чего-либо.

Я пытаюсь установить нижнюю границу расстояния до транспортного средства на маршруте в задаче пикапа и доставки (https://developers.google.com/optimization/routing/pickup_delivery). Я пытался:

 def negative_distance_callback (from_index, to_index):
    """
    return the negative distance, use for minimization
    """
    return -1 * distance_callback(from_index, to_index)
transit_neg_callback_index = routing.RegisterTransitCallback(negative_distance_callback)

dimension_name = 'Negative_Distance'
routing.AddDimension(
    transit_neg_callback_index,
    0,  # no slack
    -1000,  # vehicle minimum travel distance
    True,  # start cumul to zero
    dimension_name)
negative_distance_dimension = routing.GetDimensionOrDie(dimension_name)
negative_distance_dimension.SetGlobalSpanCostCoefficient(100)
 

Идея состоит в том, чтобы создать отрицательный обратный вызов на расстоянии и попытаться максимизировать его.

Однако я столкнулся с ошибкой: Check failed: min_capacity >= 0 (-1000 vs. 0)

Как я мог бы установить минимальное ограничение для проблемы PDP с Google-ИЛИ?

Большое спасибо

Ответ №1:

Найдите в списке рассылки. Это частый вопрос.

Короче говоря:

  • установление жесткого предела-плохая идея, так как это быстро приведет к неразрешимой проблеме.
  • лучшим решением является использование мягкой нижней границы переменной cumul в конце маршрута каждого транспортного средства.