Понимание функции Networkx find_cliques()

#networkx #graph-theory #clique #clique-problem

#networkx #теория графов #клик #клик-проблема

Вопрос:

В настоящее время я пытаюсь создать алгоритм поиска кликов на графике, и, к счастью, я нашел документацию от Networkx для функции, которая делает именно это. К сожалению, имена переменных немного краткие, и у меня возникают проблемы с пониманием того, что делает каждая часть кода.

Вот код для find_cliques:

 def find_cliques(G):
    if len(G) == 0:
        return

    adj = {u: {v for v in G[u] if v != u} for u in G}
    Q = [None]

    subg = set(G)
    cand = set(G)
    u = max(subg, key=lambda u: len(cand amp; adj[u]))
    ext_u = cand - adj[u]
    stack = []

    try:
        while True:
            if ext_u:
                q = ext_u.pop()
                cand.remove(q)
                Q[-1] = q
                adj_q = adj[q]
                subg_q = subg amp; adj_q
                if not subg_q:
                    yield Q[:]
                else:
                    cand_q = cand amp; adj_q
                    if cand_q:
                        stack.append((subg, cand, ext_u))
                        Q.append(None)
                        subg = subg_q
                        cand = cand_q
                        u = max(subg, key=lambda u: len(cand amp; adj[u]))
                        ext_u = cand - adj[u]
            else:
                Q.pop()
                subg, cand, ext_u = stack.pop()
    except IndexError:
        pass

  

Это работает просто отлично, но я просто хочу понять, что здесь происходит, и, похоже, я не могу найти какие-либо ресурсы в Интернете, объясняющие это.

Ответ №1:

В документации к find_cliques методу перечислены три ссылки на этот алгоритм. Возможно, вы захотите взглянуть на них или заглянуть в Википедию.

Некоторые переменные:

adj = словарь, хранящий для каждого узла соседей в виде набора

u = узел с наибольшим числом соседей, которые не принадлежат к другой клике.

ext_u = все соседи u, которые не являются членами другой группы

Комментарии:

1. Есть идеи, что такое cand и Q?

2. Если я не ошибаюсь, Q — это узлы текущей клики