Як птахи літають зграями?
Мурмурація шпаків виглядає як єдина жива істота — сотні тисяч птахів рухаються в ідеальній злагоді без жодного ватажка чи плану. У чому секрет? Кожен птах дотримується лише трьох простих правил зі своїми найближчими сусідами. Складність виникає сама собою.
Загадка мурмурації
Мурмурація — це акробатичний політ тисяч європейських шпаків (Sturnus vulgaris) у сутінках. Уся зграя перекочується, пульсує та змінює форму, мов жива рідина, — і все ж жоден окремий птах не керує іншими.
Вчені сторіччями ламали голову над цим. Ранні припущення включали телепатію, сигнали тиску повітря або птаха-ватажка, що віддає безмовні накази. Справжня відповідь, відкрита у 1980-х, набагато елегантніша: кожен птах відстежує лише сімох своїх найближчих сусідів і дотримується трьох локальних правил. Глобальна краса виникає виключно з локальної інформації.
Три прості правила
У 1986 році дослідник комп'ютерної графіки Крейг Рейнольдс створив програму, яку назвав Boids (скорочено від "bird-oids", тобто "птахоподібні"), що відтворювала зграювання лише за допомогою трьох правил керування:
Розділення
Відвертай від будь-яких сусідніх boid'ів, що надто близько, — уникай зіткнень.
Вирівнювання
Керуй так, щоб відповідати середньому напрямку та швидкості сусідніх boid'ів.
Згуртованість
Керуй до середнього положення сусідніх boid'ів — тримайся разом як група.
Математика, що стоїть за правилами
Кожен boid має вектор положення p та вектор швидкості v. На кожному кроці часу ми обчислюємо три внески прискорення й додаємо їх до швидкості.
Розділення
Для кожного сусіда j, ближчого за радіус розділення
r_sep, віднімаємо вектор відштовхування, зважений за відстанню:
separation_force += (p_self - p_j) / |p_self - p_j|²
Вирівнювання
Усереднюємо швидкості всіх сусідів у межах радіуса r_align
і керуємо до цього середнього курсу:
alignment_force = mean(v_neighbours) - v_self
Згуртованість
Керуємо до середнього положення (центру мас) сусідів у межах
r_cohesion:
cohesion_force = mean(p_neighbours) - p_self
Кожна сила масштабується ваговою константою, після чого всі три додаються до поточної швидкості. Потім швидкість обмежується максимальним значенням, щоб boid'и не прискорювалися вічно.
Мінімальна реалізація на JavaScript
// Для кожного boid знаходимо сусідів і обчислюємо сили
function updateBoid(b, others) {
let sep = {x:0,y:0}, ali = {x:0,y:0}, coh = {x:0,y:0}, n = 0;
for (const o of others) {
const dx = b.x - o.x, dy = b.y - o.y;
const d = Math.hypot(dx, dy);
if (d < RADIUS_SEP && d > 0) {
sep.x += dx / (d * d);
sep.y += dy / (d * d);
}
if (d < RADIUS_VIS) {
ali.x += o.vx; ali.y += o.vy;
coh.x += o.x; coh.y += o.y;
n++;
}
}
if (n > 0) {
ali.x = ali.x/n - b.vx; ali.y = ali.y/n - b.vy;
coh.x = coh.x/n - b.x; coh.y = coh.y/n - b.y;
}
b.vx += sep.x * W_SEP + ali.x * W_ALI + coh.x * W_COH;
b.vy += sep.y * W_SEP + ali.y * W_ALI + coh.y * W_COH;
// обмежуємо швидкість, потім рухаємось
const speed = Math.hypot(b.vx, b.vy);
if (speed > MAX_SPEED) { b.vx *= MAX_SPEED/speed; b.vy *= MAX_SPEED/speed; }
b.x += b.vx; b.y += b.vy;
}
Емерджентність: більше, ніж сума частин
Зграювання — це класичний приклад емерджентності: складної колективної поведінки, що виникає з простих індивідуальних правил без жодного центрального управління. Зграя в цілому виявляє властивості, яких не має жоден окремий boid.
Інші приклади емерджентних систем:
- Мурашині колонії розв'язують задачу найкоротшого шляху через феромонні сліди — кожна мураха проста, а колонія розумна.
- Затори утворюються й розсіюються хвилями, навіть коли не сталося жодної аварії, — спричинені виключно реакцією водіїв одне на одного.
- Мозок породжує свідомість із мільярдів окремих нейронів, жоден з яких не є свідомим сам по собі.
- Інтернет надійно маршрутизує дані з мільярдів децентралізованих вузлів, що дотримуються локальних протоколів.
Застосування в реальному світі
Алгоритм Boids і варіанти роєвого інтелекту використовуються в багатьох галузях:
- Комп'ютерна графіка та ігри: Реалістичні натовпи, зграї риб та рої комах у фільмах і відеоіграх (початковий сценарій застосування).
- Рої дронів: Військові та рятувальні дрони координуються за допомогою правил на кшталт Boids без централізованого керування, тож рій виживає навіть якщо координатор виходить з ладу.
- Робототехніка: Роєві роботи на складах (як роботи Kiva від Amazon) орієнтуються за допомогою емерджентної координації, натхненної мурашиними колоніями.
- Оптимізація роєм частинок: Математичний алгоритм, що імітує пошук на кшталт boid'ів, аби знаходити оптимальні розв'язки в інженерії та машинному навчанні.
- Моделювання трафіку: Симуляції автомагістралей використовують агентні моделі, де кожен автомобіль дотримується простих локальних правил, — математика зграювання, застосована до доріг.
Спробуйте самі
Ви можете дослідити поведінку зграювання інтерактивно в симуляціях нижче:
- Симуляція зграювання Boids — Класичні Boids Рейнольдса з регульованими вагами для всіх трьох правил. Спробуйте збільшити розділення й подивіться, як зграя розпадається на самотніх птахів.
- Пташина зграя (3D) — Тривимірна зграя у стилі мурмурації з використанням інстансованого рендерингу Three.js із тисячами птахів.
- Мурашина колонія — Ще одна емерджентна система: подивіться, як мурахи прокладають феромонні сліди й колективно відкривають найкоротші шляхи.