Предположим, у вас есть набор узлов. Некоторые узлы являются производителями, некоторые — потребителями, а некоторые — маршрутизаторами. Каждый узел имеет максимальную пропускную способность, которая определяет максимальное количество единиц, которые он может принять в день, а также максимальное количество единиц, которые он может отправить в день (в этом случае прием и отправка не мешают друг другу). Каждый узел также имеет емкость для хранения единиц, что позволяет им справляться с изменениями потока. Кроме того, каждый узел может иметь внешнее соединение не более чем с 8 соседними узлами (на плоскости), и такое же ограничение применяется к внутренним соединениям.
У меня уже есть эвристика, которая, учитывая граф, перечисляет узлы и достаточно хорошо выполняет работу по перемещению единиц к следующим узлам. Он перечисляет каждый узел, отправляя max(ceil(оставшиеся-отправляемые-единицы/оставшиеся-последующие-узлы), оставшиеся-получаемые-единицы-на-получателе) каждому целевому узлу.
Теперь мне нужен способ автоматически просматривать узел и решать, какой должна быть топология графа для достаточно хорошего потока. Моя основная идея заключалась в том, чтобы назначить каждому узлу «ответственность», изначально эквивалентную количеству потребляемых ими единиц. Тогда добавление ребра от n1 к n2 передало бы часть ответственности n2 перед n1. Но я быстро обнаружил, что разница между суммой, которую узел может потреблять, и суммой, которую узел может принять, сбивает с толку алгоритм и ведет меня по кругу.
редактировать Объем, потребляемый каждым производителем/потребителем, может меняться со временем (ниже определенного максимума), а узлы могут добавляться или удаляться.
Любые простые идеи?