Я использовал небольшой python script, который я написал, чтобы управлять долгом среди моих соседей по комнате. Это работает, но есть некоторые недостающие функции, одна из которых упрощает излишне сложные структуры долга. Например, если следующий взвешенный ориентированный граф представляет некоторых людей, а стрелки представляют собой долги между ними (Алиса должна Бобу 20 долларов США и Чарли 5 долларов, Боб должен Чарли 10 долларов США и т.д.):
Ясно, что этот график следует упростить до следующего графика:
Нет смысла в 10 долларов, начиная от Алисы до Боба, а затем от Боба до Чарли, если Алиса может просто передать его Чарли напрямую.
В общем случае целью является взятие графа долга и его упрощение (т.е. создание нового графика с теми же узлами, но с разными краями), так что
- Нет node имеет ребра, указывающие как внутри, так и снаружи (без бесполезных смены денег)
- Все узлы имеют одинаковый "поток" через них, как и в исходном графике (он идентичен в терминах, где деньги заканчиваются).
Под "потоком" подразумевается значение всех входов минус все выходы (есть ли для этого технический термин? Я не эксперт по теории графов). Таким образом, в приведенном выше примере значения потока для каждого node:
- Боб: +10
- Алиса: -25
- Чарли: +15
Вы можете видеть, что первый и второй графики имеют один и тот же поток через каждый node, поэтому это хорошее решение. Есть и другие простые случаи, например, любой цикл может быть упрощен путем удаления наименьшего значащего края и вычитания его значения из всех других ребер.
Это:
следует упростить:
Я не могу себе представить, что никто не изучил эту проблему; Я просто не знаю, какие условия искать, чтобы найти информацию об этом (опять же, не эксперт по теории графов). Я искал несколько часов безрезультатно, поэтому мой вопрос таков: что такое алгоритм, который приведет к упрощению (новый график) в соответствии с условиями, указанными выше для любого взвешенного ориентированного графа?