我有一个朋友需要计算以下内容:
在完整的图 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, C,D 因为对称。
然后将 P[A !-> B] 计算为“节点 1 和 2 之间没有路径的图的数量”除以图的总数,即 2^[(k*(k-1))/2]。
蛮力方法适用于数学到 K8,但她需要 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。
- 请注意,我们正在处理有向图,因此使用 UT 矩阵的正常表示是不够的。
- 在mathematica中有一个函数可以找到有向图中节点之间的距离,(如果它返回无穷大,则没有路径),但这有点矫枉过正,因为我们不需要距离,只要有路径或不是。