Tengo un DAG de dependencias que contiene muchos bordes redundantes (ver ejemplo a continuación). Quiero un algoritmo "rápido" (es decir, puede manejar un gráfico con varios miles de nodos / bordes) que encuentre un gráfico secundario mínimo.
Por ejemplo:
A -> B -> C
A -> C
en palabras, A es prerrequisito para B, y B es prerrequisito para C, y también A es prerrequisito para C. En este caso, A -> C es redundante (ya que B ya es necesario para llegar a C y A es necesario para llegar a B) .
Ha pasado un tiempo desde que estudié algoritmos, y no estoy seguro de por dónde empezar.
Por cierto, no es crítico que el algoritmo encuentre el mínimo global, el mínimo local está bien (la reducción del borde es solo una optimización del tiempo de ejecución para la próxima etapa del procesamiento).
Además, me doy cuenta de que se trata de un control de calidad de CS y no de programación, pero mi programa está escrito en Python, por lo que me encantaría conocer un módulo de Python o código abierto para hacer esta reducción, en caso de que lo sepas.
¡gracias por adelantado!
Respuestas:
La reducción transitiva de un gráfico dirigido AV Aho, MR Garey y JD Ullman
De acuerdo con Wikipedia , este algoritmo es utilizado por
tred
una herramienta para la reducción transitiva disponible en el paquete GraphViz. Puede ejecutarlo en su gráfico y obtener un gráfico reducido.Esta pregunta es un duplicado de esta pregunta de stackoverflow .
código aquí
graphviz/tools/src/tred.c
hace DFS uso. ;-)fuente
tred
, gracias.Terminé resolviéndolo de esta manera:
Mi estructura de datos está hecha de
dependends
diccionario, desde una identificación de nodo a una lista de nodos que dependen de él (es decir, sus seguidores en el DAG).No he calculado la complejidad exacta, pero se tragó mi gráfico de varios miles en una fracción de segundo.
fuente