transitive algorithme de réduction: pseudo-code?
J'ai été à la recherche d'un algorithme pour effectuer une réduction transitive sur un graphique, mais sans succès. Il n'y a rien dans mon algorithmes de la bible (Introduction Aux Algorithmes par Cormen et al) et même si j'ai vu l'abondance de la fermeture transitive de pseudo, je n'ai pas été en mesure de traquer n'importe quoi pour une réduction. Le plus proche que j'ai est qu'il y en a un dans "Algorithmische Graphentheorie" de Volker Turau (ISBN:978-3-486-59057-9), mais malheureusement je n'ai pas accès à ce livre! Wikipédia est inutile et Google est encore rien. :^(
Personne ne sait d'un algorithme pour l'exécution d'une réduction transitive?
Vous devez vous connecter pour publier un commentaire.
Voir Harry Hsu. "Un algorithme pour trouver un minimum de graphe équivalent d'un digraphe.", Journal de l'ACM, 22(1):11-16, janvier 1975. Le simple cube algorithme ci-dessous (à l'aide d'un N x N chemin de la matrice) suffit pour les DAGs, mais Hsu généralise à cycliques graphiques.
Le sens de base de la transitives algorithme de réduction que j'ai utilisé est
La fermeture transitive de l'algorithme que j'ai utilisé dans le même script est très similaire, mais la dernière ligne est
if (x,z) != (x,y) && (x,z) != (y,z)
avantdelete edge...
d'éviter les erreurs de délétions dans le cas de cycles. Autre que cela, et bien que ce serait mieux d'avoir un linéaire plus rapide en temps de l'algorithme, j'aime cette réponse: simple et sympathique.[0,1,2,3,4,5]
où Un des points de B pour tous A et B (même quand ils sont les mêmes). Il devrait produire quelque chose comme 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 0, mais l'exécution de cet algorithme (avec mon tweak) apporte 5 -> 2 et 5 -> 4 en plus de l'0 -> ... -> 5 -> 0. Le courant sans mon tweak ne produit pas de bords à tous.foreach y in graph.vertices: foreach x in graph.vertices: foreach z in graph.vertices: add edge xz if edges xy and yz exist OR edge xz exist
. Remarque l'ordre différent dansx
ety
. Je pensais que l'ordre d'importance. Il n'en a pas?La Article de Wikipedia sur transitive de réduction de points pour une mise en œuvre au sein de GraphViz (qui est open source). Pas exactement de pseudo, mais peut-être un endroit où commencer?
LEDA comprend un transitive algorithme de réduction. Je n'ai pas de copie de la LEDA livre, et de plus, cette fonction pourrait avoir été ajouté après le livre a été publié. Mais si il est là, puis il y aura une bonne description de l'algorithme.
Google points de un algorithme que quelqu'un a suggéré d'inclure dans Boost. Je n'ai pas essayer de le lire, donc peut-être pas correct?
Aussi, cette peut-être en valeur un regard.
L'algorithme de "girlwithglasses" oublie que redondant bord pourrait s'étendre sur une chaîne de trois bords. Pour corriger, calculer Q = R x R+ R+ est la fermeture transitive, puis supprimez tous les bords de R dans Q. Voir aussi l'article de Wikipedia.
Basé sur la référence fournie par Alan Donovan, qui dit que vous devez utiliser le chemin d'accès de la matrice (qui a un 1 s'il existe un chemin d'accès du nœud i au nœud j) au lieu de la matrice de contiguïté (qui a 1 seulement si il existe une arête du nœud i au nœud j).
Quelques exemples de code python ci-dessous pour afficher les différences entre les solutions
De sortie:
Profondeur d'abord de l'algorithme en pseudo-python:
L'algorithme n'est pas optimal, mais il traite avec le multi-bord-span problème des solutions précédentes. Les résultats sont très similaires à ce tred de graphviz produit.
porté à java /jgrapht, le python échantillon sur cette page à partir de @Michael Clerx:
de test de l'unité :
test de sortie