2D пространственная структура данных, подходящая для Flocking Boids в Java

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

Что бы я ни делал, я реализую себя с нуля на Java. Таким образом, я узнаю больше о выбранной структуре данных, чем если бы я просто вызывал кучу библиотечных функций.

Мне известны R-Trees, деревья kd и Quadtrees. Все возможные варианты, на мой взгляд. Но у меня нет опыта работы с этими структурами данных, и я не совсем уверен, что лучше всего подходит для моей цели. Мне ничего не нужно на этот масштаб - Я говорю, может быть, несколько сотен Boids, возможно, не более одной тысячи, а чем миллион, хотя имейте в виду, что в конечном итоге я могу запустить его на телефоне Android.

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

Да, я видел этот вопрос. Нет, ответ меня не устраивает - аргументация вообще не приводится.

О, и еще одно — как следует из названия, это строго только для двух измерений.


person Iskar Jarak    schedule 15.01.2012    source источник


Ответы (3)


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

person Bill    schedule 15.01.2012
comment
Я согласен, что это было бы здорово для практического подхода к изучению поведения каждой структуры данных, но я бы предпочел не реализовывать три (или более) структуры данных, когда я уверен, что есть веские теоретические причины, чтобы выбрать одну из них. остальные для этого. - person Iskar Jarak; 16.01.2012

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

https://gamedevelopment.tutsplus.com/tutorials/quick-tip-use-quadtrees-to-detect-likely-collisions-in-2d-space--gamedev-374

person Desmond Vehar    schedule 07.09.2019

Девять лет слишком поздно, чтобы помочь Iskar Jarak, но я вмешаюсь, так как другие могут найти этот старый вопрос в поиске.

Ключевым моментом является то, что почти все лучше, чем наивный подход O(n²), рассматривающий каждую пару boids. Итак, как предполагает Искар, любая пространственная структура данных на основе дерева является значительным улучшением, поскольку в основном составляет O(n log n). То есть: каждый из n boids должен искать своих соседей, каждый из которых равен O(log n).

Следует отметить, что «обнаружение попаданий», упомянутое Десмондом Вехаром, представляет собой немного другую проблему. расположить «внутри» любого из «объектов» в моей структуре данных?» В многоагентных симуляциях мы хотим найти несколько соседей. Иногда «ближайшие N соседей» или, возможно, «все соседи в пределах заданного радиуса позиции запроса». Обычно достаточно описать боид как его центральную точку и отфильтровать по расстоянию между точками, создав «сферу запроса».

В своих курсах по алгоритмам Тим Рафгарден постоянно спрашивает: «Можем ли мы сделать лучше?» И в самом деле, хотя O(log n) лучше, чем O(n) для поиска соседа, лучшим является поиск за постоянное время, O(1). Здесь хеш-таблицы (они же несортированные карты) — наши друзья.

Эти две идеи, множественные соседи и хеширование, приводят к хорошему подходу для ускорения многоагентного моделирования: пространственное хеширование в воксели(/boxes/lattices). Каждый воксель содержит набор boids/агентов. Непрерывное пространственное положение (обычно 2 или 3 числа с плавающей запятой) агента преобразуется в координаты вокселя (2 или 3 целых числа с помощью масштабированной операции «пола»), которые хешируются вместе для получения «идентификатора вокселя», который используется в качестве ключ в хеш-таблице вокселей. Таким образом, в постоянном времени O(1), подобно ссылке на массив, вы можете найти воксель, который содержит коллекцию всех агентов, находящихся в настоящее время в одном и том же вокселе. «Сфера запроса» обычно перекрывает несколько вокселей. Их можно найти, сместив точку запроса на расстояние, кратное расстоянию между вокселами. Содержимое этих нескольких вокселей объединяется вместе, чтобы сформировать набор потенциальных соседей, а затем фильтруется по расстоянию. По мере перемещения агенты/боиды сравнивают свой старый и новый «идентификатор вокселя» и, если они не совпадают, удаляют себя из структуры данных, а затем снова вставляются в новую позицию.

Сфера запроса в воксельном пространстве: введите здесь описание изображения

Ресурсы:

Существует примерно миллион типов «пространственной структуры данных»/«пространственной базы данных». См. эту статью в Википедии для опроса: Пространственная база данных. См. также ранние работы Ханана Самета: Hierarchical Spatial Data Structures, 1989 г. и Пространственные структуры данных 1995 года.

В моей собственной работе в начале 2000-х я использовал коллекцию вокселей фиксированного размера, адресуемую координатами i,j,k: Взаимодействие с группами автономных персонажей в 2000 году и Big Fast Crowds на PS3 в 2006 году. Позднее я переключился на использование подхода «пространственного хэширования в воксели», который не требует априорного указания размеров трехмерной воксельной сетки и не имеет накладных расходов на разреженное распределение агентов с множеством пустых вокселей.

person Craig Reynolds    schedule 24.06.2021