Предполагая, что у меня есть куча зависимостей между некоторыми задачами:
A --> B
A --> D
B --> C
C --> D
E --> F
F --> G
Таким образом, что A → B означает, что B может работать только после завершения A.
Как я могу обнаружить и удалить бесполезные зависимости?
В этом случае "A → D" вызывает D зависит от C, который зависит от B и B, зависит от A.
мне удалось найти более легкое решение для реализации, чем предлагаемое stuXnet.
Используя библиотеку Jung, я проверяю, существует ли более одного пути между каждой парой данной зависимости. Если это так, то эта зависимость, безусловно, не нужна, поэтому мне просто нужно удалить соответствующий край.
Переведя это в матрицу смежности, вы получите следующее:
A B C D E F G
A 0 1 0 1 0 0 0
B 0 0 1 0 0 0 0
C 0 0 0 1 0 0 0
D 0 0 0 0 0 0 0
E 0 0 0 0 0 1 0
F 0 0 0 0 0 0 1
G 0 0 0 0 0 0 0
Умножение этой матрицы на результат приведет к созданию новой матрицы, рассказывающей о том, сколько разных способов от каждого узла к каждому, используя два шага. Умножая его снова, вы увидите результат для трех шагов и т.д.
Вообще говоря, A раз k приведет к тому, что матрица сообщит вам количество разных путей от одного узла к другому, выполнив k шагов.
Используя эту информацию, вы можете попытаться определить зависимости между узлами/задачами, описанными несколькими путями. Между A и D вы увидите путь с A ^ 1 (A → D) и в ^ 3 (A → B → C → D).
После того, как эти множественные пути от узла X до узла Y будут замечены, вы можете удалить прямую зависимость в исходной матрице смежности.