Какие существуют оптимизации для поиска самого длинного пути в циклическом графе?
Самый длинный путь в циклических графах, как известно, является NP-полным. Какие оптимизации или эвристики могут сделать поиск самого длинного пути быстрее, чем DFSing всего графика? Существуют ли какие-либо вероятностные подходы?
У меня есть график с определенными качествами, но я ищу ответ на этот вопрос в общем случае. Связывание с документами было бы фантастическим. Вот частичный ответ:
-
Подтвердите, что он цикличен. Самый длинный путь в ациклических графах легко вычисляется с помощью динамического программирования.
-
Узнайте, является ли граф плоским (какой алгоритм лучше?). Если это так, вы можете увидеть, является ли это графом блоков, графиком ptolemaic или cacti, и примените методы, найденные в в этой статье.
-
Узнайте, сколько простых циклов использует алгоритм Дональда Б Джонсона (реализация Java). Вы можете изменить любой циклический граф на ациклический, удалив ребро в простом цикле. Затем вы можете запустить решение динамического программирования, найденное на странице Википедии. Для полноты вам нужно будет делать это N раз для каждого цикла, где N - длина цикла. Таким образом, для целого графика количество раз, когда вам нужно запустить решение DP, равно произведению длин всех циклов.
-
Если вам нужен DFS весь график, вы можете обрезать некоторые пути, предварительно вычислив "достижимость" каждого node. Эта достижимость, которая в основном применима к ориентированным графам, - это количество узлов, каждое из которых node может достигать без повторений. Это самый длинный путь от этого node. С этой информацией, если ваш текущий путь плюс достижимость дочернего элемента node меньше, чем самый длинный, который вы уже нашли, нет смысла принимать эту ветку, поскольку невозможно, чтобы вы нашли более длинный путь.