Алгоритмы для поиска Максимального Независимого Множества. Независимое множество в графе – это множество вершин, каждая из которых не связана ни с какой другой вершиной из этого множества дугой. Оптимальное независимое множество – независимое множество, такое что, уже нельзя будет добавить к нему никакую вершину, не нарушив независимости. Максимальное независимое множество – максимальное по величине из всех оптимальных независимых множеств графа. Существую точные и приближенные алгоритмы для нахождения независимых множеств, но в рамках данной работы рассматривались только приближенные. Для каждого алгоритма будет указана его временная сложность ( time complexity ). Она показывает время затрачиваемое алгоритмом на поиск решения, и является функцией от величины входных данных – в данном случае от размера графа, а точнее от количества его вершин. Алгоритм Рамсея. На обычных графах ранее 1990 года все алгоритмы показывали только тривиальный коэффициент производительности N (отношение найденного решения к оптимальному). Лишь в 1990 Рамсей сформулировал теорему на основе которой потом был создан алгоритм, показывающей лучшее время для решения двух математический проблем – поиск максимального независимого множества и максимальной клики в графе. Временная сложность этого алгоритма – O(N/log^2(N)). Насколько известно существует несколько версий этого алгоритма. Классическую же версию можно представить так: Ramsey (G) If G = 0 then return (0, 0) choose some v from G (C1,I1) = Ramsey(N(v)) (C2,I2) = Ramsey(N(v)) return (larger of (CI U {v}, C2), larger of (I1, 12 U {v})) CliqueRemoval (G) i= 1 (Ci,Ii) = Ramsey (G) While G != 0 do G = G-Gi i++ (Ci,Ii) = Ramsey (G) end return ((max{I,j = 1} Ij), {C1, C2, ..., Ci}) Ramsey для конкретного графа находит самую большую клику и некоторое оптимальное независимое множество. Clique Removal сначала запускает алгоритм на всем графе, а затем последовательно сначала удаляет из графа найденную самую большую клику и запускает алгоритм снова на остатке графа. При реализации данного алгоритма пришлось присвоить каждой вершине специфическое имя, чтобы не возникало путаницы при удалении вершин. Алгоритм на основе полиномов многих переменных (J. ABELLO, S. BUTENKO, P.M. PARDALOS, AND M.G.C. RESENDE). В работе с описанием данного алгоритма на самом деле упоминается не один он, а его целых четыре разновидности. Но если рассмотреть один, то все остальные могут быть логично выведены из него. Степень вектора – число ребер выходящих из него, и если есть цикл, то он считается дважды. Максимальная степень графа (Δ(G)) – это максимальная из степеней его векторов. Полиномы, использующиеся в алгоритме: Ai (x) = Произведение всех таких xj, что j-ая вершина соединена с i-ой ребром Bi (x) = Сумма произведений ( 1 – xj), такого что j-ая вершина соединена с i-ой ребром, на все xk, такие что k-ая вершина соединена с j-ой ребром и при этом k!=i INPUT: вектор x0 с N координатами и каждая из координат принадлежит отрезку [0,1] OUTPUT: максимальное независимое множество (мнм) 0. v := x0; 1. for i = 1,.. N do if Ai(v) > Bi(v) then vi := 0, else vi := 1 ; 2. for i = 1,.. N do if Ai(v) = 1 then vi := 0 ; 3. МНМ = { i = {1, 2, .. N} : vi = 0}; END Если говорить проще, то каждой вершине в начале алгоритма присваивается некоторое число принадлежащее отрезку [0,1]. Далее для каждой вершины вычисляются вышеуказанные функции и вместо бывшего значения записывается новое – 0, либо 1, в зависимости от результата неравенства (шаг 1). Основа МНМ заложена – это все вершины со значениями равными 0. Но возможно мы еще можем добавить к этому множеству пару вершин, поэтому проводим проверку как в шаге 2. Сложность представленного алгоритма - O(Δ(G) ^2 N). Производительность алгоритма во многом зависит от хорошего выбора начальной точки, а так же от порядка просматриваемых вершин. Единого решения нет, можно например, выбирать следующую вершину с наименьшим количеством соседей, или наоборот. Так же можно выбирать просматриваемые вершины в шаге 1 и 2 по разным алгоритмам. В реализации в качестве начальных значений для вершин берется 0.5. Значения присваиваются уже внутри класса-алгоритма, перед его выполнением. Вершины берутся в порядке их поступления по итератору, потому что на тестируемых графах на точность результатов специальные способы не показали свою эффективность, а на время выполнения алгоритма они не влияют. Тестирование алгоритмов: Число вершин 0 10 25 50 100 200 350 Время в секундах затраченное алг. Рамсея затраченное Полиномиальным алг. 0 0 0 0 0 0 0,016 0,016 0,014 0 1,281 0,016 11,789 0,063