Проблема поведения флокирования boids

Вчера я натолкнулся на Boids Крейга Рейнольдса и впоследствии решил, что я бы хотел внедрить простую 2D-версию в Java. Я собрал довольно простую схему, основанную на заметках Конрада Паркера.

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

В настоящее время я реализовал:

  1. центровка
  2. когезия
  3. разделение
  4. Ограничение скорости

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

На мой взгляд, это может быть:

  1. Следствие параметров, которые я использую (сейчас мой код такой, как описан в псевдокоде Паркера; я еще не пробовал области влияния, определяемые углом и радиусом, как описано Рейнольдсом.)
  2. Что-то, что мне нужно реализовать, но я не в курсе.
  3. Что-то я делаю не так.

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

Кто-нибудь сталкивался с этим раньше? Есть идеи по поводу причины и / или как это исправить? Я могу опубликовать.gif рассматриваемого поведения, если это поможет.

4 ответа

Решение

Возможно, ваш вес для правила разделения слишком силен, из-за чего все буды отодвигаются как можно дальше от всех соседних бидов. В моем псевдокоде есть различные константы, которые действуют как веса: /100 в правиле 1 и /8 в правиле 3 (и неявная *1 в правиле 2); они могут быть изменены, что часто полезно для моделирования различных видов поведения, таких как близко роящиеся насекомые или скользящие птицы.

Также произвольное | расстояние | < 100 в правиле разделения должно быть изменено, чтобы соответствовать единицам вашего моделирования; это правило должно применяться только к боидам в непосредственной близости, в основном, чтобы избежать столкновений.

Повеселись!

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

И если они распределены случайным образом, он будет близок к нулю.

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

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

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

def set_velocity(self, dxdy):
    self.velocity = (self.velocity[0] + dxdy[0], self.velocity[1] + dxdy[1])

где скорость и dxdy - 2 кортежа.

Интересно, есть ли у вас проблемы с прямоугольниками столкновения? Если вы реализовали что-то на основе перекрывающихся прямоугольников (например, вот так), вы можете получить описанное вами поведение, когда два прямоугольника находятся достаточно близко, чтобы любое движение заставляло их пересекаться. (Или даже хуже, если один прямоугольник может полностью оказаться внутри другого.)

Одним из решений этой проблемы является обеспечение того, чтобы каждая штанга смотрела только вперед. Тогда вы избегаете ситуации, когда A не может двигаться, потому что B слишком близко впереди, но B не может двигаться, потому что A слишком близко позади.

Быстрая проверка состоит в том, чтобы фактически нарисовать все ваши прямоугольники столкновения и покрасить любые пересекающиеся из них другим цветом. Это часто дает ключ к пониманию причины остановки и подергивания.

Другие вопросы по тегам