クリーク発見のためのブロンケルボスアルゴリズム
-
02-07-2019 - |
質問
誰でも教えてもらえますか、ウェブ上のどこでクリークを見つけるためのブロン-ケルボッシュアルゴリズムの説明を見つけることができますか、それがどのように機能するかをここで説明できますか?
「アルゴリズム457:無向グラフのすべてのクリークの検索」で公開されたことを知っています。本ですが、アルゴリズムを説明する無料のソースが見つかりません。
アルゴリズムのソースコードは必要ありません。その仕組みの説明が必要です。
解決
ACM学生アカウントを持ち、論文のコピーを渡せる人を探してみてください。 http://portal.acm.org/citation.cfm?doid=362342.362367
ダウンロードしたばかりで、わずか2ページの長さで、Algol 60に実装されています!
他のヒント
iのアルゴリズムの説明は次のとおりです: http:// www.dfki.de/~neumann/ie-seminar/presentations/finding_cliques.pdf それは良い説明です...しかし、私はC#でのライブラリまたは実装が必要です-.- '
正しいアルゴリズムがありますここ書き直しましたJavaリンクリストをセットR、P、Xとして使用し、動作する チャームのように(良いことは、アルゴリズムに従って集合演算を行うときに関数「retainAll」を使用することです)。
アルゴリズムを書き換える際の最適化の問題のため、実装について少し考えることをお勧めします
Bron-Kerboschアルゴリズムに頭を包もうとしていたので、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)
価値があるものとして、Java実装を見つけました: http://joelib.cvs.sourceforge.net/joelib/joelib2/src/joelib2/algo/clique/BronKerbosch.java?view=markup
HTH。
論文で指定された両方のバージョンを実装しました。最適化されていないバージョンは、再帰的に解決されると、アルゴリズムを理解するのに非常に役立つことがわかりました。 バージョン1(最適化されていない)のpython実装は次のとおりです。
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
には、見つかったクリークが含まれます。
これを理解すると、最適化されたものを簡単に実装できます。
Boost :: Graphには、Bron-Kerboshアルゴリズムの優れた実装があります。チェックしてください。