Инструменты ИЛИ: добавление измерения на основе накопления другого измерения в python (в частности, затраты на транспортное средство за каждые 24 часа использования)

Я хочу добавить постоянную стоимость за каждые 24 часа использования транспортного средства (с использованием версии OR-tools для Python). Я понятия не имею, как к этому подойти.


person Tigris    schedule 15.07.2020    source источник


Ответы (1)


Я получил идею решения этой проблемы от Джеймса Э. Марка (ссылка: https://groups.google.com/g/or-tools-discuss/c/zEZ8PaMsV6g/m/W5KwdQN3AAAJ)

Как вы обнаружили, вы не можете использовать зависимые измерения в python.

Я бы предложил создать явное измерение ежедневных затрат. Обычные узлы добавляют ноль к измерению стоимости, но создают фиктивный узел конца дня, по одному в день на транспортное средство, что увеличивает ваши ежедневные затраты. Поэтому обработайте эту логику в функции обратного вызова (проверьте тип узла, если не узел на конец дня, верните ноль, в противном случае верните дневную стоимость).

Затем добавьте все узлы конца дня к минимизации решателя с помощью вызова routing.AddVariableMinimizedByFinalizer (daily_cost_dimension.CumulVar (day_i_vehicle_j_index))

Может быть, это указывает вам правильное направление?

[Позднее сообщение]

Я как раз думал о пункте 1. Я не думаю, что вам нужно использовать измерение дополнительных затрат, скорее вы можете просто объединиться с тем, что у вас уже есть, минимизировать модель (расстояние или время).

Я имею в виду создание дневного узла, как я описал (по одному на транспортное средство в день), позволяя им отбрасывать (дизъюнкция нуля), но требовать их посещения, если измерение времени для транспортного средства больше, чем кратное 24 часам. . Затем сделайте расстояние до ежедневного узла равным дополнительным дневным затратам, которые вы хотите понести.

Так, например, в стандартных примерах у вас есть это:

    def create_data_model():
"""Stores the data for the problem."""
data = {}
data['distance_matrix'] = [
...
# set distance from all nodes to dummy end-of-day nodes as daily cost
]

...

# Instantiate the data problem.
data = create_data_model()

def distance_callback(from_index, to_index):
"""Returns the distance between the two nodes."""
# Convert from routing variable Index to distance matrix NodeIndex.
from_node = manager.IndexToNode(from_index)
to_node = manager.IndexToNode(to_index)
#
# this next line will correctly add "cost" of visiting end-of-day nodes
# if the data was set up correctly earlier
#
return data['distance_matrix'][from_node][to_node]

transit_callback_index = routing.RegisterTransitCallback(distance_callback)
routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index) 
person Tigris    schedule 07.10.2020