Min-cost-max-flow с boost:: последовательный кратчайший путь неотрицательные веса

мне нужно рассчитать min-cost-max-flow для сети потока, используя

boost::successive_shortest_path_nonnegative_weights()

функция доступна в BGL (v 1_60_0). Как указано в документация,

направленный граф G=(V,E), представляющий сеть, должен быть дополнен, чтобы включить обратное ребро для каждого ребра в E. то есть входной граф должен быть Gin = (V, {E U ET}). [...] Capacityedgemap аргумент cap должен сопоставить каждое ребро в E положительное число, и каждое ребро в ET до 0. Весовая карта должна отображать каждое ребро от E до неотрицательного числа, а каждое ребро от ET-вес его обращенного ребра.

у меня есть простая функция, которая для каждого ребра, добавленного в график, добавляет обратное ребро с емкостью и весом, как указано выше:

void add_edge_and_reverse(vertex_desc& source, vertex_desc& target, Edge& edge, flow_network_t& fn, boost::associative_property_map<std::map<edge_desc, edge_desc>>& rev_map)
{
    std::pair<edge_desc, bool> e = boost::add_edge(source, target, edge, fn);
    Edge reverse_edge(-edge.cost, 0);
    std::pair<edge_desc, bool> e_rev = boost::add_edge(target, source, reverse_edge, fn);
    rev_map[e.first] = e_rev.first;
    rev_map[e_rev.first] = e.first;
}

Теперь график содержит обратные ребра, и они имеют отрицательные веса, что явно контрастирует с именем алгоритма, который я использую. В результате, когда я выполняю алгоритм, я получаю эту ошибку:

ValueError: The graph may not contain an edge with negative weight.

что я делаю не так?

1 ответов


просто столкнулся с такой же проблемой. Через несколько минут отладки я обнаружил проблему. Я использую тип float для Весов. Из-за этого модифицированный вес края (версия dijkstra для отрицательных Весов) может стать немного ниже 0 для числовой ошибки. Возможное решение может быть переписано " successive_shortest_path_nonnegative_weights.ГЭС", так что она округляет небольшие отрицательные значения