#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 — это узлы текущей клики