Проблема поведения флокирования boids - PullRequest
8 голосов
/ 02 июня 2011

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

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

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

  1. Выравнивание
  2. Сплоченность
  3. Разделение
  4. Ограничение скорости

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

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

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

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

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

Ответы [ 4 ]

11 голосов
/ 30 августа 2011

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

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

Веселитесь!

2 голосов
/ 02 июня 2011

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

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

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

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

1 голос
/ 18 июля 2011

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

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

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

0 голосов
/ 30 декабря 2011

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

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

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

...