Boids: як 3 прості правила створюють поведінку зграї

Хмара шпаків, косяк риб, рій бджіл — здається, що ними керує якийсь центральний розум. Це не так. Кожна окрема особина дотримується тих самих трьох локальних правил, а зграя виникає знизу вгору.

Крейг Рейнольдс і народження Boids

У 1986 році дослідник комп'ютерної графіки Крейг Рейнольдс поставив собі за мету анімувати зграю птахів для фільму. Замість того, щоб вручну анімувати кожного птаха чи писати скрипт, який керує їхніми позиціями, він поставив інше запитання: яких правил насправді дотримується кожен окремий птах?

Результат він опублікував у 1987 році в статті SIGGRAPH під назвою «Flocks, Herds, and Schools: A Distributed Behavioral Model» («Зграї, череди та косяки: розподілена поведінкова модель»). Симульовані агенти отримали назву Boids — скорочення від «bird-oid objects» («птахоподібні об'єкти»). Стаття стала однією з найцитованіших робіт у комп'ютерній графіці, а описаний у ній алгоритм використовується й досі, майже чотири десятиліття потому.

Глибоке відкриття полягало ось у чому: для отримання складної скоординованої поведінки не потрібні складні правила координації. Трьох простих локальних правил достатньо, щоб згенерувати реалістичну на вигляд поведінку зграї з будь-якої кількості незалежних агентів.

Три правила

Кожен boid дивиться на своїх сусідів у межах радіуса сприйняття і одночасно застосовує три керівні сили:

Правило 1: Розділення

Уникати сусідів, що надто близько.

Для кожного boid знаходять усіх сусідів у межах радіуса «надто близько» (зазвичай меншого за радіус сприйняття). Обчислюється вектор відштовхування, спрямований від кожного такого сусіда, зважений за близькістю — ближчі сусіди штовхають сильніше. Ці вектори підсумовуються, утворюючи керівну силу розділення.

Без розділення boids колапсують в одну точку. Лише з розділенням boids безмежно віддаляються один від одного. Правило підтримує особистий простір і не дає зграї стискатися в нереалістичну щільну масу.

Правило 2: Вирівнювання

Рухатися відповідно до середнього напрямку сусідів поруч.

Кожен boid обчислює середній вектор швидкості всіх boids у межах свого радіуса сприйняття. Потім він скеровує власну швидкість до цього середнього значення. Керівна сила пропорційна різниці між поточною швидкістю і цільовим середнім.

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

Правило 3: Згуртованість

Рухатися до середньої позиції сусідів поруч.

Кожен boid обчислює центр мас видимих сусідів і плавно рухається до нього. Саме це правило утримує зграю разом — без згуртованості розділення й вирівнювання породжують дрейфуючі маленькі групи, які ніколи не зливаються.

Ці три сили підсумовуються і зважуються, утворюючи фінальний керівний вектор кожного boid на кожному кроці за часом. Відносні ваги — головні параметри налаштування, спробуйте поекспериментувати з ними самостійно в симуляції на /boids/.

Реалізація правил у коді

Базовий цикл оновлення для одного boid виглядає так:

for each boid b:
    neighbours = find_neighbours(b, perception_radius)

    sep = separation_force(b, neighbours)
    ali = alignment_force(b, neighbours)
    coh = cohesion_force(b, neighbours)

    b.velocity += sep * w_sep
                + ali * w_ali
                + coh * w_coh

    b.velocity = clamp(b.velocity, max_speed)
    b.position += b.velocity * dt

Простота вражає. Жодного центрального контролера, жодного обміну повідомленнями, жодного глобального стану. Кожен boid знає лише про свою безпосередню околицю. Проте запустіть це для 500 boids — і ви отримаєте поведінку, яку не відрізнити від справжньої хмари шпаків.

Емерджентна складність із локальних правил

Філософське значення Boids виходить далеко за межі анімації. Це продемонструвало загальний принцип, нині центральний для науки про складність: емерджентність — появу крупномасштабних патернів із дрібномасштабних взаємодій без жодного управління згори.

Зграя не запрограмована. Зграя і є колективною поведінкою особин, що дотримуються локальних правил. У коді жодного окремого boid неможливо знайти «зграю». Вона існує лише на рівні сукупності.

Цей самий принцип виявляється в природі й науці всюди:

Налаштування параметрів

Класична модель Boids має кілька параметрів налаштування, які кардинально змінюють характер зграї:

Застосування поза анімацією

Первісна мета Рейнольдса полягала в анімації для кіно, і Boids використовувався у незліченних постановках — рої кажанів у «Бетмен повертається», стадо гну в «Королі Леві» та багато інших. Але застосування нині виходять далеко за межі розваг.

Робототехніка та рої дронів — мабуть, найпряміше застосування. Багатороботові системи на складах, формації військових БПЛА та флоти рятувальних дронів спираються на ті самі принципи розподіленого зграйного руху. Кожен робот приймає незалежні рішення на основі локальних сенсорних даних; скоординована поведінка виникає без централізованої координації.

Алгоритми оптимізації, натхненні Boids, включають оптимізацію рою частинок (Particle Swarm Optimisation, PSO), де популяція кандидатних розв'язків рухається простором пошуку, використовуючи аналоги розділення, вирівнювання та згуртованості. PSO конкурує з генетичними алгоритмами для задач неперервної оптимізації і має перевагу у вигляді дуже малої кількості гіперпараметрів для налаштування.

Симуляція дорожнього руху використовує похідні Boids моделі для динаміки пішохідних натовпів — евакуацій, фестивальних натовпів, виходу зі стадіонів. Парадигма «особина слідує локальним правилам» природно відтворює те, як люди орієнтуються в натовпі.

Ігровий ШІ — від переміщення юнітів у RTS до поведінки натовпу NPC та косяків риб у підводних дослідницьких іграх — значною мірою спирається на алгоритми зграйного руху, похідні від оригінальної роботи Рейнольдса.

Розширення Boids

Оригінальна модель із трьома правилами — лише відправна точка. Дослідники та розробники додали безліч розширень:

Часті запитання

Що таке Boids?

Boids — це симуляція штучного життя, створена Крейгом Рейнольдсом у 1986 році, яка моделює поведінку зграй птахів, косяків риб і череди тварин. Кожен «boid» (об'єкт «птахоподібного» типу) дотримується трьох простих правил — розділення, вирівнювання і згуртованості — які разом породжують реалістичну емерджентну поведінку рою.

Які три правила Boids?

Три основні правила Boids: розділення (уникати сусідів, що надто близько, щоб запобігти зіткненням), вирівнювання (рухатися відповідно до середнього напрямку сусідів поруч) і згуртованість (рухатися до середньої позиції сусідів поруч, залишаючись із групою). Цих трьох правил достатньо, щоб отримати правдоподібну поведінку зграї.

Що таке емерджентна поведінка?

Емерджентна поведінка — це складна, скоординована групова поведінка, що виникає із простих індивідуальних правил без будь-якого централізованого управління чи плану. У Boids жоден окремий boid не знає форми зграї — патерн зграї виникає автоматично, коли кожен агент незалежно дотримується трьох локальних правил.

Як радіус сприйняття впливає на поведінку зграї?

Радіус сприйняття визначає, як далеко кожен boid може «бачити» своїх сусідів. Занадто малий радіус спричиняє фрагментовані малі скупчення; занадто великий — усі boids поводяться як одна жорстка маса. Проміжний радіус породжує каскадний, хвилеподібний рух, характерний для природних хмар шпаків.

Чи можна використовувати Boids для реальних застосувань?

Так. Boids і споріднені алгоритми використовуються в анімації та кіно для симуляції натовпу, у робототехніці для координації роїв, в ігровому ШІ для групового руху, у моделюванні дорожнього руху й навіть для вивчення реальної колективної поведінки тварин. Алгоритм продемонстрував, що складний колективний інтелект не потребує центрального контролера.

У чому різниця між Boids і клітинними автоматами?

Boids — це агенти в неперервному просторі з векторами швидкості, що рухаються у 2D- чи 3D-просторі, дотримуючись локальних правил щодо сусідів. Клітинні автомати працюють на дискретній сітці, де кожна клітинка оновлюється на основі станів своїх фіксованих сусідів по сітці. Обидва породжують емерджентні патерни з локальних правил, але Boids моделюють мобільних агентів, тоді як КА моделюють просторові патерни станів.

Як додати уникнення перешкод до Boids?

Уникнення перешкод додає четверту керівну силу, що відштовхує boids від статичних перешкод. Boids можуть випускати промені вперед для виявлення перешкод і застосовувати зважену силу відштовхування, перпендикулярну до поверхні перешкоди. Вага відштовхування зазвичай масштабується за близькістю, зростаючи в міру наближення boid до перешкоди.

Що таке хмара шпаків (мурмурація)?

Мурмурація — це вражаюче скоординоване повітряне видовище тисяч шпаків європейських, що літають синхронно, утворюючи плинні, постійно змінювані тривимірні форми. Дослідження показують, що шпаки дотримуються радше топологічних, ніж метричних правил відстані — кожен птах відстежує своїх 6-7 найближчих сусідів незалежно від їхньої абсолютної відстані, що дозволяє зграї залишатися цілісною за різної щільності.

Як шум чи випадковість покращують реалістичність Boids?

Додавання малих випадкових збурень до керівних сил породжує природніший, нерегулярний рух. Без шуму boids сходяться до ідеально впорядкованих формацій, що виглядають механічно. Невеликий стохастичний компонент вносить незначну індивідуальну варіативність, характерну для реальних тварин, що дає більш органічну на вигляд поведінку зграї.

Які розширення існують поза класичними трьома правилами Boids?

Розширення включають: слідування за лідером (деякі boids відстежують призначеного лідера), прагнення до цілі (зграя прямує до мети), слідування по маршруту (boids дотримуються заданого шляху), уникнення хижаків (поведінка розсіювання при виявленні хижака) та обмеження територією (boids залишаються в межах визначеної області). Ці розширення дозволяють Boids моделювати конкретні біологічні чи штучні сценарії.