Алгоритм Брон-Кербоша для поиска клики - PullRequest
11 голосов
/ 27 сентября 2008

Может кто-нибудь сказать мне, где в Интернете я могу найти объяснение алгоритма Брон-Кербоша для поиска клики или объяснить здесь, как он работает?

Я знаю, что он был опубликован в книге "Алгоритм 457: поиск всех кликов неориентированного графа", но я не могу найти бесплатный источник, который будет описывать алгоритм.

Мне не нужен исходный код для алгоритма, мне нужно объяснение того, как он работает.

Ответы [ 7 ]

8 голосов
/ 30 марта 2010

Я нахожу объяснение алгоритма здесь: http://www.dfki.de/~neumann/ie-seminar/presentations/finding_cliques.pdf это хорошее объяснение ... но мне нужна библиотека или реализация в C # -.- '

4 голосов
/ 27 сентября 2008

Попробуйте найти кого-нибудь с учетной записью студента ACM, который может дать вам копию документа, который находится здесь: http://portal.acm.org/citation.cfm?doid=362342.362367

Я только что загрузил его, и он занимает всего две страницы, с реализацией в Algol 60!

2 голосов
/ 12 октября 2008

Здесь есть правильный алгоритм здесь Я переписал его, используя Java-списки ссылок как наборы R, P, X, и он работает как талисман (хорошая вещь - использовать функцию «retainAll» при выполнении операций над множествами в соответствии с алгоритмом).

Я предлагаю вам немного подумать о реализации из-за проблем оптимизации при переписывании алгоритма

1 голос
/ 25 июня 2014

Я также пытался обернуть голову вокруг алгоритма Брон-Кербоша, поэтому я написал свою собственную реализацию на python. Он включает в себя тестовый пример и некоторые комментарии. Надеюсь, это поможет.

class Node(object):

    def __init__(self, name):
        self.name = name
        self.neighbors = []

    def __repr__(self):
        return self.name

A = Node('A')
B = Node('B')
C = Node('C')
D = Node('D')
E = Node('E')

A.neighbors = [B, C]
B.neighbors = [A, C]
C.neighbors = [A, B, D]
D.neighbors = [C, E]
E.neighbors = [D]

all_nodes = [A, B, C, D, E]

def find_cliques(potential_clique=[], remaining_nodes=[], skip_nodes=[], depth=0):

    # To understand the flow better, uncomment this:
    # print (' ' * depth), 'potential_clique:', potential_clique, 'remaining_nodes:', remaining_nodes, 'skip_nodes:', skip_nodes

    if len(remaining_nodes) == 0 and len(skip_nodes) == 0:
        print 'This is a clique:', potential_clique
        return

    for node in remaining_nodes:

        # Try adding the node to the current potential_clique to see if we can make it work.
        new_potential_clique = potential_clique + [node]
        new_remaining_nodes = [n for n in remaining_nodes if n in node.neighbors]
        new_skip_list = [n for n in skip_nodes if n in node.neighbors]
        find_cliques(new_potential_clique, new_remaining_nodes, new_skip_list, depth + 1)

        # We're done considering this node.  If there was a way to form a clique with it, we
        # already discovered its maximal clique in the recursive call above.  So, go ahead
        # and remove it from the list of remaining nodes and add it to the skip list.
        remaining_nodes.remove(node)
        skip_nodes.append(node)

find_cliques(remaining_nodes=all_nodes)
0 голосов
/ 17 июня 2012

Boost :: Graph имеет отличную реализацию алгоритма Брон-Кербоша, проверьте его.

0 голосов
/ 28 января 2012

Я реализовал обе версии, указанные в статье. Я узнал, что неоптимизированная версия, если ее решить рекурсивно, очень помогает понять алгоритм. Вот реализация Python для версии 1 (неоптимизированная):

def bron(compsub, _not, candidates, graph, cliques):
    if len(candidates) == 0 and len(_not) == 0:
        cliques.append(tuple(compsub))
        return
    if len(candidates) == 0: return
    sel = candidates[0]
    candidates.remove(sel)
    newCandidates = removeDisconnected(candidates, sel, graph)
    newNot = removeDisconnected(_not, sel, graph)
    compsub.append(sel)
    bron(compsub, newNot, newCandidates, graph, cliques)
    compsub.remove(sel)
    _not.append(sel)
    bron(compsub, _not, candidates, graph, cliques)

И вы вызываете эту функцию:

graph = # 2x2 boolean matrix
cliques = []
bron([], [], graph, cliques)

Переменная cliques будет содержать найденные клики.

Как только вы поймете это, вы легко сможете реализовать оптимизированный.

0 голосов
/ 27 сентября 2008

Для чего это стоит, я нашел реализацию Java: http://joelib.cvs.sourceforge.net/joelib/joelib2/src/joelib2/algo/clique/BronKerbosch.java?view=markup

НТН.

...