Генерация кэша быстрого пути для подключенного графа узлов

Я пытаюсь внедрить более быстрый механизм поиска пути в игре, над которой я работаю для графа подключенных узлов. Узлы подразделяются на два типа: «сети» и «маршрутизаторы».


На этом рисунке синие кружки представляют маршрутизаторы, а серые прямоугольники — сети.

Каждая сеть хранит список маршрутизаторов, к которым она подключена, и наоборот. Маршрутизаторы не могут напрямую подключаться к другим маршрутизаторам, а сети не могут напрямую подключаться к другим сетям.


Список сетей, к которым они подключены



Маршрутизаторы делают то же самое

Мне нужно получить алгоритм, который наметит путь, измеряемый количеством пересекаемых сетей, для каждой возможной исходной и конечной сети, исключая пути, в которых источник и место назначения являются одной и той же сетью. У меня есть один прямо сейчас, однако он неприемлемо медленный, для сопоставления путей требуется около двух секунд, что становится невероятно заметным для всех подключенных игроков.

Текущий алгоритм представляет собой поиск в глубину методом грубой силы (он был собран примерно за час, чтобы просто заставить работать кэширование пути), который возвращает массив сетей в порядке их обхода, что объясняет, почему он такой медленный. Существуют ли более эффективные алгоритмы?

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

Какой подход/алгоритм, скорее всего, даст наилучшие результаты для этого типа графика?


person Sukasa    schedule 01.06.2010    source источник
comment
При необходимости я могу предоставить код, используемый для создания кеша на момент вопроса.   -  person Sukasa    schedule 01.06.2010


Ответы (2)


Алгоритм кратчайшего пути Дейкстры является классическим, но предназначен только для статических графов.

Вы можете попробовать поискать в Интернете динамические алгоритмы кратчайшего прошлого.

Вот один документ, который кажется актуальным: http://www.utdallas.edu/~edsha/papers/bin/Globecom04_SPT.pdf (и может дать вам другие зацепки).

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

Я предлагаю вам также взглянуть на алгоритмы маршрутизации в целом, так как выбор кратчайшего пути всегда может вызвать перегрузку и т. д. (Я думаю, 16 команд Halo!). Вы также можете включить балансировку нагрузки и т. Д.

Надеюсь, поможет.

person Community    schedule 02.06.2010
comment
В контексте сети уровни трафика и т. д. не имеют значения, поскольку это всего лишь простая имитация высокого уровня. Игра написана на языке, скомпилированном в байт-код, а затем интерпретированном, поэтому функции должны быть относительно легкими (и код, который перемещает пути из одной сети в другую, настолько эффективен, насколько это возможно без удаления функциональности). Пока я могу быстро построить любой допустимый путь или быстро определить, что такого пути не существует (или какой-то компромисс из двух), я счастлив. - person Sukasa; 03.06.2010
comment
@Sukasa: Тогда вам может пригодиться разбиение графа на двусвязные компоненты. - person ; 03.06.2010
comment
@Moron, не могли бы вы дать немного больше информации? Статья в Википедии о них оставляет меня немного неуверенным - person Sukasa; 03.06.2010
comment
@Sukasa: компонент двусвязности (или 2-связности) — это граф, в котором между каждой парой вершин есть как минимум два непересекающихся пути. Поэтому, если вы разделите свой граф на 2 связанных компонента, а затем найдете «пограничные» сети/маршрутизаторы, это может немного ускорить работу. Например, чтобы добраться от компонента A до C, вам, возможно, придется пройти через компонент B, если вы знаете краевые соединители, то вы сможете быстро найти путь. Потребуется как минимум 2 удаления ребер, прежде чем вам (возможно) потребуется выполнить какое-то переназначение. Это была просто идея, которая, я думаю, может быть вам полезна. - person ; 03.06.2010
comment
@Sukasa: Кроме того, вы можете найти полезным раздел «Другие алгоритмы» на en.wikipedia.org/wiki/Biconnected_component, в котором рассказывается об алгоритме динамических двусвязных компонентов (от Уэстбрука и Тарьяна). - person ; 03.06.2010

Вы могли бы хотеть посмотреть в классическом сетевом домене. Это не точный ответ, но он должен дать вам отправную точку для алгоритмов «лучше, чем грубая сила».

http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

person jcsf    schedule 01.06.2010