Алгоритм с полиномиальным временем для поиска гамильтонова блуждания в графе

Есть ли алгоритм с полиномиальным временем для поиска гамильтонова блуждания в графе?

Мой алгоритм является N-факториальным и очень медленным.

Я понимаю, что поиск гамильтонова пути - это NP-полная проблема. Поиск гамильтоновой схемы - это то же самое, или она уже решена?

wizlog 26.05.2016 23:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
1
7 513
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Это полная NP. Но если вам удастся найти хороший метод, дайте мне знать, и я покажу вам, как разбогатеть.

Ответ принят как подходящий

Вы только что спросили вопрос на миллион долларов. Поиск пути Гамильтона - это NP-полная задача. Некоторые NP-сложные задачи можно решить за полиномиальное время с помощью динамического программирования, но (насколько мне известно) это не одна из них.

NP-сложные задачи еще предстоит решить за полиномиальное время, это все еще вопрос на миллион долларов. Они были решены за псевдополиномиальное время (подробности см. На странице википедии о задаче о рюкзаке).

hazzen 18.09.2008 06:30

Нет известных алгоритмов полиномиального времени для любой из NP-полных задач; если бы для одной из задач был только один алгоритм, все остальные NP-полные задачи были бы сведены к нему за полиномиальное время. Я думаю, что hazzen имеет в виду тот факт, что некоторые задачи, такие как Knapsack, могут быть довольно хорошо аппроксимированы за полиномиальное время. Однако чем ближе вы подходите к идеальному приближению, тем дальше вы от полинома.

Jay Conrod 10.06.2009 06:45

Вы можете назвать проблему и описать алгоритм? Нам конечно интересно.

piccolbo 22.10.2010 22:12

Многие NP-полные задачи можно решить с помощью динамического программирования. Рассмотрим проблему выравнивания строк (расстояние редактирования). O (k ^ n) с наивной реализацией, но O (n ^ 2) с использованием динамического программирования. Как правило, любая проблема, которая демонстрирует оптимальную подструктуру и перекрывающиеся подзадачи, может быть уменьшена в сложности с помощью мемоизации, что и делает динамическое программирование. В Википедии есть достойное объяснение и несколько примеров.

Daniel Spiewak 28.10.2010 21:20

Важно отметить, что динамическое программирование на самом деле не предоставляет алгоритм для решения NP-полных задач за полиномиальное время, оно просто использует структуру очень специфического подкласса проблем, чтобы избавиться от лишней работы. Метод нет применим к общему классу NP-полных задач. Если бы это было так, это был бы потрясающий результат. :-)

Daniel Spiewak 28.10.2010 21:22

Тем не менее, часть вашего ответа неверна - не существует известной NP-сложной задачи, которую можно было бы решить за полиномиальное время. Расстояние редактирования не является NP-трудным (если P = NP); он находится в P. (Некоторые задачи NP могут быть решены за полиномиальное время, и тогда они входят в подмножество, называемое P.)

sdcvvc 10.07.2011 05:11

Найти лучший алгоритм для кратчайшего маловероятно, поскольку это NP сложно. Но есть некоторые эвристики, которые вы можете попробовать, и, возможно, вы захотите проконсультироваться по ним в своих лекционных заметках;).

Для меньшей сложности вы можете найти короткую прогулку, используя жадный алгоритм.

В общем, поскольку (решающая версия) проблема гамильтонова пути является NP-полной, вы не можете надеяться получить алгоритм с полиномиальным временем для поиска гамильтоновых путей. Можно немного ускорить обычным N! → Уловка динамического программирования N22N (вычислите hp [v] [w] [S] = "существует ли путь, который имеет конечные точки v и w и чьи вершины являются подмножеством S" для каждого подмножества S и каждых двух вершин v и w в нем используя DP), но это все еще экспоненциально.

Однако есть много специальных видов графов, для которых гамильтоновы пути всегда будут существовать, и их можно легко найти (см. Работы Посы, Дирака, Оре и т. д.)

Например, верно следующее: Если каждая вершина графа имеет степень не менее n / 2, тогда у графа есть гамильтонов путь. Фактически вы можете найти его в O (n2) или IIRC даже в O (n log n), если вы сделаете это более умно. [Грубый набросок: во-первых, просто соедините все вершины в некотором «гамильтоновом» цикле, не говоря уже о том, находятся ли ребра в самом графе. Теперь для каждого ребра (v, w) вашего цикла, которого на самом деле нет в графе, рассмотрим оставшуюся часть цикла: v ... w. Поскольку deg (v) + deg (w)> = n, в вашем списке (в указанном порядке) существуют последовательные x, y, такие что w является соседом x, а v является соседом y. [Доказательство: рассмотрите {множество всех соседей w} и {множество всех преемников в вашем списке соседей v}; они должны пересекаться.] Теперь измените свой цикл [v ... xy ... wv] на [vy ... wx ... v] вместо этого, он имеет как минимум на одно недопустимое ребро, поэтому вам понадобится не более n итераций, чтобы получить истинный гамильтонов цикл. Подробнее здесь.]

Кстати: если то, что вы ищете, это просто прогулка, которая включает каждый край один раз, это называется эйлеровым обходом, а для графов, которые имеют его (количество вершин нечетной степени равно 0 или 2), его довольно легко найти в полиномиальном время (быстро).

В зависимости от того, как генерируются графы, с которыми вы работаете, вы можете получить ожидаемое полиномиальное время для случайного экземпляра, выполнив жадное расширение пути, а затем случайную замену краев, когда он застрянет.

Это хорошо работает против случайно сгенерированных относительно разреженных графов, у которых гарантировано гамильтоново блуждание.

Почему голос против? Это хороший ответ, намного лучше, чем "ха-ха, NP Complete" не ответы, которые не говорят вам, что вы делаете может.

ShreevatsaR 19.10.2010 21:20

Хммм .. это зависит от ваших определений. Гамильтонов путь заведомо NP-полон. Однако гамильтонова прогулка, которая может посещать ребра и вершины более одного раза (да, она все еще называется гамильтоновой, если вы добавляете бит ходьбы в конце), может быть вычислена в O (p ^ 2logp) или O (max (c ^ 2plogp , | E |)) до тех пор, пока ваш граф удовлетворяет определенному условию, которое Дирак впервые предположил, а Такамизава доказал. См. Takamizawa (1980) «Алгоритм поиска короткого замкнутого покрывающего обхода в графе».

Павел

Удивительно, что единственный правильный ответ на вопрос ОП вообще не получил голосов ...

m.raynal 16.04.2019 11:06

Мой запрос: покажите, что задача поиска RHAM для нахождения гамильтонова цикла в графе G является самовосстанавливающийся Задача поиска R является самовосстанавливающейся, если она сводится по Куку к проблеме принятия решения
SR = { x : R(x) ≠ ∅ }

Другие вопросы по теме