Алгоритм Кристофидеса-Сердюкова: приближенное решение задачи коммивояжера

Алгоритм Кристофидеса-Сердюкова, несмотря на гарантированную оценку решения не хуже 3/2 от оптимального, на практике демонстрирует хорошие результаты, что делает его полезным для практического применения. Он часто используется в качестве эталона для сравнения эффективности других алгоритмов решения задачи коммивояжера, в частности, в контексте применения нейронных сетей. Алгоритм основан на теории графов и использует минимальное остовное дерево, что является его первым шагом.
Алгоритм Кристофидеса-Сердюкова: приближенное решение задачи коммивояжера
Изображение носит иллюстративный характер

Алгоритм включает в себя поиск вершин с нечетной степенью в минимальном остовном дереве. Согласно лемме о рукопожатиях, таких вершин всегда четное количество. Далее алгоритм находит наилучшее сочетание этих вершин с использованием алгоритма минимального веса паросочетания. Для этого используется целочисленное линейное программирование (MIP). Этот этап важен, так как определяет вычислительную сложность алгоритма.

После нахождения наилучшего сочетания нечетных пар, их ребра добавляются к минимальному остовному дереву, формируя Эйлеров цикл. Эйлеров цикл проходит по каждому ребру графа ровно один раз. Затем, этот цикл преобразуется в Гамильтонов цикл, который посещает каждую вершину графа ровно один раз, за исключением начальной вершины. Для этого используется метод исключения повторных посещений вершин, переходя к следующей вершине в последовательности.

Тестирование показало, что алгоритм Кристофидеса-Сердюкова демонстрирует хорошую точность, уверенно превосходя многие другие эвристические алгоритмы, за исключением алгоритма Concorde и метода 2-opt. При этом он занимает второе место по скорости вычислений после эвристики ближайшего соседа. Это делает алгоритм Кристофидеса-Сердюкова применимым в ситуациях, где важна скорость и приемлемая точность решения, например при планировании маршрутов.


Новое на сайте

20856Ловушка под видом регистрации: как UAT-11985 крадёт аккаунты Google 20855Может ли виртуальная машина прочитать память хоста? 20854Как дешёвые Android-смартфоны превращаются в чужие прокси? 20853В Индии имя звонящего появится на экране вместе с номером 20852Как проверить готовность команды к звонку с клонированным голосом? 20851Уязвимости MarkLogic: делегированные права могли открыть путь к администраторскому... 20850Как GitHub закрыл лазейку, угрожавшую тысячам npm-пакетов? 20849Hirudo подменяет банковские приложения, чтобы обойти их защиту 20848Как Vghost превратил старую ошибку Linux в путь к root? 20847Уязвимости в PAN-OS и Cisco Secure Email Gateway уже используют атакующие 20846Как уязвимость GitLab могла открыть сервер для чужого кода? 20845Уязвимость SAP Cloud SDK могла отправить OAuth2-секреты злоумышленнику 20844Уязвимость в Nextcloud открыла путь к веб-оболочкам на серверах 20843Смогут ли малые ИИ-модели превратить бытовую технику в ботнет? 20842Пять уязвимостей NGINX: кому грозит риск и как закрыть его
Ссылка