or-tools, устанавливающие индивидуальную стоимость чайной ложки

Я работаю над проектом, в процессе которого необходимо решить TSP. Для этого я нашел or-tools. как я понял, or-tools для tsp использует расстояние как стоимость, это означает, что стоимость проезда между любыми двумя местоположениями - это просто расстояние между ними. Мне нужно установить свои затраты вручную, так как я хочу, чтобы на стоимость влияли некоторые другие факторы, а не только расстояние. это код, который устанавливает стоимость TSP в or-tools.

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)
    return data['distance_matrix'][from_node][to_node]

transit_callback_index = routing.RegisterTransitCallback(distance_callback)
routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index)

У меня есть 2 вопроса по этому коду:
1- distance_callback - это функция. почему функция вызывается без параметров в routing.RegisterTransitCallback(distance_callback)?
2- Как я могу изменить этот код, чтобы установить свою индивидуальную стоимость?

У меня есть матрица моих индивидуальных затрат, и я попытался заменить return data['distance_matrix'][from_node][to_node] моей собственной матрицей return data['cost_matrix'][from_node][to_node], но это не сработало должным образом.


person shabnam Aghaei    schedule 21.07.2020    source источник


Ответы (2)


  1. Этот обратный вызов будет вызываться библиотекой C ++, пакет python - это собственный пакет, который обертывает библиотеку C ++ с помощью SWIG.

  2. технически решателю нужно только зарегистрировать функцию (или лямбда), принимающую два параметра (int64 from_index, int64 to_index) и возвращающую целое число (int64).

  3. Хорошая отправная точка

cost_callback_indices = []
for vehicle_idx in range(data['vehicle_number']):
    def vehicle_cost_callback(from_index, to_index, i=vehicle_idx):
        from_node = manager.IndexToNode(from_index)
        to_node = manager.IndexToNode(to_index)
        return data['distance_matrix'][i][from_node][to_node]
    cost_callback_index = routing.RegisterTransitCallback(vehicle_cost_callback)
    cost_callback_indices.append(cost_callback_index)
    routing.SetArcCostEvaluatorOfVehicle(cost_callback_index, vehicle_idx)

см. https://github.com/google/or-tools/issues/1795#issue-540774218

person Mizux    schedule 23.07.2020