Что такое хорошая локальная эвристика для динамического управления потоком дискретных узлов? - PullRequest
0 голосов
/ 25 апреля 2009

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

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

Теперь мне нужен способ автоматически просмотреть узел и решить, какой должна быть топология графа, чтобы обеспечить достаточно хороший поток. Моя основная идея состояла в том, чтобы назначить «ответственность» для каждого узла, первоначально эквивалентную тому, сколько единиц они потребляли. Тогда добавление ребра из n1 в n2 дало бы часть ответственности n2 перед n1. Но я быстро обнаружил, что разница между количеством, которое может потреблять узел, и количеством, которое может принять узел, запутала алгоритм и привела меня в круги.

редактировать Количество, потребляемое каждым производителем / потребителем, может изменяться со временем (ниже некоторого максимума), и узлы могут быть добавлены или удалены.

Какие-нибудь простые идеи?

1 Ответ

0 голосов
/ 25 апреля 2009

Если вы ищете «устойчивое» решение, то есть решение, в котором один и тот же поток происходит вдоль заданного ребра каждый день, то не может быть никакого «накопления» ресурсов в узлах (поскольку это подразумевает, что каждый запас продолжает расти с постоянной скоростью, в конечном итоге становясь бесконечно большим).

Таким образом, в этом случае мы можем забыть о емкости хранилища каждого узла, и проблема очень похожа на проблему Максимальный поток , которая может быть решена точно в полиноме время, без особых сложностей. Ссылка на Википедию предлагает множество алгоритмов - я предлагаю начать с Ford-Fulkerson, который не слишком сложен для реализации (другие могут быть проще, но я сам их не реализовал).

Чтобы действительно превратить вашу проблему в проблему Max Flow, вам нужно сделать одну вещь: Max Flow имеет дело с ограничениями на потоки по краям , а не в узлах . Чтобы преобразовать ваши ограничения «пропускной способности узла» в ограничения «пропускной способности ребра», просто превратите каждый узел в 3 узла, соединенных в линию (1 -> 2 -> 3), причем ребро между узлами 1 и 2 имеет емкость, равную « входная емкость "узла", а ребро между узлами 2 и 3 имеет емкость, равную "выходной емкости" узла. Затем убедитесь, что все входы в узел подключены к узлу 1, а все выходы подключены к узлу 3.

Как я уже сказал, это даст вам "устойчивое" решение. возможно возможно, что, указав заранее количество дней и используя емкость хранилища, вы сможете разработать стратегию, которая даст вам большую пропускную способность для этого количества дней, хотя я подозреваю, что кто-то умнее меня может доказать, что даже это невозможно. В любом случае, вы не можете добиться большего успеха, чем решение Max Flow, если хотите, чтобы каждый поток имел одинаковый поток каждый день.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...