Задача коммивояжера, ДП по подмножествам — различия между версиями
(→Динамическое программирование по подмножествам (по маскам)) |
|||
Строка 53: | Строка 53: | ||
Это решение использует <tex>O(2^n)</tex> памяти и имеет асимптотику <tex>O(2^nn)</tex>. | Это решение использует <tex>O(2^n)</tex> памяти и имеет асимптотику <tex>O(2^nn)</tex>. | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
== См. также == | == См. также == |
Версия 20:01, 9 января 2016
Задача: |
Задача о коммивояжере (англ. Travelling salesman problem, TSP) — задача, в которой коммивояжер должен посетить | городов, побывав в каждом из них ровно по одному разу и завершив путешествие в том городе, с которого он начал. В какой последовательности ему нужно обходить города, чтобы общая длина его пути была наименьшей?
Содержание
Варианты решения
NP-полнота задач о гамильтоновом цикле и пути в графах
Так вот задача о коммивояжере относится к классу NP-полных задач. Поэтому, рассмотрим два варианта решения с экспоненциальным временем работы.
Перебор перестановок
Можно решить задачу перебором всевозможных перестановок. Для этого нужно сгенерировать все
всевозможных перестановок вершин исходного графа, подсчитать для каждой перестановки длину маршрута и выбрать минимальный из них. Но тогда задача оказывается неосуществимой даже для достаточно небольших . Сложность алгоритма .Динамическое программирование по подмножествам (по маскам)
Задача о коммивояжере представляет собой поиск кратчайшего гамильтонова цикла в графе.
Смоделируем данную задачу при помощи графа. При этом вершинам будут соответствовать города, а ребрам — дороги. Пусть в графе
вершин, пронумерованных от до и каждое ребро имеет некоторый вес . Необходимо найти гамильтонов цикл, сумма весов по ребрам которого минимальна.Подробнее можно прочитать в этой статье.
Оптимизация решения
Пусть
содержит булево значение — существует ли в подмножества гамильтонов путь, заканчивающийся в вершине .Сама динамика будет такая:
Это решение требует
памяти и времени. Эту оценку можно улучшить, если изменить динамику следующим образом.Пусть теперь
хранит маску подмножества всех вершин, для которых существует гамильтонов путь в подмножестве , заканчивающихся в этой вершине. Другими словами, сожмем предыдущую динамику: будет равно . Для графа выпишем масок , для каждой вершины задающие множество вершин, которые связаны ребром в данной вершиной. То есть .Тогда динамика перепишется следующим образом:
Особое внимание следует уделить выражению
. Первая часть выражения содержит подмножество вершин, для которых существует гамильтонов путь, заканчивающихся в соответствующих вершинах в подмножестве без вершины , а вторая — подмножество вершин, связанных с ребром. Если эти множества пересекаются хотя бы по одной вершине (их не равен ), то, как нетрудно понять, в существует гамильтонов путь, заканчивающийся в вершине .Окончательная проверка состоит в сравнении
c .Это решение использует
памяти и имеет асимптотику .См. также
- Кратчайший путь в ациклическом графе
- Задача о наибольшей общей подпоследовательности
- Задача о наибольшей возрастающей подпоследовательности
- Задача о рюкзаке
- Алгоритм нахождения Гамильтонова цикла в условиях теорем Дирака и Оре
- Гамильтоновы графы
Источники информации
- Романовский И. В. Дискретный анализ. СПб.: Невский Диалект; БХВ-Петербург, 2003. ISBN 5-7940-0114-3
- Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгоритмы: построение и анализ, 2-е издание. М.: Издательский дом "Вильямс", 2005. ISBN 5-8459-0857-4