Université de Lorraine, U.H.P.       TD#06

E.S.S.T.I.N. -  2A                   Màj.: 2011.03.13 11h31 / H. Nguyen-Phu 

                                        

        TD-S4#06  Calcul des PCCs (PLCs) des 1-graphes

                   selon Dijkstra,  Floyd  et la fermeture transitive

      

Objectif : Employer la représentation MAV pour calculer les Plus Courts (Longs) Chemins d’un graphe orienté ou non.

Exercice 1 - Algorithme de Dijkstra (une seule source, toutes cibles)

Hypothèse: Le graphe G orienté est évalué par des coûts positifs ou nuls (coûts>=0).

Le coût entre deux sommets <Si, Sj> est donné par la matrice Coût(i, j) des longueurs du graphe qui est la généralisation de la matrice d'adjacence booléenne. Le graphe possède n sommets. Soit un sommet s dans G.

But: On recherche un PCC de s à chacun des autres sommets.

a) Expliciter le principe algorithmique en employant la méthode vorace.

b) Ecrire l'algorithme. Analyser sa complexité et montrer que le temps d’exécution requis pour un graphe de n sommets est O(n²). Généraliser cet algorithme de Dijkstra  pour toute paire de sommets et montrer que la complexité temporelle est polynomiale en O(n^3).

c) Traduction en Java avec un des jeux d’essai du cours. (cf. Dijkstra en langage  C).

 

Exercice 2. -  Autres algorithmes de calcul des PCCs

2.1 Algorithme de Floyd (tout couple de sommets - coûts quelconques)

Hypothèse: Le graphe, valué par des coûts quelconques, n'a pas de circuits ni de circuits absorbants (c'est-à-dire des circuits avec coût total < 0).

a) Compléter l'algorithme ci-dessous:

+ PROC.   MAV::Floyd(D G: Graphe, D/R A: TABLEAU[1..n, 1..n] de REELS, D/R P: TABLEAU[1..n, 1..n] de ENT) {

// A matrice carrée est initialisée aux valeurs de Cout(i,j).

// P matrice carrée est telle que P = Père(i,j) s'il existe un chemin de Si vers Sj. Au départ P(i,j)=i.

// A compléter (cf. Cours manuscrit ) …

}

b) Montrer que la complexité est en O(n^3). En posant p le nombre d'arcs du graphe, comment procéder pour obtenir une complexité temporelle en O[n.p.Ln(n)] ?  Traduction en Java  avec le jeu d’essai suivant:

<S1, S2> = +1; <S2, S4> = -2; <S6, S4> = -5;  <S2, S6> = +3; <S1, S3> = -2; <S3, S2> = +1;  <S3, S4> = +5; <S3, S5> = +4; <S5, S6> = -1; 

Indication:  cf. internet ou FROIDEVAUX et al. "Types de données et algorithmes" pp.477-480, Ediscience, 1994 [à consulter au CDI ESSTIN].

 

2.2 Notion de fermetures de graphes orientés : la fermeture transitive

Tracer le diagramme sagittal du graphe initial G dont la matrice des arcs à quatre colonnes (cf. convention du cours) est donnée par :

      {a    b     1    0}    //  ‘a’  <=>   Sommet  ‘0’  en Java   etc …

      {b    c     1    0}

      {d    a     1    0}

      {d    e     1    0}    // Q. : Pourquoi la 4è colonne est rempli de ‘0’ initialement ?

La fermeture symétrique du graphe ci-dessus est obtenue en transformant les arcs existants en arêtes symétriques. Déduire la nouvelle matrice d’adjacence. Conclure.

La fermeture réflexive du graphe initial ci-dessus est obtenue en reliant tout sommet à lui-même. Déduire la nouvelle matrice d’adjacence. Conclure.

La fermeture transitive d’un graphe orienté G est obtenue en construisant  un graphe G’ ayant les mêmes sommets que G et tel que, pour tous sommets s et t de G’, il existe un arc <s, t> si et seulement si il existe un chemin de s à t dans G.  Construire G’ et déduire la matrice d’adjacence.

 

Applications (à terminer en TPP#5 optionnel):

-         Existe-t-il un chemin reliant deux sommets quelconques ‘i’ et ‘j’ d’un graphe orienté (cf. algo. de Floyd-Warshall )?

-         Quel est le nombre total de chemins ayant pour longueur donnée ‘L’ du même graphe (cf. PCCs via la fermeture transitive) ?

-         Comment modifier les algorithmes ci-dessus pour calculer les PLCs ?

-        Comment vérifier que l’algo. du PCC via la fermeture transitive est plus régulier que celui de Floyd (ou Dijkstra généralisé)  sachant que les trois sont en O(n^3) via des mesures de durées adéquates?