Роїні алгоритми
Квітень 2026 · 13 хв читання · Роїний інтелект · Оптимізація · Природно-натхненні алгоритми

Бджолиний алгоритм та штучна колонія бджіл

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

1. Біологія пошуку їжі медоносними бджолами

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

Фуражирський вильот має три фази. Спочатку незайнята бджола — без інформації про активні джерела їжі — вибирає між двома варіантами: стати розвідницею (досліджувати випадкове місце) або слідувати за танцюристкою (використовувати відоме джерело). По-друге, опинившись у джерела, завербована бджола збирає нектар, оцінюючи якість (концентрація нектару × об'єм на відвідування). По-третє, повернувшись у вулик, бджола або мовчки повертається до того ж джерела (зайнята фуражирка), або танцює, рекламуючи джерело, або покидає джерело й повертається в незайнятий пул.

Масштаб: Типова колонія з 50 000 бджіл одночасно відправляє приблизно 10 000–20 000 фуражирів до сотень квіткових ділянок. За один літній день одна колонія може відвідати понад 225 000 квіткових ділянок і подолати загальну відстань, що перевищує довжину кола Землі. При цьому колонія адаптує цей розподіл протягом 30 хвилин після відкриття нового джерела.

2. Ваггловий танець — кодування інформації

Карл фон Фріш розшифрував ваггловий танець у серії експериментів з 1943 по 1973 рік, за що отримав Нобелівську премію з фізіології або медицини 1973 року. Танець виконується на вертикальній стільниці всередині темного вулика та одночасно кодує два фрагменти інформації:

Тривалість ваггла (с) ≈ відстань польоту (км) × 0,78 [Seeley 1995] Кут напрямку θ (від вертикалі) = компасний азимут до джерела − компасний азимут до сонця Якість (фітнес) ∝ (концентрація нектару) × (швидкість збору) / (енерговитрати польоту) Кількість циклів танцю ≈ 1,4 × log(фітнес відносно інших джерел)

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

Завербовані з танцю бджоли не є точними копіями — вони підходять до закодованого місця з гауссівською кутовою похибкою приблизно ±10° і похибкою відстані ±15%. Цей шум забезпечує біологічний еквівалент оператора мутації, запобігаючи сходженню всього рою до єдиної точки.

3. Три ролі бджіл у ABC

Алгоритм штучної колонії бджіл (Карабога, 2005) моделює вулик з використанням трьох популяцій, що безпосередньо відповідають біологічним ролям:

🔍
Зайняті бджоли
Кожна пов'язана з конкретним джерелом їжі (рішенням). Вони експлуатують джерело, шукаючи поблизу, потім повертаються передавати інформацію через танець — пропорційний до фітнесу.
👀
Глядачки
Чекають у вулику та обирають джерело для відвідування з імовірністю, пропорційною фітнесу зайнятої бджоли. Потім виконують власний локальний пошук навколо обраного джерела.
🗺️
Розвідниці
Коли лічильник спроб зайнятої бджоли досягає ліміту, вона стає розвідницею і знаходить випадково нове джерело, замінюючи застаріле.

Ключовий структурний баланс: кількість зайнятих бджіл дорівнює кількості джерел їжі (рішень). Кожна зайнята бджола відповідає рівно за одне рішення в будь-який момент, забезпечуючи розподіл тиску використання по всьому пулу.

4. Алгоритм штучної колонії бджіл

ABC — ітеративний алгоритм. Один цикл складається з трьох послідовних фаз. Загальна популяція — SN (розмір рою), з SN/2 зайнятими бджолами та SN/2 глядачками.

Фаза 1: Фаза зайнятих бджіл

Кожна зайнята бджола i генерує нового кандидата vi, збурюючи своє поточне джерело xi вздовж випадково обраного виміру j, використовуючи випадкового сусіда k ≠ i:

v[i][j] = x[i][j] + φ[i][j] × (x[i][j] − x[k][j]) де: j = випадковий індекс виміру ∈ {0, ..., D-1} k = випадковий індекс джерела їжі, k ≠ i φ[i][j] = рівномірне випадкове у [−1, +1] Якщо f(v[i]) ≥ f(x[i]): замінити x[i] на v[i], скинути trial[i] = 0 Інакше: залишити x[i], збільшити trial[i]

Фаза 2: Фаза глядачок

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

Імовірність вибору: p[i] = fit[i] / Σ fit[k] (рулеточне колесо) де fit[i] = 1 / (1 + |f(x[i])|) для задач мінімізації = f(x[i]) для задач максимізації

Фаза 3: Фаза розвідниць

Будь-яке джерело i, лічильник спроб якого досягає параметра limit, покидається. Зайнята бджола, пов'язана з ним, стає розвідницею та генерує абсолютно випадкове нове джерело в межах пошуку:

якщо trial[i] ≥ limit: x[i][j] = lb[j] + rand(0,1) × (ub[j] − lb[j]) для всіх j trial[i] = 0

5. Математичне формулювання

ABC підтримує SN/2 позицій джерел їжі xi ∈ ℝᴰ, де D — розмірність задачі. Пошук функції f: ℝᴰ → ℝ є глобальною оптимізацією:

мінімізувати f(x) за умови x ∈ [lb, ub]^D Популяція: {x[i]} для i = 1, ..., SN/2 (джерела їжі) Кожне джерело має ємність: trial[i] ∈ ℕ (лічильник покидання)
Параметр Типове значення Ефект
SN (розмір рою) 40–100 Більше джерел = повільніший, але ретельніший пошук
limit SN/2 × D Більше = більше використання перед покиданням
MCN (макс. цикли) 500–5000 Критерій зупинки; залежить від задачі
D (розмірності) 2–100 Розмірність задачі; масштабованість падає вище ~30

6. Налаштування параметрів і збіжність

ABC має менше параметрів, ніж більшість інших метаевристик: розмір рою SN, limit і максимальна кількість циклів MCN. Рекомендоване значення за замовчуванням для limit — SN × D / 2 (Karaboga і Basturk, 2007). Це гарантує, що кожне джерело їжі відвідується приблизно D × SN / 2 разів перед покиданням, забезпечуючи достатній локальний пошук у кожному вимірі.

Поширені режими відмови

Сфера застосувань: ABC застосовувався до навчання нейронних мереж, відбору ознак, планування роботи, кластеризації зображень, планування маршруту робота та економічного диспетчеру. Для неперервних функцій до ~50 вимірів він загалом конкурентоспроможний з CMA-ES і часто значно перевершує GA та базовий PSO на мультимодальних просторах.

7. JavaScript-реалізація

// Штучна колонія бджіл (ABC) — мінімізація
// Приклад: мінімізувати f(x) = Σ x[i]² (функція Sphere)

const D       = 10;
const SN      = 40;
const LIMIT   = SN / 2 * D;
const MCN     = 500;

const lb = Array(D).fill(-5.12);
const ub = Array(D).fill( 5.12);

function f(x) {
  return x.reduce((s, xi) => s + xi * xi, 0);
}

function fitness(obj) {
  return obj >= 0 ? 1 / (1 + obj) : 1 + Math.abs(obj);
}

function randomSource() {
  return Array.from({ length: D }, (_, j) =>
    lb[j] + Math.random() * (ub[j] - lb[j])
  );
}

function runABC() {
  const nEmp = SN / 2;
  let sources = Array.from({ length: nEmp }, randomSource);
  let objs    = sources.map(f);
  let trials  = new Array(nEmp).fill(0);
  let bestX   = sources[0].slice();
  let bestObj = objs[0];
  objs.forEach((o, i) => { if (o < bestObj) { bestObj = o; bestX = sources[i].slice(); } });

  function perturbSource(i) {
    const j = Math.floor(Math.random() * D);
    let k;
    do { k = Math.floor(Math.random() * nEmp); } while (k === i);
    const phi = (Math.random() * 2 - 1);
    const v = sources[i].slice();
    v[j] = Math.min(ub[j], Math.max(lb[j],
           sources[i][j] + phi * (sources[i][j] - sources[k][j])));
    const newObj = f(v);
    if (newObj < objs[i]) {
      sources[i] = v; objs[i] = newObj; trials[i] = 0;
      if (newObj < bestObj) { bestObj = newObj; bestX = v.slice(); }
    } else { trials[i]++; }
  }

  for (let cycle = 0; cycle < MCN; cycle++) {
    // Фаза зайнятих бджіл
    for (let i = 0; i < nEmp; i++) perturbSource(i);

    // Фаза глядачок
    const fits = objs.map(o => fitness(o));
    const sumF = fits.reduce((a, b) => a + b, 0);
    const probs = fits.map(f => f / sumF);
    for (let b = 0; b < nEmp; b++) {
      let r = Math.random(), chosen = 0, cumP = 0;
      for (let i = 0; i < nEmp; i++) { cumP += probs[i]; if (r < cumP) { chosen = i; break; } }
      perturbSource(chosen);
    }

    // Фаза розвідниць
    for (let i = 0; i < nEmp; i++) {
      if (trials[i] >= LIMIT) {
        sources[i] = randomSource(); objs[i] = f(sources[i]); trials[i] = 0;
      }
    }
  }
  return { bestX, bestObj };
}

const result = runABC();
console.log('Найкраще значення:', result.bestObj.toFixed(8));
        

8. Порівняння з PSO та ACO

Усі три основні сімейства роїного інтелекту — Оптимізація роєм частинок, Оптимізація мурашиною колонією та Штучна колонія бджіл — були натхненні соціальними комахами, але використовують різні стратегії:

Алгоритм Натхнення Механізм пошуку Контроль дослідження Найкраща область
PSO Зграя птахів Швидкість + інерція + соц./інд. кращі Вага інерції / коефіцієнт звуження Гладкі неперервні унімодальні функції
ACO Феромони мурах Феромонно-керована побудова маршруту Швидкість випаровування Комбінаторні задачі (TSP, VRP)
ABC Пошук їжі бджолами Збурення по сусіду + глядачка-рулетка Лічильник limit → фаза розвідниць Мультимодальна неперервна оптимізація

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