Алгоритм / аппроксимация для комбинированного независимого множества / расстояния Хэмминга
Вход: Граф G Вывод: несколько независимых наборов, так что членство узла во всех независимых наборах уникально. Таким образом, узел не имеет соединений ни с одним узлом в своем собственном наборе. Вот пример пути.
после разъяснения здесь еще rephrasal:
разделите данный Граф на множества так, чтобы
-
Я могу отличить узел от всех других по его членству в наборах, например, если узел i присутствует только в наборе нет другого узла должен присутствовать в наборе только
если узел j присутствует в множестве A и B, то никакой другой узел не должен присутствовать только в множестве A и B. если членство узлов кодируется битовым шаблоном, то эти битовые шаблоны имеют расстояние Хэмминга по крайней мере один
если два узла смежны в графе, они не должны присутствовать в одном множестве, следовательно, быть независимым множеством
пример: B не имеет смежных узлов D=>A, A=>D
устранение:
- A B/
- / B D
A имеет битовый шаблон 10 и не имеет соседнего узла в своем наборе. B имеет битовый шаблон 11 и нет соседнего узла, D имеет 01 поэтому все узлы имеют расстояние Хэмминга не менее 1 и нет соседних узлов => correct
неправильно, потому что D и A связаны:
- A D B
- / D B
A имеет битовый шаблон 10 и D в своем наборе, они примыкающий. B имеет битовый шаблон 11 и нет соседнего узла, D имеет 11, как и B, поэтому в этом решении есть две ошибки, и поэтому оно не принято.
конечно, это должно быть расширено до большего количества наборов по мере увеличения количества узлов в графике, так как вам нужно по крайней мере log(n)
наборы.
Я уже написал преобразование в MAX-SAT, чтобы использовать sat-решатель для этого. но количество пунктов просто велико. Было бы неплохо использовать более прямой подход. До сих пор у меня есть приближение, но я хотел бы получить точное решение или, по крайней мере, лучшее приближение.
я попробовал подход, в котором я использовал Рой частиц для оптимизации от произвольного решения к лучшему. Однако время работы довольно ужасно, и результаты далеки от отличных. Я ищу динамический алгоритм или что-то еще, однако я не могу понять, как разделить и победить эту проблему.
2 ответов
не полный ответ, и я не знаю, насколько он будет Вам полезен. Но вот:
расстояние Хэмминга поражает меня как красная селедка. Ваше заявление о проблеме говорит, что оно должно быть не менее 1, но может быть 1000. Достаточно сказать, что битовая кодировка для членства в наборе каждого узла уникальна.
ваше заявление о проблеме не раскрывает его, но ваше решение выше предполагает, что каждый узел должен быть членом по крайней мере 1 набора. то есть. немного кодировки всех 0 не разрешено членство в наборе любого узла.
игнорируя подключенные узлы на мгновение, непересекающиеся узлы просты: просто пронумеруйте их последовательно с неиспользуемой битовой кодировкой. Оставь их напоследок.
ваш пример выше использует направленные края, но опять же, это поражает меня как отвлекающий маневр. Если A не может быть в том же множестве, что и D, потому что A=>D, D не может быть в том же множестве, что и A независимо от того, D= > A.
вы упоминаете, что вам нужны хотя бы наборы log(N). Вы также будете иметь самое большее N множеств. Полностью связный граф (с (N^2-N)/2 неориентированными ребрами) потребует N наборов, каждый из которых содержит один узел.
фактически, если ваш график содержит полностью связанный симплекс M измерений (M в 1..N-1) с M+1 вершинами и (M^2+M)/2 неориентированными ребрами вам потребуется не менее M+1 наборов.
в приведенном выше примере у вас есть один такой симплекс (M=1) с 2 вершинами {A,D} и 1 (неориентированным) ребром {(A,D)}.
казалось бы, ваша проблема сводится к поиск самых больших полностью связанных симплексов на графике. Иначе говоря, у вас есть проблема маршрутизации: сколько измерений вам нужно для маршрутизации ребер, чтобы они не пересекались? Это не похоже на масштабируемую проблему.
первый большой симплекс найден легко. Каждый вершинный узел получает новый набор со своим битом.
непересекающиеся узлы просты. Как только подключенные узлы будут обработаны, просто пронумеруйте непересекающиеся узлы, последовательно пропуская любой ранее используемый бит узоры. Из приведенного выше примера, поскольку A и D принимают 01 и 10, следующий доступный битовый шаблон для B равен 11.
сложной частью становится то, как сложить все оставшиеся симплексы как можно больше в существующий диапазон, прежде чем создавать новые наборы с новыми битами. При складывании необходимо использовать 2 или более бита (наборов) для каждого узла, и биты (наборы) не должны пересекаться с битами (наборами) для любого соседнего узла.
рассмотрим, что происходит с вашим примером выше, когда один добавляет другой узел, C, к примеру:
Если C соединяется непосредственно с A и D, то исходной задачей становится нахождение 2-симплекса с 3 вершинами {A,C,D} и 3 ребрами {(A,c),(A,D),(C,D)}. Как только A, C и D берут битовые шаблоны 001, 010 и 100, самый низкий доступный битовый шаблон для непересекающегося B-011.
Если, с другой стороны, C соединяет непосредственно A или D, но не оба, граф имеет два 1-симплекса. Предположим, мы найдем 1-симплекс с вершинами {A, D}, сначала дающими их битовые шаблоны 01 и 10, проблема затем становится, как сложить C в этот диапазон. Единственный битовый шаблон с по крайней мере 2 битами-11, но он пересекается с тем узлом, к которому подключается C, поэтому мы должны создать новый набор и поместить C в него. На данный момент, решение аналогично приведенному выше.
Если C непересекается, либо B, либо C получит битовый шаблон 11, а оставшемуся потребуется новый набор и получить битовый шаблон 100.
предположим, что C подключается к B, но не к A или D. опять же, граф имеет два 1-симплекса, но на этот раз непересекающихся. Предположим, что {A, D} найден первым, как указано выше, давая A и D битовые шаблоны 10 и 01. Мы можем сложить B или C в существующий диапазон. Единственным доступным битовым шаблоном в диапазоне является 11, и либо B, либо C могут получить этот шаблон, поскольку ни один из них не соседствует с A или D. После использования 11 не остается битовых шаблонов с 2 или более битами, и нам придется создать новый набор для оставшегося узла, давая ему битовый шаблон 100.
предположим, C соединяется со всеми 3 A, B и D. В этом случае граф имеет 2-симплекс с 3 вершинами {A,C,D} и 1-симплекс с 2 вершинами {B, C}. Исходя из вышеизложенного, после обработки наибольшего симплекса, A, C и D будут иметь битовые шаблоны 001, 010, 100. Для складывать B в этот ряд, имеющиеся картины бита с 2 или больше битов комплект являются следующими: 011, 101, 110 и 111. Все они, кроме 101, пересекаются с C, поэтому B получит битовый шаблон 101.
тогда возникает вопрос:как эффективно можете ли вы найти самые большие полностью подключенные симплексы?
если найти самый большой полностью подключенный симплекс слишком дорого, можно было бы поставить приблизительную верхнюю границу потенциальных полностью связанных симплексов, найдя максимальные минимумы в терминах связей:
стреловидность через края уточняя вершин графа соединительные кромки.
для каждого подключенного узла, создание массив отсчетов Cn изначально равен нулю где Cn-количество ребер подключен к узлу n.
снова проведите через ребра для подключенных узлов n1 и n2, увеличить количество в n1 соответствует Cn2 и наоборот. Если Cn2 > Cn1, обновите последний счетчик в массиве n1 и наоборот.
снова пройдите через подключенные узлы, вычисляя верхнюю границу самый большой симплекс каждый узел может быть частью. Вы могли бы построить ячейка массива со списком вершин для каждой верхней границы, когда вы проходите через узлы.
работа через блок голуби-отверстия от самого большого к самому небольшому извлекать и складывание узлов в уникальные наборы.
Если ваши узлы находятся в множестве N и ваши ребра в множестве E, сложность будет: O (|N|+|E / +O (Шаг 5))
Если приведенного выше приближения достаточно, возникает вопрос:насколько эффективно вы можете складывать узлы в существующие диапазоны с учетом требований?
Это может быть не ответ, который вы могли бы ожидать, но я не могу найти место, чтобы добавить комментарий. Поэтому я печатаю его прямо здесь. Я не совсем понимаю ваш вопрос. Или для понимания нужны конкретные знания? Что такое этот независимый набор? Как я знаю, узел в независимом множестве из направленного графа имеет двусторонний путь к любому другому узлу в этом множестве. Ваше представление то же самое?
Если эта проблема похожа на то, что я предполагаю, независимые множества могут быть найдены этим алгоритмом: 1. делать глубина-первый поиск на направленном графике, записывает время, когда дерево, укорененное этим узлом, пересекается. 2. затем переверните все ребра на этом графике 3. выполните поиск глубины снова на модифицированном графике. Algorihtm точно объясняется книгой "введение в alogrithm"