2013-01-18 3 views
6

NKむしろN = 8とK = 3の周りに、大規模なセットは、環状および非環状グラフを含むことができません。各グラフは、多数の重み付けされたグラフをサンプリングするためのテンプレートとして機能します。列挙グラフ

私の関心は、トポロジモチーフの役割であるので、私はお互いに対称である任意の二つのグラフの重みをサンプリングしたくない、対称は、頂点のない順列はそれを変換1つのグラフ内に存在しないことを意味しますもう一方に直接の後継者または前任者の制限に違反しているため(それらのほとんど)隣接行列とすべてのそれらを排除 -

素朴な解決策は、2 ^(1)N *(N)を考慮するだろう。 n = 8の場合、それはまだ表現するのに十分なビット数であり、uint64_tの中に各マトリックスを快適に列挙します。

行数と列数を追跡することはもう1つ改善されますが、実際のボトルネックは結果セットにグラフを追加することです。この時点で、すでにセット内にあるグラフに対して対称性をテストする必要があります。 n = 8の場合、挿入操作あたりすでに40,000を超える置換があります。

誰でも私にこれをもっとスマートな方法で行うことができるアルゴリズムを参照できますか?このような包括的なグラフジェネレータを既に実装しているC、C++、Java、Python用のグラフライブラリはありますか?誰かがすでに、すべてのグラフを合理的に「集計」しているリポジトリがありますかnk

+0

"The Art of Computer Programming、Volume 4"のようなものです。 – templatetypedef

答えて

1

グラフの同型性は、私の意見では、あなた自身を実装することについて考えるべきではありません。現在の最先端技術はBrendan McKayのNauty(および関連するプログラム/ライブラリ)であると私は信じています。これはちょっとした苦労ですが、あなた自身の素朴なグラフ同型性を避ける価値があります。また、主に無向グラフに対応していますが、有向グラフも可能です。 geng(無向グラフを生成する)とdirectg(下にあるグラフが与えられた有向グラフを生成する)ユーティリティをチェックアウトすることができます。

+0

ありがとうございます、少なくとも、+1。 Nautyの 'geng'は度の制約を許しているように見えます(k = 3' -d1'は下限、-D3'は上層)。しかし、「directg」はこれらの制約を尊重しないであろうし、変換規則のコンビナトリアルは自明ではないだろう。度1は自己、内外を強制し、次数3はすべて内外に強制する。非常に美しい方法で隣人に依存するでしょうか? –

+0

これを動作させるには、おそらくいくつかの手品をする必要があります。おそらく、-d6と-D6を使って* geng *を開始し、6つの正規の無向グラフのリストを取得し、それらのグラフを* directg *に送り、indegreeとoutdegree = 3を満たさないものを投げ捨てますすべてのノード。これがあなたのために十分に速いのかどうかは確かではありませんが、私は同型性をあなた自身でチェックするよりも速いと賭けるでしょう。 – mhum

+0

それはたくさんの意味があります。ありがとう。 –

1

これはあなたの質問で何かを逃したように思われるので、答えよりもコメントです。

まず、このようなグラフが非周期的である可能性はありますか?

私はあなたの対称性制約についても疑問に思います。このようなグラフをすべて対称にするわけではありませんか?接続行列の行と列を並べ替えることはできますか?

たとえば、グラフで自己接続を許可する場合、次の接続マトリックスが条件を満たすかどうかを確認します。

1  1  0  0  0  0  0  1 
1  1  1  0  0  0  0  0 
0  1  1  1  0  0  0  0 
0  0  1  1  1  0  0  0 
0  0  0  1  1  1  0  0 
0  0  0  0  1  1  1  0 
0  0  0  0  0  1  1  1 
1  0  0  0  0  0  1  1 

このマトリックスから出発し、すべての行と列三の和を持っている場合、全てのこのようなグラフを得ることの行と列を入れ替えすることが可能ではないのですか?

このようなマトリックスの一例は、上記のマトリックスAから(MATLABを使用して)以下の方法で得ることができる。

>> A(randperm(8),randperm(8)) 

ans = 

    0  1  0  0  0  1  1  0 
    0  0  1  0  1  0  1  0 
    1  1  0  1  0  0  0  0 
    1  1  0  0  0  1  0  0 
    1  0  0  1  0  0  0  1 
    0  0  1  1  0  0  0  1 
    0  0  1  0  1  0  0  1 
    0  0  0  0  1  1  1  0 

PS。この場合、私は対角に唯一0個の行列を得るためにコマンドを数回繰り返しました。:)

編集

ああ、私は私が間違っていたことをあなたのコメントから参照してください。もちろん、パーミュテーションインデックスは行と列で同じでなければなりません。私はグラフと自己接続で始まり、順列の後にそれらなしで得たときにそれを気づいたはずです。

ランダム同型順列は、代わりに次のようになります。すべて自己の接続を維持します

idx = randperm(8); 
A(idx,idx); 

を。

おそらく、これは行列が生成されるときには何らかの使用になる可能性がありますが、それは私が思ったほど有用ではありません。

+0

ありがとうございます、@ user1884905。 k = 3の場合、これらのグラフは実際には周期的である。マトリックスを並べ替えるあなたのアイデアはきちんとしています。体系的に実行するには、 'perms'をチェックします。同型性をテストするために、置換行列のインデックスは行と列で同じなので、ジェネレータはそのような同一のインデックスを除外することができます。いくつかの編集で、私はこれをアップヴォートするでしょう。しかし、異なる行と列の索引付けを伴う置換は必要であり、同型写像を避けるには不十分であり、この節約はまだわかりません。 n = 3、k = 2の場合、ほとんどの結果は同形ですが、n >> kの衝突では落ちるはずです。 –

+0

@ s.bandaraコメントをいただきありがとうございます。私はちょっと離れていました。私はまだ非循環グラフについて疑問に思います。非循環グラフには、後続ノードがないノードと前ノードがないノードを持つ必要はありませんか? – user1884905

+0

良い点。私は周期的かどうかは私の基準の一部ではないと言っていたが、今はすべてがサイクルを持つことになると思う。 –