Loading AI tools
задача нахождения независимого множества вершин графа, имеющего максимальный размер Из Википедии, свободной энциклопедии
Зада́ча о незави́симом мно́жестве относится к классу NP-полных задач в области теории графов. Эквивалентна задаче о клике.
Множество вершин графа называется независимым, если никакие две вершины этого множества не соединены ребром. Другими словами, индуцированный этим множеством подграф состоит из изолированных вершин. Иногда также говорят, что каждое ребро графа инцидентно не более чем одной вершине из независимого множества. Задача распознавания (проблема разрешимости) выглядит так: существует ли в заданном графе G независимое множество размера k? Соответствующая ей оптимизационная задача, она же задача о независимом множестве, формулируется следующим образом: в заданном графе G требуется найти независимое множество максимального размера. Этот размер называют числом независимости, числом внутренней плотности или неплотностью и обозначают как [1][2].
Иногда эту задачу называют поиском наибольшего независимого множества. Не стоит путать это понятие с максимальным независимым множеством, или максимальным по включению независимым множеством, которое определяется как такое независимое множество вершин, что при добавлении к нему ещё одной (любой) вершины исходного графа оно перестаёт быть независимым (вообще говоря, таких множеств может быть несколько и разных размеров). Максимальное по включению независимое множество отнюдь не всегда является наибольшим. В то же время каждое наибольшее независимое множество по определению является также и максимальным по включению. Для нахождения (какого-то) максимального по включению независимого множества можно воспользоваться жадным алгоритмом, работающим за полиномиальное время, тогда как задача о наибольшем независимом множестве принадлежит к классу NP-полных задач.
Максимальное по включению независимое множество является доминирующим множеством. Любой граф содержит максимум 3n/3 максимальных по включению независимых множеств[3], однако бо́льшая часть графов имеет их куда меньше.
Число максимальных по включению независимых множеств в циклах из n вершин — это числа Перрина, а число максимальных по включению независимых множеств в путях с n вершинами задаётся последовательностью Падована[4]. Таким образом, оба числа пропорциональны степени 1,324718, пластическому числу.
Наименьшим независимым подмножеством в графе является любая вершина этого графа.
Множество независимо тогда и только тогда, когда оно является кликой в дополнении графа, так что два понятия дополняют друг друга. Достаточно большие графы без больших клик имеют большие независимые множества, что является предметом исследования в теории Рамсея.
Множество независимо тогда и только тогда, когда его дополнение является вершинным покрытием. Сумма числа независимости и числа вершинного покрытия равна числу вершин графа (первое тождество Галлаи).
Раскраска вершин графа соответствует разбиению его вершин на независимые подмножества. Поэтому минимальное число красок, требующихся для раскраски вершин, хроматическое число , не меньше частного от деления числа вершин и числа независимости .
В двудольных графах, не имеющих изолированных вершин, число вершин в наибольшем независимом множестве равно числу рёбер в наименьшем рёберном покрытии (следствие из теоремы Кёнига).
В информатике изучается несколько вычислительных задач[англ.], связанных с независимыми множествами:
Первые три задачи важны в практических приложениях, последняя же важна для теории NP-полноты для задач, связанных с независимыми множествами.
Задача о независимом множестве и задача о клике являются двойственными: клика в G — это независимое множество в дополнении графа G и наоборот. Таким образом, многие вычислительные результаты могут быть приложены одинаково хорошо к обоим задачам. Например, результаты, связанные с задачей о клике, имеют следующие следствия:
Эту задачу иногда называют «упаковкой вершин».
Задача нахождения наибольшего независимого множества и задача о наибольшей клике полиномиально эквивалентны — можно найти наибольшее независимое множество путём поиска максимальной клики в дополнении графа, так что многие авторы особенно не заботятся о разделении этих двух задач. Обе задачи NP-полны, так что вряд ли их можно решить за полиномиальное время. Тем не менее, задача о наибольшем независимом множестве может быть решена эффективнее, чем за время O(n2 2n), которое даёт полный перебор, проверяющий все подмножества вершин, являются ли они независимыми множествами. Алгоритм Робсона[6] решает задачу за время O(20.276n), используя экспоненциальное пространство. Если есть ограничение на размер (полиномиальность пространства), существует алгоритм решения за время O*(1.2127n)[7].
Вопреки близкой связи между наибольшей кликой и наибольшим независимым множеством в произвольном графе, задачи нахождения независимого множества и клики могут существенно отличаться, когда решаются на специальном классе графов. Например, для разреженных графов (графы, в которых в любом подграфе число рёбер не больше числа вершин, умноженного на некоторую константу) наибольшая клика имеет ограниченный размер и может быть найдена точно за линейное время[8]. Тем не менее, для тех же классов графов, или даже для случая более жёстких ограничений у класса графов с ограниченной степенью, поиск наибольшего независимого множества является MAXSNP-полной[англ.], что означает, что для некоторой константы c (зависящей от степени) NP-трудно найти приближённое решение, отличающееся на множитель c от оптимального[9]. Однако эффективные приближённые алгоритмы известны, но для них гарантированная эффективность хуже, чем этот порог. Например, жадный алгоритм создаёт максимальное по включению независимое множество, на каждом шаге выбирая вершину с минимальной степенью и удаляя её соседей. Этот алгоритм достигает гарантированной эффективности (Δ+2)/3 на графах с максимальной степенью Δ[10].
В некоторых классах графов (включая графы без клешней[11] и совершенные графы[12]; к последнему классу принадлежат и деревья) наибольшее независимое множество может быть найдено за полиномиальное время. Для планарных графов задача о наибольшем независимом множестве остаётся NP-полной для точного решения, но может быть аппроксимирована с любой гарантированной эффективностью c < 1 за полиномиальное время. Похожие приближённые схемы полиномиального времени существуют в любом семействе минорно замкнутых графов[13][14].
В двудольных графах все вершины, не входящие в наименьшее вершинное покрытие, могут быть включены в наибольшее независимое множество (смотри теорему Кёнига). Поэтому наибольшее независимое множество может быть найдено с помощью алгоритма нахождения наибольшего паросочетаний в двудольных графах.
Все максимальные по включению независимые множества можно найти за время O(3n/3).
Название | Лицензия | Язык API | Описание |
---|---|---|---|
igraph | GPL | C, Python, R, Ruby | точное решение |
NetworkX | BSD | Python | приближённое решение, см. процедуру maximum_independent_set |
OpenOpt | BSD | Python | точные и приближённые решения, возможность указать вершины, которые следует включить / исключить. См. класс STAB для деталей и примеров |
Если данный граф является деревом, то задача о независимом множестве эффективно решается методом динамического программирования.
Структура дерева сама подсказывает решение задачи. Именно, обозначим корнем дерева любую вершину и назовем её . Пусть обозначает размер наибольшего независимого множества вершин поддерева, корнем которого является вершина . Тогда ответом на задачу будет являться .
Нетрудно видеть, что если мы включаем вершину u в наибольшее независимое множество, то его мощность увеличивается на 1, но его детей мы брать не можем (так как они соединены ребром с вершиной u); если же мы не включаем эту вершину, то мощность наибольшего независимого множества будет равна сумме размеров независимых множеств детей этой вершины. Остается только выбрать максимум из этих двух вариантов, чтобы получить решение задачи:
где grandchild обозначает всякого «внука» вершины, а child обозначает всякого потомка вершины.
Считаем, что в вершине u хранится :
function get_independent_set(Node u) { если I(u) уже посчитано, то возвратить I(u) // мощность множества, которое можно получить, если не брать вершину u children_sum = 0 // мощность множества, которое можно получить, если взять вершину u grandchildren_sum = 0 // цикл по всем детям for i := 1 to child_num do children_sum = children_sum + get_independent_set(children[i]) // цикл по всем внукам for i:= 1 to grandchildren_num grandchildren_sum = grandchildren_sum + get_independent_set(grandchildren[i]) // запоминаем, чтобы не пересчитывать ещё раз I(u) = max(1 + grandchildren_sum, children_sum) возвратить I(u) }
Вызов get_independent_set(r) даст ответ на задачу. Время выполнения алгоритма, очевидно, O(|V| + |E|).
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.