Проблема гамильтонового пути — это тема, обсуждаемая в областях теории сложности и теории графов . Она решает, содержит ли ориентированный или неориентированный граф G гамильтонов путь , путь, который посещает каждую вершину в графе ровно один раз. В задаче могут быть указаны начало и конец пути , в этом случае должны быть идентифицированы начальная вершина s и конечная вершина t . [1]
Задача о гамильтоновом цикле похожа на задачу о гамильтоновом пути, за исключением того, что она спрашивает, содержит ли заданный граф гамильтонов цикл . Эта задача также может указывать начало цикла. Задача о гамильтоновом цикле является частным случаем задачи о коммивояжере , полученной путем установки расстояния между двумя городами равным единице, если они соседние, и двум в противном случае, и проверки того, что общее пройденное расстояние равно n. Если это так, то маршрут является гамильтоновым циклом.
Задача о гамильтоновом пути и задача о гамильтоновом цикле относятся к классу NP-полных задач, как показано в книге Майкла Гэри и Дэвида С. Джонсона «Компьютеры и неразрешимость: руководство по теории NP-полноты» и в списке Ричарда Карпа из 21 NP-полной задачи . [2] [3]
Задачи нахождения гамильтонова пути и гамильтонова цикла можно связать следующим образом:
Чтобы решить, имеет ли граф гамильтонов путь, нужно проверить каждый возможный путь во входном графе G. Существует n ! различных последовательностей вершин, которые могут быть гамильтоновыми путями в данном n- вершинном графе (и являются таковыми в полном графе ), поэтому алгоритм поиска методом перебора , который проверяет все возможные последовательности, будет очень медленным.
Ранним точным алгоритмом для поиска гамильтонова цикла на ориентированном графе был перечислительный алгоритм Мартелло. [3] Процедура поиска Фрэнка Рубина [5] делит ребра графа на три класса: те, которые должны быть на пути, те, которые не могут быть на пути, и неопределенные. По мере продолжения поиска набор правил принятия решений классифицирует неопределенные ребра и определяет, следует ли остановить или продолжить поиск. Ребра, которые не могут быть на пути, могут быть исключены, поэтому поиск становится все меньше. Алгоритм также делит граф на компоненты, которые могут быть решены по отдельности, что значительно уменьшает размер поиска. На практике этот алгоритм по-прежнему является самым быстрым.
Также, динамический алгоритм программирования Беллмана, Хелда и Карпа может быть использован для решения проблемы за время O( n 2 2 n ). В этом методе определяется для каждого набора вершин S и каждой вершины v в S , существует ли путь, который охватывает точно вершины в S и заканчивается в v . Для каждого выбора S и v путь существует для ( S , v ) тогда и только тогда, когда у v есть сосед w такой, что путь существует для ( S − v , w ), который можно найти из уже вычисленной информации в динамической программе. [6] [7]
Андреас Бьёрклунд предложил альтернативный подход, использующий принцип включения-исключения , чтобы свести задачу подсчета числа гамильтоновых циклов к более простой задаче подсчета, подсчета циклических покрытий, которая может быть решена путем вычисления определенных матричных определителей. Используя этот метод, он показал, как решить задачу гамильтоновых циклов в произвольных графах с n вершинами с помощью алгоритма Монте-Карло за время O(1,657 n ); для двудольных графов этот алгоритм может быть дополнительно улучшен до времени O (1,415 n ). [8]
Для графов максимальной степени три тщательный поиск с возвратом может найти гамильтонов цикл (если он существует) за время O(1,251 n ). [9]
Гамильтоновы пути можно найти с помощью решателя SAT . Гамильтонов путь является NP-полным, что означает, что его можно свести к задаче 3-SAT . В результате, нахождение решения задачи Гамильтонов путь эквивалентно нахождению решения для 3-SAT.
Из-за сложности решения задач гамильтоновых путей и циклов на обычных компьютерах, они также изучались в нетрадиционных моделях вычислений. Например, Леонард Адлеман показал, что задача гамильтоновых путей может быть решена с использованием ДНК-компьютера . Используя параллелизм, присущий химическим реакциям, задача может быть решена с использованием ряда этапов химической реакции, линейно зависящих от числа вершин графа; однако для участия в реакции требуется факториальное число молекул ДНК. [10]
Также было предложено оптическое решение гамильтоновой проблемы. [11] Идея состоит в том, чтобы создать графоподобную структуру из оптических кабелей и светоделителей, через которые проходит свет, чтобы построить решение проблемы. Слабым местом этого подхода является требуемое количество энергии, которое экспоненциально зависит от числа узлов.
Задача поиска гамильтонова цикла или пути находится в FNP ; аналогичная задача решения заключается в проверке существования гамильтонова цикла или пути. Направленные и ненаправленные задачи гамильтонова цикла были двумя из 21 NP-полных задач Карпа . Они остаются NP-полными даже для специальных видов графов, таких как:
Однако для некоторых специальных классов графов задача может быть решена за полиномиальное время:
Объединяя все эти условия, остается открытым вопрос, должны ли 3-связные 3-регулярные двудольные планарные графы всегда содержать гамильтонов цикл, и в этом случае задача, ограниченная этими графами, не может быть NP-полной; см. гипотезу Барнетта .
В графах, в которых все вершины имеют нечетную степень, аргумент, связанный с леммой о рукопожатии, показывает, что число гамильтоновых циклов через любое фиксированное ребро всегда четное, поэтому если задан один гамильтонов цикл, то должен существовать и второй. [20] Однако нахождение этого второго цикла, похоже, не является простой вычислительной задачей. Пападимитриу определил класс сложности PPA для инкапсуляции таких проблем, как эта. [21]
Задача о гамильтоновом пути является NP-полной , что означает, что предлагаемое решение может быть проверено за полиномиальное время . [1]
Алгоритм верификатора для гамильтонова пути будет принимать в качестве входных данных граф G, начальную вершину s и конечную вершину t. Кроме того, верификаторам требуется потенциальное решение, известное как сертификат , c. Для задачи о гамильтоновом пути c будет состоять из строки вершин, где первая вершина является началом предлагаемого пути, а последняя — концом. [22] Алгоритм определит, является ли c допустимым гамильтоновым путем в G, и если да, то примет.
Чтобы решить это, алгоритм сначала проверяет, что все вершины в G появляются ровно один раз в c. Если эта проверка проходит, далее алгоритм гарантирует, что первая вершина в c равна s, а последняя вершина равна t. Наконец, чтобы проверить, что c является допустимым путем, алгоритм должен проверить, что каждое ребро между вершинами в c действительно является ребром в G. Если любая из этих проверок не пройдена, алгоритм отклонит. В противном случае он примет. [22] [23]
Алгоритм может проверить за полиномиальное время, появляются ли вершины в G один раз в c. Кроме того, требуется полиномиальное время для проверки начальных и конечных вершин, а также ребер между вершинами. Таким образом, алгоритм является полиномиальным верификатором для задачи о гамильтоновом пути. [22]
Сети на кристалле (NoC) используются в компьютерных системах и процессорах , служащих для связи между компонентами на кристалле. [24] Производительность NoC определяется методом, который он использует для перемещения пакетов данных по сети . [25] Задача гамильтонового пути может быть реализована как метод на основе пути в многоадресной маршрутизации . Многоадресные алгоритмы на основе пути определят, существует ли гамильтонов путь от начального узла до каждого конечного узла, и отправят пакеты по соответствующему пути. Использование этой стратегии гарантирует маршрутизацию без взаимоблокировок и цепочек , повышая эффективность NoC. [26]
Движки рендеринга — это форма программного обеспечения, используемого в компьютерной графике для генерации изображений или моделей из входных данных. [27] При рендеринге трехмерной графики обычным входом для движка является полигональная сетка . Время, необходимое для рендеринга объекта, зависит от скорости получения входных данных, то есть чем больше входные данные, тем больше время рендеринга. Однако для треугольных сеток время рендеринга может быть уменьшено в три раза. Это делается путем «упорядочивания треугольников таким образом, чтобы последовательные треугольники имели общую грань». [28] Таким образом, между каждым последовательным треугольником меняется только одна вершина. Этот порядок существует, если двойственный граф треугольной сетки содержит гамильтонов путь.
Медиа, связанные с проблемой гамильтоновой траектории на Wikimedia Commons