Генерация кеша быстрого пути для графа подключенных узлов - PullRequest
1 голос
/ 01 июня 2010

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

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

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

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


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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 02 июня 2010

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

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

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

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

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

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

0 голосов
/ 01 июня 2010

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

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

...