このアルゴリズムはk次元のWeisfeiler-Lehmanアルゴリズムのカテゴリに属し、通常のグラフでは失敗することがわかりました。詳細はこちら:
http://dabacon.org/pontiff/?p=4148
元の投稿は次のとおりです。
数年前、私はまさにこの問題(ラベル付きグラフ同型)のためのシンプルで柔軟なアルゴリズムを作成しました。
私はそれを「Powerhash」と名付け、アルゴリズムを作成するには2つの洞察が必要でした。1つ目は、PageRankでも使用されるパワー反復グラフアルゴリズムです。2つ目は、電源反復の内部ステップ関数を、必要なものに置き換える機能です。これを、反復ごとに、およびノードごとに以下を実行する関数に置き換えました。
- ノードの近傍の(前の反復からの)ハッシュをソートします
- 連結されたソート済みハッシュをハッシュする
- ノードのハッシュを新しく計算されたハッシュで置き換える
最初のステップでは、ノードのハッシュは直接の隣接ノードの影響を受けます。2番目のステップでは、ノードのハッシュは、ノードから2ホップ離れた近隣の影響を受けます。N番目のステップでは、ノードのハッシュはノードの周囲の近隣Nホップの影響を受けます。したがって、N = graph_radiusステップのPowerhashの実行を続けるだけで済みます。最後に、グラフの中心ノードのハッシュはグラフ全体の影響を受けます。
最終ハッシュを生成するには、最終ステップのノードハッシュを並べ替え、それらを連結します。その後、最終的なハッシュを比較して、2つのグラフが同型であるかどうかを確認できます。ラベルがある場合は、各ノードについて計算する内部ハッシュに(最初の反復で)ラベルを追加します。
これについて詳しくは、こちらの投稿をご覧ください。
https://plus.google.com/114866592715069940152/posts/fmBFhjhQcZF
上記のアルゴリズムは、「madIS」機能リレーショナルデータベース内に実装されました。アルゴリズムのソースコードは次の場所にあります。
https://github.com/madgik/madis/blob/master/src/functions/aggregate/graph.py