Стаття
Оптимізація · Автономні системи · ⏱ ~10 хв читання · Оновлено: 9 липня 2026

Оптимальний маршрут дронів — задача комівояжера злітає у повітря

Дрон-доставник, що облітає 20 дахів, агродрон, що сканує 50 точок на полі, або інспекційний дрон, що перевіряє 100 опор ЛЕП — усі стикаються з однаковим абстрактним питанням: у якому порядку відвідати зупинки, щоб мінімізувати загальну відстань польоту (а отже, і витрату батареї)? Це задача комівояжера (TSP, travelling salesman problem) — одна з найдослідніших задач комбінаторної оптимізації — адаптована до тривимірного простору, вітру та обмеженого бюджету батареї.

Коротко: Маршрутизація дронів — це задача комівояжера у 3D: потрібно знайти порядок обльоту точок, який мінімізує пройдену відстань і витрату заряду батареї. Точні алгоритми стають нездійсненними вже після ~20-25 точок, тому реальні флоти дронів використовують евристики (найближчий сусід, 2-opt) з урахуванням вітру, висоти й батареї, а для кількох дронів одразу — генетичні алгоритми.

1. Формалізація задачі

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

Мінімізувати: Σ d(p_i, p_{i+1}) для i = 1..n, де p_{n+1} = p_1 За умови: кожна точка відвідана рівно один раз (перестановка) Метрика відстані для дронів (3D + енергія): d(p_i, p_j) = w1·|Δxyz| + w2·енергія_підйому(Δz) + w3·штраф_вітру Кількість різних турів: (n-1)!/2 — вибухово зростає: n=10 → 181 440 турів n=20 → 6×10^16 турів

2. Чому це складно: обчислювальна складність

TSP є NP-складною задачею: жоден відомий алгоритм не розв'язує кожен екземпляр за поліноміальний від n час, і більшість дослідників вважають, що такого алгоритму не існує (гіпотеза P ≠ NP). Точні методи існують, але погано масштабуються:

3. Конструктивні евристики

Швидкі евристики будують прийнятний початковий тур, зазвичай у межах 10-25% від оптимуму:

Найближчий сусід: з поточної точки завжди летіти до найближчої невідвіданої точки. O(n²), просто, але може залишити одну дуже довгу «зворотну» ділянку наприкінці. Жадібне ребро: відсортувати всі ребра за довжиною, додавати найкоротші ребра, що не створюють підциклу чи вершини степеня 3, доки не сформується єдиний тур. O(n² log n), зазвичай кращий за найближчого сусіда. Алгоритм Крістофідеса: мінімальне остовне дерево + мінімальне за вагою досконале паросполучення на вершинах непарного степеня + ейлерове скорочення. Гарантовано ≤ 1.5× від оптимуму для метричного TSP (виконується для симетричних евклідових відстаней дронів без вітру).

5. Обмеження, специфічні для дронів

Бюджет батареї

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

Асиметрія вітру

Наземна швидкість (а отже, і витрата енергії) різниться при польоті за вітром і проти нього — матриця відстаней стає асиметричною (ATSP), що вимагає інших розв'язувачів, ніж симетричний TSP.

Зміни висоти

Підйом коштує непропорційно більше енергії, ніж спуск чи горизонтальний політ — функція вартості має зважувати Δz асиметрично, а не просто евклідову 3D-відстань.

Заборонені зони

Обмеження повітряного простору перетворюють прямі точка-до-точки ділянки на задачі найкоротшого шляху навколо перешкоди, зазвичай розв'язувані графами видимості або A* перед застосуванням упорядкування TSP.

6. Генетичні алгоритми для маршрутизації флоту

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

Хромосома: перестановка точок + точки розподілу між дронами Пристосованість: 1 / (загальна енергія флоту + штраф max(час одного дрона) за дисбаланс навантаження) Схрещування: Order Crossover (OX) — зберігає відносний порядок точок обох батьків без дублювання зупинок Мутація: обмін двома точками або розворот піддільниці (мутація у стилі 2-opt) Типові налаштування: популяція 100-300, 200-500 поколінь, елітизм зберігає топ 5-10%

7. JavaScript-оптимізатор маршруту 2-opt

// Локальний пошук 2-opt для туру точок дрона (евклідова 3D відстань)
function dist(a, b) {
  return Math.hypot(a.x-b.x, a.y-b.y, (a.z-b.z)*1.6); // підйом важить більше
}

function tourLength(tour, pts) {
  let total = 0;
  for (let i = 0; i < tour.length; i++) {
    total += dist(pts[tour[i]], pts[tour[(i+1) % tour.length]]);
  }
  return total;
}

function twoOpt(pts) {
  let tour = pts.map((_, i) => i); // старт: тут міг би бути тур найближчого сусіда
  let improved = true;
  while (improved) {
    improved = false;
    for (let i = 0; i < tour.length - 1; i++) {
      for (let j = i + 2; j < tour.length; j++) {
        const a = pts[tour[i]], b = pts[tour[i+1]];
        const c = pts[tour[j]], d = pts[tour[(j+1) % tour.length]];
        const before = dist(a,b) + dist(c,d);
        const after  = dist(a,c) + dist(b,d);
        if (after < before - 1e-9) {
          const seg = tour.slice(i+1, j+1).reverse();
          tour = [...tour.slice(0, i+1), ...seg, ...tour.slice(j+1)];
          improved = true;
        }
      }
    }
  }
  return { tour, length: tourLength(tour, pts) };
}

// 12 дахів доставки (x, y в метрах, z = висотний ешелон)
const waypoints = [
  {x:0,y:0,z:30}, {x:120,y:40,z:35}, {x:80,y:150,z:28} /* ...ще... */
];
const best = twoOpt(waypoints);
console.log(`Довжина оптимізованого маршруту: ${best.length.toFixed(0)} м`);

8. Реальні застосування

Доставка «останньої милі»

Zipline і Wing планують щоденні партії доставок як екземпляри TSP/VRP, перевирішувані з надходженням нових замовлень, із зарядними станціями як обов'язковими зупинками туру.

Точне землеробство

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

Інспекція інфраструктури

Дрони для інспекції ЛЕП і трубопроводів розв'язують TSP над опорами чи вентильними станціями, часто в поєднанні з пошуком шляху з урахуванням перешкод між зупинками.