以下を計算する必要がある友人がいます。
完全なグラフ Kn (k<=13) には、k*(k-1)/2 個のエッジがあります。各エッジは 2 つの方法で方向付けられるため、2^[(k*(k-1))/2] の異なるケースになります。
彼女は計算する必要があるP[A !-> B && C !-> D] - P[A !-> B]*P[C !-> D]
X !-> Y は「X から Y への経路がない」ことを意味し、P[ ] は確率です。
したがって、ブルートフォース アルゴリズムは 2^[(k*(k-1))/2] 個の異なるグラフをすべて調べることであり、それらは完全であるため、各グラフで A、B の 1 つのセットを考慮するだけで済みます。 C、D は対称性によるものです。
次に、P[A !-> B] は、「ノード 1 と 2 の間にパスがないグラフの数」をグラフの総数で割った値、つまり 2^[(k*(k-1))/2] として計算されます。
ブルートフォース法は K8 までの Mathematica で機能しますが、彼女には K9、K10... K13 までが必要です。
明らかに、ケースで最短経路を見つける必要はありません。最短経路があるかどうかを見つけたいだけです。
最適化の提案はありますか? (これは典型的な Project Euler の問題のように聞こえます)。
例:
最小グラフ K4 には 4 つの頂点があり、6 つのエッジがあります。したがって、4 つの頂点 A、B、C、および D にラベルを付ける場合、エッジに方向を割り当てる方法は 2^6 = 64 通りあります。
一部のグラフでは、A から B へのパスはありません (それらの X としましょう)。他のグラフでは、C から D へのパスはありません (Y としましょう)。しかし、一部のグラフでは、A から B への経路がなく、同時に C から D への経路もありません。これらは W です。
だからP[A !-> B]=X/64
、P[C !-> D]=Y/64
そしてP[A !-> B && C !-> D] = W/64
。
アップデート:
- A、B、C、D は 4 つの異なる頂点であるため、少なくとも K4 が必要です。
- DIRECTED グラフを扱っていることに注意してください。したがって、UT 行列を使用した通常の表現では十分ではありません。
- Mathematica には、有向グラフのノード間の距離を求める関数があります (無限大を返す場合、パスはありません)。ただし、パスまたはいいえ。