2009-08-05 13 views
5

これは初心者でも間違った質問でもよいので、許してください。 Boost Graph Library =>を使用して作成した2つのグラフをメモリに作成し、アーカイブからロードした2つのグラフを比較する方法はありますか(つまり2番目は以前にシリアル化されていましたか?ブーストグラフライブラリで作成された2つのグラフを比較する

私は演算子==はBGLのドキュメントでは提供されていませんが、トラバースと比較の両方を記述する必要があるかどうかはわかりません。チュートリアル、リファレンスページやサンプルへの任意のポインタは、一般的な場合には、事前 ガネーシュ

答えて

6

:それは大規模なグラフのために時間がかかりますのでhttp://www.boost.org/doc/libs/1_39_0/libs/graph/doc/isomorphism.html

これは難しい問題です。

+0

ありがとうstribika。これは私が探しているものを提供するようです。私のグラフは大きくはありません。グラフが1つの親ノードにしか接続されておらず、兄弟(ツリーのようなもの)には接続されていない、各ノードがグラフごとに約30ノード以上あります。 – ossandcad

+0

30が多すぎる可能性があります。ドキュメンテーションはそれがO(n!)と30だと言っています!約10^32です。 – stribika

+2

私は、数千のノードを持つグラフでグラフ同型アルゴリズムを使用しました。実行時間は、ノードの接続方法に大きく依存します(ブーストは使用せず、独自の実装を使用しています)。 – AProgrammer

5

おかげで最も参考になる、Graph Equalityは多項式時間で扱いやすいことが知られていないという問題点です。実際には、合理的な時間内に解決することは事実上不可能かもしれないことを意味する(それはNP-completeであることは知られていないが)。しかし、頂点ラベルが同じであることに懸念がある場合は、両方のグラフですべてのエッジを繰り返し処理し、それぞれのグラフが他のグラフにも存在することを確認するだけで十分です。

編集は:頂点ラベル(各頂点に関連付けられた値)は、両方のグラフに同じであり、ユニークと同等である場合、我々は次のように、容易にO(V LG V + E LG E)に同型確認することができそう:Boost.Graphは==演算子でこれを行うことはできませんが

If |G1| != |G2|, the graphs are non-equal. Abort. 

i = 0 
For each vertex V in G1: 
    G1_M[Label(V)] = V 
    G1_I[V] = i 
    i = i + 1 

For each vertex V in G1: 
    G1_E[V] = sort(map(λDestination -> G1_I[Destination]) Edges[V]) 

For each vertex V in G2: 
    If G1_M[Label(V)] does not exist, the graphs are non-equal. Abort. 
    G2_corresp[V] = G1_M[Label(V)] 
    G2_I[V] = G1_I[G2_corresp[V]] 

For each vertex V in G2: 
    G1_E[V] = sort(map(λDestination -> G2_I[Destination]) Edges[V]) 
    Compare G1_E[G2_corresp[V]] and G2_E[V]. If non-equal, the graphs are non-equal. Abort. 

If we get here, the graphs are equal. 
+0

私は前回チェックしたとき、グラフの同型性はNP完全であるとは証明されませんでしたが、残念ながらNP完全ではないことが証明されていませんでした。 – AProgrammer

+0

これは、_known_多項式時間アルゴリズムがないことを意味するので、すべての実用的な目的のためにNP完全でもよいでしょう:) – bdonlan

+0

Thankd bdonlan。私は自分の用語が間違っていたことに気付かなかった(おそらく私が検索に答えを見つけていなかった理由)。また、これがNPの問題であることも認識していませんでした。私の定義==は、単にノードに格納されているものの平等さと、ノードがそれ自身と他のノードとの間に同じ数のエッジを持つ場合(2つのグラフ間で同じでなければならない)などです。 – ossandcad

関連する問題