У меня есть друг, которому нужно вычислить следующее:
В полном графе Kn (k <= 13) имеется k * (k-1) / 2 ребер.
Каждое ребро может быть направлено двумя способами, следовательно, 2 ^ [(k * (k-1)) / 2] разных случаев. </p>
Ей нужно вычислить 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).
Пример: * ** 1022 тысячу двадцать одна *
Минимальный граф K4 имеет 4 вершины, дающие 6 ребер. Следовательно, существует 2 ^ 6 = 64 возможных способов назначения направлений для ребер, если мы пометим 4 вершины A, B, C и D.
В некоторых графах НЕ существует пути от А до В (скажем, из них X), а в некоторых других нет пути от С до 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 есть функция, которая находит расстояние между узлами в ориентированном графе (если он возвращает бесконечность, пути нет), но это немного излишне, поскольку нам не нужно расстояние, просто если есть путь или нет.