n個の頂点を持つすべての有向グラフのセットを作成したいと思います。各頂点にはk個の直接の後継者とk個の直接の先行者があります。nとkはそれほど大きくなく、n = 8 とk = 3 程度です。セットには循環グラフと非循環グラフが含まれます。各グラフは、多数の加重グラフをサンプリングするためのテンプレートとして機能します。
私の関心はトポロジー モチーフの役割にあるため、互いに対称な 2 つのグラフの重みをサンプリングしたくありません。対称性とは、一方のグラフを他方のグラフに変換する頂点の順列が存在しないことを意味します。
単純な解決策は、2 ^ ( n * ( n - 1)) 隣接行列を考慮し、直接の後継者または先行者の制約に違反しているすべての (それらのほとんど) を排除することです。n = 8 の場合でも、 a 内で各行列を快適に表現して単純に列挙するのに十分な数のビットuint64_t
です。
行数と列数を追跡することは別の改善ですが、実際のボトルネックはグラフを結果セットに追加することです。その時点で、既にセットにある他のグラフに対して対称性をテストする必要があります。n = 8 の場合、挿入操作ごとに既に 40,000 を超える順列になります。
このすべてをよりスマートな方法で行うことができる、私が読むことができるアルゴリズムを誰かに紹介してもらえますか? このような包括的なグラフ ジェネレーターを既に実装している C、C++、Java、または Python 用のグラフ ライブラリはありますか? 合理的なnとkのすべてのグラフを誰かが既に「集計」しているリポジトリはありますか?