🐦 Діти · Біологія · Алгоритми
📅 Травень 2026 ⏱ ≈ 7 хв читання 🟢 Всі вікові групи · Останнє оновлення: 23 червня 2026 р.

Як птахи літають зграями?

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

Загадка мурмурації

Мурмурація — це акробатичний політ тисяч європейських шпаків (Sturnus vulgaris) у сутінках. Уся зграя перекочується, пульсує та змінює форму, мов жива рідина, — і все ж жоден окремий птах не керує іншими.

Вчені сторіччями ламали голову над цим. Ранні припущення включали телепатію, сигнали тиску повітря або птаха-ватажка, що віддає безмовні накази. Справжня відповідь, відкрита у 1980-х, набагато елегантніша: кожен птах відстежує лише сімох своїх найближчих сусідів і дотримується трьох локальних правил. Глобальна краса виникає виключно з локальної інформації.

Три прості правила

У 1986 році дослідник комп'ютерної графіки Крейг Рейнольдс створив програму, яку назвав Boids (скорочено від "bird-oids", тобто "птахоподібні"), що відтворювала зграювання лише за допомогою трьох правил керування:

📏

Розділення

Відвертай від будь-яких сусідніх boid'ів, що надто близько, — уникай зіткнень.

🎯

Вирівнювання

Керуй так, щоб відповідати середньому напрямку та швидкості сусідніх boid'ів.

Згуртованість

Керуй до середнього положення сусідніх boid'ів — тримайся разом як група.

Лише цих трьох правил достатньо, щоб відтворити зграювання, зграї риб, рої комах і стада ссавців. Стаття Рейнольдса 1987 року здобула наукову та технічну нагороду Кіноакадемії за використання в голлівудських фільмах.

Математика, що стоїть за правилами

Кожен 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 встановіть згуртованість на нуль. Що станеться? Тепер встановіть вирівнювання на нуль. Чим поведінка відрізняється? Це показує окрему роль, яку кожне правило відіграє у формуванні емерджентної зграї.
🐦 Відкрити пташину зграю →