• Aucun résultat trouvé

Deuxième partie II A

N/A
N/A
Protected

Academic year: 2022

Partager "Deuxième partie II A"

Copied!
77
0
0

Texte intégral

(1)

Deuxième partie II

A LGORITHMES DANS LES GRAPHES

(2)

Représentation en mémoire : matrice d’incidence 1/2

Matrice d’incidence

SoitG= (V,E)graphe simple non orienté avecn=|V|etm=|E| matrice d’incidence de G :matriceM∈ Mn,m({0,1})tel que

mve=

(1 si sommetv incident à l’arêtee

0 sinon , ∀v ∈V,e∈E

1 2

3 4

5

grapheG

{1,2} {1,3} {1,4} {2,3} {2,5} {3,4} {3,5}

1 1 1 1 0 0 0 0

2 1 0 0 1 1 0 0

3 0 1 0 1 0 1 1

4 0 0 1 0 0 1 0

5 0 0 0 0 1 0 1

matrice d’incidence deG

Remarque :d(v) = X

e∈E

mve, ∀v ∈V

(3)

Représentation en mémoire : matrice d’incidence 2/2

Matrice d’incidence

SoitG~ = (V,E)graphe simple orienté avecn=|V|etm=|E|

matrice d’incidence deG :~ matriceM∈ Mn,m({−1,0,1})tel que mve=

−1 si sommetv origine de l’arce 1 si sommetv but de l’arce 0 sinon

, ∀v ∈V,e∈E

1 2

3 4

5

grapheG~

(1,2) (1,4) (2,3) (2,5) (3,1) (3,4) (3,5)

1 −1 −1 0 0 1 0 0

2 1 0 −1 −1 0 0 0

3 0 0 1 0 −1 −1 −1

4 0 1 0 0 0 1 0

5 0 0 0 1 0 0 1

matrice d’incidence deG~

Remarque :d(v) = X

e∈E:mve=1

mve etd+(v) =− X

e∈E:mve=−1

mve, ∀v ∈V

(4)

Représentation en mémoire : matrice d’adjacence 1/2

Matrice d’adjacence

SoitG= (V,E)graphe simple non orienté avecn=|V|etm=|E| matrice d’adjacence de G :matriceM ∈ Mn,n(N)tel que

muv =nombre d’arêtes{u,v} ∈E, ∀u,v ∈V

1 2

3 4

5

grapheG

1 2 3 4 5

1 0 1 1 1 0

2 1 0 1 0 1

3 1 1 0 1 1

4 1 0 1 0 0

5 0 1 1 0 0

matrice d’adjacence deG

Remarque :d(v) = X

u∈V

muv = X

u∈V

mvu, ∀v ∈V

(5)

Représentation en mémoire : matrice d’adjacence 2/2

Matrice d’adjacence

SoitG~ = (V,E)graphe simple orienté avecn=|V|etm=|E|

matrice d’adjacence deG :~ matriceM ∈ Mn,n(N)tel que muv =nombre d’arcs(u,v)∈E, ∀u,v ∈V

1 2

3 4

5

grapheG~

1 2 3 4 5

1 0 1 0 1 0

2 0 0 1 0 1

3 1 0 0 1 1

4 0 0 0 0 0

5 0 0 0 0 0

matrice d’adjacence deG~

Remarque :d+(v) = X

u∈V

mvu et d(v) = X

u∈V

muv, ∀v ∈V

(6)

Représentation en mémoire : méthode des tableaux 1/2

Comment éviter d’enregistrer des « zéros » inutiles ?

Méthode des tableaux

SoitG= (V,E)graphe non orienté avecn=|V|etm=|E|

méthode des tableaux :enregistrer le graphe à l’aide de 2 tableaux : un tableauadjacentde taille 2mtel que

adjacentdivisé ennsous blocs de tailled(v)contenantV(v) un tableauindicede taillenavec, pour chaque sommetv ∈V :

indice[v]: indice du premier voisin dev dansadjacent

Extension aux graphes orientés possible

(7)

Représentation en mémoire : méthode des tableaux 2/2

Chaque arête{u,b} ∈E est enregistrée deux fois :

{u,adjacent[k]} aveck ∈ {indice[u], . . . ,indice[u+1]−1}

{v,adjacent[k]} aveck ∈ {indice[v], . . . ,indice[v+1]−1}

convention :indice[n+1] =SIZE(adjacent) +1

1 2

3 4

5

indice 1 1

4 2

7 3

11 4

13 5 tableaux d’indices

adjacent 2 1

3 2

4 3

1 4

3 5

5 6

1 7

2 8

4 9

5 10

1 11

3 12

2 13

3 14

tableaux des sommets adjacents

V(1) V(2) V(3) V(4) V(5)

Remarque :d(v) =indice[v +1]−indice[v]

(8)

Représentation en mémoire : liste d’adjacence 1/2

Liste d’adjacence

Soit un graphe non orientéG= (V,E)avecn=|V|etm=|E| liste d’adjacence du sommet v ∈V :liste des voisins dev

liste(v) liste

v1

voisin next v2

voisin null next

1 2

3 4

5

liste(1) 2 3 4 X

liste(2) 1 3 5 X

liste(3) 1 2 4 5 X

liste(4) 1 3 X

liste(5) 2 3 X

Remarque :d(v) =TAILLE(liste(v)), ∀v ∈V

(9)

Représentation en mémoire : liste d’adjacence 2/2

Liste d’adjacence

Soit un graphe orientéG~ = (V,E)avecn=|V|etm=|E|

liste d’adjacence du sommet v ∈V :liste des voisins sortants dev

liste+(v) liste

v1

voisin next v2

voisin null next

1 2

3 4

5

liste+(1) 2 4 X

liste+(2) 3 5 X

liste+(3) 1 4 5 X

liste+(4) X liste+(5) X

Remarque :d+(v) =TAILLE(liste+(v)), ∀v ∈V

(10)

Comparaison des structures de graphes : matrices

Matrice d’incidence :

4 Simple à implémenter/utiliser

8 Gourmand en place mémoire (nmblocs mémoire) surtout si le graphe est peu dense (m<<n2) 8 Lecture du voisinage :o(m)

8 Inadapté pour les graphes dynamiques (ajout/retrait de sommet/arêtes)

Matrice d’adjacence :

4 Simple à implémenter/utiliser

4 Accès rapide à l’information d’adjacence :o(1) 8 Gourmand en place mémoire (n2blocs mémoire)

surtout si le graphe est peu dense (m<<n2) 8 Lecture du voisinage :o(n)

8 Inadapté pour les graphes dynamiques (ajout/retrait de sommets)

(11)

Comparaison des structures de graphes : tableaux et listes

Tableaux :

4 Simple à implémenter

4 Moins gourmand en place mémoire (2m+nblocs) 4 Lecture du voisinage :o(d(v))

8 Accès lent à l’information d’adjacence :o(d(v)) 8 Inadapté pour les graphes dynamiques (ajout/retrait

de sommets/arêtes) Liste d’adjacence :

4 Moins gourmand en place mémoire (2m+nblocs) 4 Lecture du voisinage :o(d(v))

4 Adapté pour les graphes dynamiques (ajout/retrait de sommet/arêtes)

8 Accès lent à l’information d’adjacence :o(d(v)) 8 Plus dur à implémenter (appel de bibliothèque

spécifique)

(12)

Utilisation d’une approche orienté objet

Sauvegarder une graphe avec des classes Classe Sommet : Les caractéristiques liées au sommet

Attributs : indice, poids, couleur, voisins,. . . Méthodes : renvoyer l’indice, changer de couleur, récupérer le voisinage, calculer le degré,. . . Classe Arête : Les caractéristiques liées à une arête

Attributs : indice, coût, sommets incidents,. . . Méthodes : renvoyer l’indice, récupérer le coût, renvoyer les sommets incidents,. . .

Classe Graphe : L’ensemble du graphe

Attributs : nom, tableau des sommets/arêtes,. . . Méthodes : renvoyer nom, ajouter/supprimer un sommet/arête, dessiner le graphe,. . .

(13)

Parcours de graphe 1/2

Principe d’un algorithme de parcours de graphe

Algorithme explorant les sommets d’un graphe de proche en proche à partir d’un sommet initial

Pourquoi utiliser un parcours de graphe ?

1 Etudier les propriétés du graphe

Déterminer toutes les composantes connexes d’un graphe Déterminer si un graphe est connexe, acyclique ou biparti

2 Résoudre des problématiques dans les graphes Calculer le diamètre du graphe

Résoudre le problème du plus court chemin Parcourir (aléatoire ou non) le graphe Déterminer heuristiquement une coloration

(14)

Parcours de graphe 2/2

Algorithme générique de parcours de graphe : complexo(max{|V|,|E|}) entrée un graphe non orientéG= (V,E) +sommets

sortie un tableaumarquerdes sommets atteints depuiss procédurePARCOURS_GRAPHE(G,s)

initialiser le tableaumarquerde taille|V|avecmarquer[i]faux,∀i∈V .tableau de marquage des sommets marquer[s]vrai .marquer le sommets explorer← {s} .ensemble des sommets marqués non explorés tant queexplorer6=faire

choisir un sommetudeexplorer .lequel choisir ? siil existev∈ V(u)tel quemarquer[v]est fauxalors .quel ordre ? marquer[v]vrai .marquer le sommetv explorerexplorer∪ {v} .ajouterv àexplorer sinon

explorerexplorer\ {u} .retirerudeexplorer fin si

fin tant que

retournermarquer fin procédure

(15)

Parcours en largeur de graphe 1/2

Structure de File FIFO (First In First Out) : File File :structure de données avec cinq fonctions :

CREER(file) : créer une file

VIDE(file) : retourner vrai si la file est vide ; sinon retourner faux

VALEUR(file) : renvoyer le premier élément de la file

ENFILER(file, élément) : ajouter un élément à la fin de la file

DEFILER(file) : retourner le premier élément de la file et le retirer

i1 . . . ik ENFILER(j) i1 . . . ik j DEFILER() i2 . . . ik j

Principe d’un parcours en largeur (Breadth First Search)

Algorithme de parcours de graphe utilisant une file pourexplorer Principe :

explorer en priorité le voisinage des sommets étudiés en premier

(16)

Parcours en largeur de graphe 2/2

Algorithme de parcours en largeur

entrée un graphe non orientéG= (V,E) +un sommets sortie un tableaumarquerdes sommets atteints depuiss

procédurePARCOURS_LARGEUR(G,s)

initialiser le tableaumarquerde taille|V|à faux

marquer[s]vrai ; TRAITER/AFFICHER(s).opération sur le sommets

CREER(explorer) .créer une fileexplorer

ENFILER(explorer,s) .ajoutersà la file tant queVIDE(explorer) est fauxfaire

u VALEUR(explorer) .récupérer la valeur de la file tant queil existev ∈ V(u)tel quemarquer[v] est fauxfaire

marquer[v]vrai ; TRAITER/AFFICHER(v) .opération surv

ENFILER(explorer,v) .ajouterv à la file fin tant que

DEFILER(explorer) .défiler la file

fin tant que

retournermarquer fin procédure

(17)

Application du parcours en largeur sur un graphe 1/4

Parcours en largeur à partir du sommet1

0 Initialisation :

1

2 3

4 5 6

7 1

MARQUER V 1

F 2

F 3

F 4

F 5

F 6

F 7

FILE 1

1 2 3 4 5 6 7

ORDRE 1

1 2 3 4 5 6 7

1 Itération 1 :u =1 + exploration du voisinageV(1) ={2,4,5}

2 3

4 5 6

7 1

2

4 5

MARQUER V 1

V 2

F 3

V 4

V 5

F 6

F 7

FILE 2 1

4 2

5

3 4 5 6 7

ORDRE 1 1

2 2

4 3

5

4 5 6 7

il existe des sommets non marqués : enfiler 2,4,5 et défiler 1

(18)

Application du parcours en largeur sur un graphe 2/4

2 Itération 2 :u =2 + exploration du voisinageV(2) ={1,3,5,6}

3 6

7 1

2

4 5

3

6 MARQUER V

1 V

2 V

3 V

4 V

5 V

6 F

7

FILE 4 1

5 2

3 3

6

4 5 6 7

ORDRE 1 1

2 2

4 3

5 4

3 5

6 6 7

il existe des sommets non marqués : enfiler 3,6 et défiler 2

3 Itération 3 :u =4 + exploration du voisinageV(4) ={1,5,7}

7 1

2 3

4 5 6

7

MARQUER V 1

V 2

V 3

V 4

V 5

V 6

V 7

FILE 5 1

3 2

6 3

7

4 5 6 7

ORDRE 1 1

2 2

4 3

5 4

3 5

6 6

7 7

il existe des sommets non marqués : enfiler 7 et défiler 4

(19)

Application du parcours en largeur sur un graphe 3/4

4 Itération 4 :u =5 + exploration du voisinageV(5) ={1,2,3,4}

1

2 3

4 5 6

7

MARQUER V 1

V 2

V 3

V 4

V 5

V 6

V 7

FILE 3 1

6 2

7

3 4 5 6 7

ORDRE 1 1

2 2

4 3

5 4

3 5

6 6

7 7

il n’existe pas de sommets non marqués : défiler 5

5 Itération 5 :u =3 + exploration du voisinageV(3) ={2,5,7}

1

2 3

4 5 6

7

MARQUER V 1

V 2

V 3

V 4

V 5

V 6

V 7

FILE 6 1

7

2 3 4 5 6 7

ORDRE 1 1

2 2

4 3

5 4

3 5

6 6

7 7

il n’existe pas de sommets non marqués : défiler 3

(20)

Application du parcours en largeur sur un graphe 4/4

6 Itération 6 :u =6 + exploration du voisinageV(6) ={2}

1

2 3

4 5 6

7

MARQUER V 1

V 2

V 3

V 4

V 5

V 6

V 7

FILE 7

1 2 3 4 5 6 7

ORDRE 1 1

2 2

4 3

5 4

3 5

6 6

7 7

il n’existe pas de sommets non marqués : défiler 6

7 Itération 7 :u =7 + exploration du voisinageV(7) ={3,4}

1

2 3

4 5 6

7

MARQUER V 1

V 2

V 3

V 4

V 5

V 6

V 7

FILE

1 2 3 4 5 6 7

ORDRE 1 1

2 2

4 3

5 4

3 5

6 6

7 7

il n’existe pas de sommets non marqués : défiler 7

(21)

Parcours en profondeur 1/2

Structure de File LIFO (Last In First Out) : Pile Pile :structure de données avec cinq fonctions :

CREER(pile) : créer une pile

VIDE(pile) : retourner vrai si la pile est vide ; sinon retourner faux

VALEUR(pile) : renvoyer le dernier élément de la pile

EMPILER(pile, élément) : ajouter un élément à la fin de la pile

DEPILER(pile) : retourner le dernier élément de la pile et le retirer

i1 . . . ik EMPILER(j) i1 . . . ik j DEPILER() i1 . . . ik

Principe d’un parcours en profondeur (Depth First Search)

Algorithme de parcours de graphe utilisant une pile pourexplorer Principe :

explorer en priorité le voisinage des sommets étudiés en dernier

(22)

Parcours en profondeur 2/2

Algorithme de parcours en profondeur

entrée un graphe non orientéG= (V,E) +un sommets sortie un tableaumarquerdes sommets atteints depuiss

procédurePARCOURS_PROFONDEUR(G,s)

initialiser un tableaumarquerde taille|V|à faux

marquer[s]vrai ; TRAITER/AFFICHER(s).opération sur le sommets

CREER(explorer) .créer une pileexplorer

EMPILER(explorer,s) .ajoutersà la pile tant queVIDE(explorer) est fauxfaire

u VALEUR(explorer) .récupérer la valeur de la pile tant queil existev ∈ V(u)tel quemarquer[v]est fauxfaire

marquer[v]vrai ; TRAITER/AFFICHER(v) .opération surv

EMPILER(explorer,v) .ajouterv à la pile uVALEUR(explorer).récuperer le sommet suivant de la pile fin tant que

DEPILER(explorer) .dépiler la pile

fin tant que

retournermarquer fin procédure

(23)

Application du parcours en profondeur sur un graphe 1/5

Parcours en profondeur à partir du sommet1

0 Initialisation :

1

2 3

4 5 6

7 1

MARQUER V 1

F 2

F 3

F 4

F 5

F 6

F 7

PILE 1

1 2 3 4 5 6 7

ORDRE 1

1 2 3 4 5 6 7

1 Itération 1 :u =1 + chercher un voisin non marqué dansV(1)

2 3

4 5 6

7 2

1

MARQUER V 1

V 2

F 3

F 4

F 5

F 6

F 7

PILE 1 1

2

2 3 4 5 6 7

ORDRE 1 1

2

2 3 4 5 6 7

il existe un sommet non marqué : empiler le sommet 2

(24)

Application du parcours en profondeur sur un graphe 2/5

2 Itération 2 :u =2 + chercher un voisin non marqué dansV(2)

3

4 5 6

7 1

2 3 MARQUER V

1 V

2 V

3 F

4 F

5 F

6 F

7

PILE 1 1

2 2

3

3 4 5 6 7

ORDRE 1 1

2 2

3

3 4 5 6 7

il existe un sommet non marqué : empiler le sommet 3

3 Itération 3 :u =3 + chercher un voisin non marqué dansV(3)

1 2

4 5 6

7 1

2 3

5

MARQUER V 1

V 2

V 3

F 4

V 5

F 6

F 7

PILE 1 1

2 2

3 3

5

4 5 6 7

ORDRE 1 1

2 2

3 3

5

4 5 6 7

il existe un sommet non marqué : empiler le sommet 5

(25)

Application du parcours en profondeur sur un graphe 3/5

4 Itération 4 :u =5 + chercher un voisin non marqué dansV(5)

4 6

7 1

2 3

5

4

MARQUER V 1

V 2

V 3

V 4

V 5

F 6

F 7

PILE 1 1

2 2

3 3

5 4

4 5 6 7

ORDRE 1 1

2 2

3 3

5 4

4 5 6 7

il existe un sommet non marqué : empiler le sommet 4

5 Itération 5 :u =4 + chercher un voisin non marqué dansV(4)

6

7 1

2 3

4 5

7

MARQUER V 1

V 2

V 3

V 4

V 5

F 6

V 7

PILE 1 1

2 2

3 3

5 4

4 5

7 6 7

ORDRE 1 1

2 2

3 3

5 4

4 5

7 6 7

il existe un sommet non marqué : empiler le sommet 7

(26)

Application du parcours en profondeur sur un graphe 4/5

6 Itération 6 :u =7 + chercher un voisin non marqué dansV(7)

6 1

2 3

4 5

7

MARQUER V 1

V 2

V 3

V 4

V 5

F 6

V 7

PILE 1 1

2 2

3 3

5 4

4 5 6 7

ORDRE 1 1

2 2

3 3

5 4

4 5

7 6 7

il n’existe pas de sommets non marqués : dépiler le sommet 7

7 Itération 7 :u =4 + chercher un voisin non marqué dansV(4)

6 1

2 3

4 5

7

MARQUER V 1

V 2

V 3

V 4

V 5

F 6

V 7

PILE 1 1

2 2

3 3

5

4 5 6 7

ORDRE 1 1

2 2

3 3

5 4

4 5

7 6 7

il n’existe pas de sommets non marqués : dépiler le sommet 4

8 Itération 8 : dépiler les sommets non marqués : 4 puis 5 puis 3

(27)

Application du parcours en profondeur sur un graphe 5/5

9 Itération 11 :u =2 + chercher un voisin non marqué dansV(2)

6 1

2 3

4 5

7

6 MARQUER V

1 V

2 V

3 V

4 V

5 V

6 V

7

PILE 1 1

2 2

6

3 4 5 6 7

ORDRE 1 1

2 2

3 3

5 4

4 5

7 6

6 7

il existe un sommet non marqué : empiler le sommet 6

10 Itération 12 :u =6 + chercher un voisin non marqué dansV(6)

1

2 3

4 5 6

7

MARQUER V 1

V 2

V 3

V 4

V 5

V 6

V 7

PILE 1 1

2

2 3 4 5 6 7

ORDRE 1 1

2 2

3 3

5 4

4 5

7 6

6 7

il n’existe pas de sommets non marqués : dépiler le sommet 6

11 Itération 13 : dépiler chaque sommet jusqu’à la fin : 2 puis 1

(28)

Autres algorithmes de parcours de graphes

Autres variantes d’algorithme de parcours

1 Enregistrer l’arbre de parcours dans une structure approprié

2 Algorithmes de parcours appliquées aux graphes orientés (exploration du voisinage entrant/sortant de chaque sommet)

3 Algorithme déterminant un ordre topologique :

1. initialement, calculer le degré entrant de chaque sommet 2. choisir un sommetude degré nul parmi les non marqués 3. marquer le sommetu

4. mettre à jour les degrés des sommets non marqués 5. réitérer le processus en retournant au pas2.

Cet algorithme détermine si un graphe orienté contient un circuit

4 Autres parcours : parcours Lex-BFS, variantes BFS/DFS Ordre topologique d’un graphe orientéG~ = (V,E)

Numérotationni de chaque sommeti∈V tel que : ni <nj pour tout(i,j)∈E

(29)

Application à la génération de labyrinthe

Principe : diviser un rectangle en petit carrés et appliquer un parcours en profondeur modifié sur le graphe définit par :

un sommet : un carré

une arête : deux carrés partageant une frontière

vidéo manquante : ouvrir avec okular

source : en.wikipedia.org, auteur : Purpy Pupple, licence : Creative Commons

(30)

Problème du plus court chemin 1/2

Problème du plus court chemin entre le sommetset le sommett

Trouver un chemin de longueur totale minimale entre le sommet source set le sommet ciblet(i.e. envoyer une unité de flot entresett)

Pourquoi s’intéresser à ce problème ? Problème facile à résoudre

Applications dans l’industrie : chercher la route la moins coûteuse dans un réseau routier (GPS)

dans un réseau de communication (transfert d’information) Nombreux aspects de l’optimisation dans les réseaux Résoudre des problèmes plus difficiles

Utiliser par la programmation dynamique

(31)

Problème du plus court chemin 2/2

Données : G~ = (V,E)graphe orienté + 2 sommets particulierss ett cij distance de parcours de l’arc(i,j)∈E

Objectif : chercher le chemin le plus court en distance entresett Hypothèses : pas de circuit de distance totale négative

existence d’un chemin entre le sommetset le sommett

s

1

2

3

4

t

i j

10

7

7

1 5

10 2

5

3 cij

Résumé min

X

(i,j)∈P

cij :Pest un chemin entres ettdansG~

(32)

Applications au problème de sac-à-dos 1/2

Données : un sac-à-dos de capacité maximaleW

un ensembleI depobjets avec pour chaque objeti ∈I: un poidswi et une utilitéui

Objectif : choisir des objets afin de maximiser l’utilité totale Contraintes : ne pas dépasser la capacité du sac

Problème du sac-à-dos

Choisir un ensemble d’objets afin de maximiser l’utilité totale sans dépasser la capacité du sac

source:wikipédia-auteur:Dake

(33)

Applications au problème de sac-à-dos 2/2

Considérons le jeu de données

i 1 2 3 4

ui 40 15 20 10

wi 4 2 3 1

et W =6

chaque objet peut-être pris plusieurs fois Transformation du problème en un problème de plus long chemin Soit le graphe multipleG~ = (V,E)avec V ={0, . . . ,W}etE définit par

(i,i+wk)k ∈E aveck ∈I,i∈ {0, . . . ,W −wk} en posantci,jk =uk pour tout(i,j)k ∈E

0 0 1 0 2 0 3 0 4 0 5 0 6

40 40 40

15 15 15 15 15

20 20 20 20

10 10 10 10 10 10

On cherche le plus long chemin dans ce graphe entre 0 et 6

(34)

Variantes du problème du plus court chemin

Il existe plusieurs variantes du problème :

1 Plus court chemin entre un sommetset tous les autres sommets

2 Plus courts chemins entre toutes paires de sommets

3 Résolution de cas particuliers :

Plus court chemin dans un graphe orienté sans circuit

Plus court chemin dans un graphe avec des distances unitaires Plus court chemin dans un graphe avec des distances positives Plus long chemin dans un graphe

Plus court chemin dans un graphe non orienté :

i ce j i cij=cji=ce j

Transformation : chaque arête remplacée par deux arcs inverses

4 Ajouter des contraintes supplémentaires : contrainte de temps/capacité,. . .

5 Utiliser une fonction de distance non linéaire :

coût dépendant du nombre d’arcs empruntés,. . .

(35)

Conditions d’optimalité 1/2

Propriété des plus courts chemins

SiPuv est le plus court chemin du sommetuau sommetv passant par le sommetw

Alors le cheminPuw est un plus court chemin deuàw Conséquences

1 Les plus courts chemins des vers tous les autres sommets forme un arbre, appelé arbre des plus courts chemins partant des

2 Sidk représente la distance de plus court chemin entresetk Alors, le cheminPsk est un plus court chemin desàk ssi

dj =di+cij pour tout(i,j)∈Psk

(36)

Conditions d’optimalité 2/2

Théorème des arcs tendus (conditions de complémentarité de la dualité) Sidk représente la distance du plus court chemin entres etk, ∀k ∈V Alors, le cheminPsk est un plus court chemin desàk ssi

dj =di+cij pour tout(i,j)∈Psk Théorème : conditions d’optimalité

Sidk représente la distance du plus court chemin entres etk,∀k ∈V Alors, la distancedk vérifie les conditions suivantes :

1. pour chaque arc, on a

dj ≤di +cij pour tout(i,j)∈E

2. si le cheminPsk est un plus court chemin desàk alors dj =di+cij pour tout(i,j)∈Psk On en déduit que les plus courts chemins vérifient :

dj =minndi+cij :i ∈ V(j)o ∀j∈V\ {s}

(37)

Résolution du problème du plus court chemin

Principe des algorithmes de plus courts chemins

Chercher l’arbre des plus courts chemins en partant des et vérifiant la condition d’optimalité

Utiliser des étiquettesdj pour chaque sommetj tel que : dj : estimation de la distance des àj Mettre à jour itérativement ces étiquettes pour obtenir :

dj =minndi+cij :i ∈ V(j)o ∀j∈V Deux types d’algorithmes :

1 Fixation d’étiquette :fixer itérativement les étiquettes de distance une à une lorsqu’on a garantit l’optimalité d’une étiquette

2 Correction d’étiquette :corriger les étiquettes de distance jusqu’à obtenir la condition d’optimalité

(38)

Résolution pour un graphe acyclique 1/4

Ordre topologique

Un graphe est sans circuit ssi il existe une numérotationni des sommetsi ∈V tel que :

ni <nj pour tout(i,j)∈E

a

b

c

d e f 1 g

2 3

4

5

6

7

Graphe avec un ordre topologique

Principe de l’algorithme du plus court chemin pour un graphe acyclique Calculer et fixer itérativement les distances des plus courts chemins selon l’ordre topologique

(39)

Résolution pour un graphe acyclique 2/4

Condition d’application

Partir avec un graphe acyclique oùsest le sommet numéroté 1

⇔graphe possédant un ordre topologique Principe de l’algorithme de Bellman

Fixer et mettre à jour itérativement les étiquettes de distancedi des sommetsi en suivant l’ordre topologique

A une itérationk

les plus courts chemins desàisont connus∀i∈ {1, . . . ,k −1}

les plus courts chemins desàirestent à calculer∀i∈ {k, . . . ,n}

En effet, le plus court chemin entre le sommetset un sommeti ∈V est composé exclusivement des sommets{1, . . . ,i}

(40)

Résolution pour un graphe acyclique 3/4

Partir du sommet s=1

Initialisation :distance[1] =0 2

d2=

3

d3= 4 d4=

5 d5=

1

d1=0

6

d6=

8 4 2

2

1

1 7

2 3

Itération 1 :distance[2] =8 2

d2=8

3

d3=4 4 d4=

5 d5=

1

d1=0

6

d6=

2 2

1

1 7

2 3 4

8

Itération 2 :distance[3] =4 2

d2=8

3

d3=4 4 d4=

5 d5=10

1

d1=0

6

d6=

2

1

1 7

2 3 8

4

2

Itération 3 :distance[4] =5 2

d2=8

3

d3=4 4 d4=5

5 d5=5

1

d1=0

6

d6=

2 2

7 2 3 8

4

1 1

Itération 4 :distance[5] =5 2

d2=8

3

d3=4 4 d4=5

5 d5=5

1

d1=0

6

d6=7

2 2

7 3 8

4

1 1

2

Itération 5 :distance[6] =7 2

d2=8

3

d3=4 4 d4=5

5 d5=5

1

d1=0

6

d6=7

2 2

7 3 8

4

1 1

2

Légende des distances :

En vert : distance temporaire En bleu : distance améliorée

En rouge : distance permanente (fixée) En violet : distance devenant permanente

(41)

Résolution pour un graphe acyclique 4/4

Algorithme avec un ordre topologique : complexitéo(|E|)

entrée un graphe orientéG~ = (V,E)avecc des coûts sur arcs+sommets sortie un tableaudistancedes distances entreset les autres sommets

procédureALGORITHME_BELLMAN(G,~ s)

partir/calculer un ordre topologique pourG~ avecsnuméroté 1

.numérotation de départ initialiser le tableaudistancede taille|V|

.distanceenregistre la distance entreset les autres sommets distance[i]+∞, ∀i V\ {s} ; distance[s]0

pour touti allant de 1 à|V| −1 par pas de 1faire

pour toutj ∈ V+(i)faire .exploration du voisinage sortant dei sidistance[j]>distance[i] +cij alors

.distance desàj plus courte en passant pari distance[j]distance[i] +cij .mise à jour distance fin si

fin pour fin pour

retournerdistance fin procédure

(42)

Application à la programmation dynamique

Graphe par couches-états

i-j couche i-état j transition

0-1

1-1 1-2 1-3

2-1 2-2 2-3 2-4 2-5

3-1 3-2 3-3 3-4 3-5 3-6 3-7

. . . . . . . . . . . . . . . . . . . . .

couche 0 couche 1 couche 2 couche 3 couche K-2 couche K-1 couche K couche K+1

Pour un problème d’optimisation résolu par programmation dynamique:

une couche=un niveau de décision ; un état=état de la solution

(43)

Résolution pour un graphe avec distances positives 1/3

Condition d’application

Toutes les distances sont positives Principe de l’algorithme de Dijkstra

Fixer et mettre à jour itérativement les étiquettes de distancedi des sommetsi en séparant les sommets en deux :

une liste de sommets avec un statutpermanent: distances des sommets sont optimales (étiquettes fixées)

une liste de sommets avec un statuttemporaire: distances des sommets sont des estimations partielles

A une itérationk

choisir un sommet temporaireitel quedi est minimale rendre le sommetien statut permanent

ajuster les distances temporaires des voisins du sommeti

(44)

Résolution pour un graphe avec distances positives 2/3

Partir du sommet s=1

Initialisation :distance[1] =0 2

d2=

3

d3= 4 d4=

5 d5=

1

d1=0

6

d6=

8 4 2

2

1

1 7

2 3

Itération 1 :distance[3] =4 2

d2=8

3

d3=4 4 d4=

5 d5=

1

d1=0

6

d6=

2 2

1

1 7

2 3 8

4

Itération 2 :distance[5] =5 2

d2=8

3

d3=4 4 d4=

5 d5=5

1

d1=0

6

d6=

2 2

1

7 2 3 8

4

1

Itération 3 :distance[2] =7 2

d2=7

3

d3=4 4 d4=12

5 d5=5

1

d1=0

6

d6=8

8 2

1

2 4

1 2

7 3

Itération 4 :distance[6] =8 2

d2=7

3

d3=4 4 d4=12

5 d5=5

1

d1=0

6

d6=8

8 2

1

2 4

1 2

7 3

Itération 5 :distance[4] =10 2

d2=7

3

d3=4 4 d4=10

5 d5=5

1

d1=0

6

d6=8

8 2

1 4 7

1 2

3 2

Légende des distances :

En vert : distance temporaire En bleu : distance améliorée temporaire= vert + bleu

En rouge : distance permanente

En violet : distance devenant permanente permanent= rouge + violet

Références

Documents relatifs

Étape 1 : à partir de la ville A, 3 villes sont accessibles, B, C, et E qui se voient donc affectées des poids respectifs de 85, 217, 173, tandis que les autres villes sont

TOME s eu, Metodâ pentru determinarea drumului de cea mai mica lungime dintre doua noduri aie unui graf finit, Analele Univ. TOMESCU, Sur les méthodes matricielles dans la théorie

(b) A chaque étape de l'algorithme, choisir arbitrairement un sommet en dehors de ceux qui ont déjà été retenus dans la construction, et relier par l'arête de poids le plus faible,

Ce programme permet d'étudier sous un angle nouveau les relations entre algorithmes de plus court chemin et de résolution de systèmes linéaires.. Mots clés : Graphes, programme

(a) II est basé sur la recherche de l'arbre de longueur minimum du graphe des données (on rappelle que l'arbre de longueur minimum d'un graphe dont les arêtes sont valuées, est

Complexité dans le meilleurs cas : Modèle de complexité peu utile Complexité en moyenne : à partir d’une répartition probabiliste des tailles de données, tente d’évaluer le

Complexité dans le meilleurs cas : Modèle de complexité peu utile Complexité en moyenne : à partir d’une répartition probabiliste des tailles de données, tente d’évaluer le

On pousse tous les bits d'un cran (ou de plusieurs si on remplace 1 par n) vers la droite (on perd donc des données de ce côté), on complète par des zéros sur la gauche. On obtient