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