TSP: битовое DP (Held-Karp)
Коммивояжёр за 2ⁿ·n²: подмножества городов в битах маски.
1function tspHeldKarp(dist: number[][]): number {2 const n = dist.length3 const FULL = 1 << n4 5 // d[mask][i] = минимальный путь из 0, обошли mask, стоим в i6 const d: number[][] = Array.from({ length: FULL }, () =>7 new Array(n).fill(Infinity))8 d[1][0] = 0 // только старт, mask = {0}9 10 for (let mask = 1; mask < FULL; mask++) {11 if (!(mask & 1)) continue12 for (let last = 0; last < n; last++) {13 if (!(mask & (1 << last))) continue14 const cur = d[mask][last]!15 if (cur === Infinity) continue16 for (let next = 0; next < n; next++) {17 if (mask & (1 << next)) continue18 const nm = mask | (1 << next)19 const cost = cur + dist[last]![next]!20 if (cost < d[nm][next]!) d[nm][next]! = cost21 }22 }23 }24 25 let best = Infinity26 for (let last = 1; last < n; last++) {27 best = Math.min(best, d[FULL - 1]![last]! + dist[last]![0]!)28 }29 return best // O(2ⁿ·n²) вместо n!30}Проблема
Коммивояжёр за 2ⁿ·n²: подмножества городов в битах маски.
Что вы видите
d[mask][город] — кратчайший путь по mask с финишем в городе.
Как это работает
Экспонента вместо факториала: 20 городов за миллионы операций вместо 10¹⁸. Точная карта маршрутизации; больше 25 — только эвристики.
Пошаговый разбор
- 01
Маска
Посещённые в битах.
- 02
Переход
+город в маску.
- 03
Замыкание
Финал + возврат.
Complexity и ограничения
Сложность см. в шапке страницы.
Edge cases
- Пустой вход
Корректная тривиальная обработка.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
Логистика
Точные маршруты ≤25 точек.
Печатные платы
Порядок сверловки.
DP-стандарт
Канон bitmask-DP.
Связанные алгоритмы
«Точный TSP: 2ⁿ вместо n!»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.