Как удалить циклы в невзвешенном направленном графе, чтобы число ребер было максимизировано?
пусть G-невзвешенный направленный граф, содержащий циклы. Я ищу алгоритм, который находит / создает все ациклические графы G', состоящие из всех вершин в G и подмножества ребер G, достаточно маленьких, чтобы сделать G' ациклическим.
более формально: желаемый алгоритм потребляет G и создает набор ациклических графов S, где каждый граф G ' в S удовлетворяет следующим свойствам:
- G ' содержит все вершины G.
- G ' содержит подмножество ребер G, такой, что G ' является ациклическим.
- число ребер G' максимизировано. Это означает: нет G "удовлетворяющих свойствам 1 и 2, таких что G" содержит больше ребер, чем G' и G" является ациклическим.
фон: исходный граф G моделирует попарное упорядочение между элементами. Это не может быть использовано как упорядочение по всем элементам из-за циклов в графике. Поэтому максимальные ациклические графы G ' должны моделировать наилучшее приближение к этому упорядочению, стараясь уважать как можно больше парного упорядочивающего отношения.
в наивном подходе можно удалить все возможные комбинации ребер и проверить ацикличность после каждого удаления. В этом случае существует сильно ветвящееся дерево вариаций, что означает плохую сложность времени и пространства.
Примечание: проблема может быть связана с остовным деревом, и вы можете определить графики G как своего рода направлено остовное дерево. Но имейте в виду, что в моем сценарий пара ребер в G ' может иметь ту же начальную или ту же конечную вершину. Это противоречит некоторым определениям направленных остовных деревьев, используемых в литература.
EDIT: добавлено интуитивное описание, справочная информация и примечание, связанные с охватывающими деревьями.
3 ответов
эта проблема называется Обратная Связь Arc Set. Поскольку это NP-hard, маловероятно, что вы найдете масштабируемый быстрый алгоритм. Однако, если ваши экземпляры малы, то могут работать алгоритмы, такие как один из статьи "о перечислении всех минимальных решений проблем обратной связи" Б. Швиковского и Э. Спекенмейера.
Это может быть полезным: алгоритм перечисления всех направленных остовных деревьев в направленном графе.
Если ваша цель состоит в том, чтобы удалить ребра цикла (разрыв циклов) при сохранении иерархий графов (структур) как можно больше, эта работа может быть полезной:https://github.com/zhenv5/breaking_cycles_in_noisy_hierarchies