traverse et calculs dans arbres exemple: graphes de...
TRANSCRIPT
Pimp A - info121AProgrammation IMPérative Avancée
Frédéric Vernier
inspiré du cours de Burkhart Wolff
Programme
TriRécursivitéDichotomieArbreGraphes Examen blanc
xxxyyy
Traverse et Calculs dans Arbres
Graphes omniprésent !ExemplesReprésentations de graphesParcours et Calculsetc.
Exemple: Graphes de Réseaux
Réseau de transport Stations (+type)ConnexionsRoutes
Exemple: Graphes
Réseau sociaux(mais qui te like?)
Exemple: Recherche Labyrinthe
La recherche d’unesortie d’un labyrinthe …
Exemple: Recherche Labyrinthe
Recherche d’unesortie = arbre
ensemble deschemins = graphe
Exemple: Configurations en Jeux
n queenspeut avoirdes cyclesGraphe implicite
Graphes : Définition
… consistent d’un ensemble de sommets (noeuds) V et de liens entre eux, des arêtes (arcs) E entre eux, i.e. un ensemblede paires entre les V.
… peuvent être
orientés (E non-symétrique)
ou non-orientés (E symétrique)
… peuvent avoir (en plus des arbres):
boucles ([4,5,2,3]),
sommets avec plusieurs “pères” (2)
Graphs : Definitions
… peuvent avoir:
cas: orientés- in-degré (example: 2) - out-degré (example: 2)
cas non-orientés - degré (example: 2)
des attributs sur des sommets (ex.: “graph coloré”)
des attributs sur des arêtes (ex.: “graph pondéré”)
Graphe : Représentation
Représentation de Graphes: G = (V,E) ou V = {1,2,3,4,5,6} E = {(6,4),(4,3),(4,5),(5,2),(5,1),(2,1), (4,6),(3,4),(5,4),(2,5),(1,5),(1,2)}
Et, bien sur, une représentation par référence (position dans tableaux):
[[2,5], [5,1], [2,4], [3,5,6], [1,2,4], [4]]
… ou par une fonction:vector<ref> voisins(<ref>)
Graphe : Représentation
Différentes formes de graphes et de problèmes … [Wikipedia]
Route problems !•!Hamiltonian path and cycle problems !•!Minimum spanning tree !•!Route inspection problem
(also called the "Chinese Postman Problem") !•!Seven Bridges of Königsberg !•!Shortest path problem !•!Steiner tree !•!Three-cottage problem !•!Traveling salesman problem (NP-hard)
Exemple de problème Exemple de problème
Problème du chemin Hamiltonien:(pour des graphes orientés et non-orientés):
… trouver un chemin quipasse par tous les sommetsexactement une fois.
… n’existe pas dans tousles graphes.
Certaines Graph-Problèmes
Problème du voyageur de commerce:pour un graphe pondéré G = (V, A, !)
typiquement non-orienté, mais …
visiter chaque sommet qu’une seule fois (sauf le départ et fin, qui sont égaux)
minimiser le cout du chemin
problème d’optimisation récurrent et complexe (NP)
Autre exemple
graphe pondéré:Arbre couvrant de poids minimal(angl: Minimumspanning tree)
sommets tous liés
poids minimal
Graphes & Arbres
Arbres faciles à explorer par desalgorithmes récursivesIdée: explorer les graphes par construction de sous-arbres …… marquer les sommets déjà visitées …
marquer(A)
de-marquer(A)
est-marqué(A)
Graphs vs. Arbres: Marquages
✓✓✓
✓✓✓
✓✓✓
✓✓✓
✓✓
✓✓✓
✓✓✓
✓ ✓
✓✓✓
✓
✓✓✓
✓
✓
✓ ✓ ✓
Explicites et implicites Graphs
Comme dans le cas des arbres, les sommets et les arrêtes peuvent être
explicitement représentés(métro, shortest path navigation …)
implicitement représentés:(jeux, labyrinthes … )
vector<ref> voisins(sommets S)
visiter(S, op)
Schéma de parcours d’arbres
Parcours en profondeur (depth-first)Variante: Parcours Postfixe.(Variantes infixe et prefixe analog arbres)
void visiterGraph(Sommet A){ marquer(A) foreach(Sommet S : voisins(A)) if(nonMarque(S)) visiterGraph(S); visiter(A); de-marquer(A);}
Schema evaluation de graphes
Parcours en profondeur (depth-first)Variante : Parcours Postfixe.(Variantes infixe et prefixe analogue aux arbres)
<Res> evalGraph(Sommet A){ marquer(A); foreach(Sommet S : voisins(A)) if(nonMarque(A)) vector<Res> res=evalArete(A,S,evalGraph(S)); de-marquer(A); return eval(A, res); }
code C++
/* Rappel d’un algorithme de recherche: */
char MUR = '#';char VIDE = ' ';char EN_CONSTR = '?';char IMPASSE = '@';char CHEMIN = 'o';
typedef vector<vector<char> > Labyrinthe;Labyrinthe laby;
…
code C++
/* Rappel d’un algorithme de recherche: */
bool chemin1_r(int x, int y){ //cout << x << "," << y << endl; laby[y][x] = EN_COURS; bool trouve = false; if (x==laby[laby.size()-2].size()-2 && y==laby.size()-2){ laby[y][x] = CHEMIN; return true; } if (laby[y][x+1]==VIDE) trouve=chemin1_r(x+1, y); if (! trouve && laby[y+1][x]==VIDE) trouve=chemin1_r(x,y+1); if (! trouve && laby[y][x-1]==VIDE) trouve=chemin1_r(x-1,y); if (! trouve && laby[y-1][x]==VIDE) trouve=chemin1_r(x,y-1); if (trouve)laby[y][x] = CHEMIN return trouve;}
code C++
/* Rappel d’un algorithme de recherche: */
bool chemin1_r(int x, int y){ laby[y][x] = EN_COURS; bool trouve = false; if (x==laby[laby.size()-2].size()-2 && y==laby.size()-2){ laby[y][x] = CHEMIN; return true; } if (laby[y][x+1]==VIDE) trouve=chemin1_r(x+1, y); if (! trouve && laby[y+1][x]==VIDE) trouve=chemin1_r(x,y+1); if (! trouve && laby[y][x-1]==VIDE) trouve=chemin1_r(x-1,y); if (! trouve && laby[y-1][x]==VIDE) trouve=chemin1_r(x,y-1); if (trouve)laby[y][x] = CHEMIN; return trouve;}
marquer(x,y)
de-marquer(x,y)
le résultat
donc voisin pas marqué
Les Sommets: une “configuration”, i.e.un pair de:
l’état du labyrinthe, avecses murs, ses cases encore vides,ses cases déjà visités
la position actuelle: x et y
calculer les voisins de (x,y) :trouver positions voisins qui sont ni déjà visité ni mur ! Graph implicite !!!
Parcours Labyrinthe Parcours de graphes
Intérêt particulier:Parcours en largeur (breadth first)
Rappel:Structure de donné auxiliaire: File <X> (angl: Queue)
First-in-first-out principle (FIFO)
elements clé: operations File<X> FileVide
Parcours de graphes
Schéma d’un parcours en largeur (breadth first)
ParcoursLargeur(Sommet A){ f = FileVide; enfiler(A, f); while (f != FileVide) { nœud = defiler(f); marquer(nœud); Visiter(nœud); //On choisit de faire une opération foreach(S:voisins(nœud) if (non_marque(S)) enfiler(S, f) de-marquer(nœud) } }
Calculs dans graphes
Schéma pour évaluation en largeur …<res> evalLargeur(Sommet A){ File<Pair<Sommet, res_tmp>> f = FileVide; <res> res = initRes() enfiler(A, f); while (f != FileVide) { nœud = defiler(f); marquer(nœud) foreach(S:voisins(nœud) if (non_marque(S)) <res_tmp> res_tmp = eval(nœud, S, res, f) res = update(nœud, S, res, res_tmp) enfiler((S, res_tmp),f) de-marquer(nœud) } return res }
Parcours de graphes
Quelle stratégie de parcours estmeilleur pour “find_shortest_path” -
parcours en profondeur parcours en largeur???
Résumé
Graphes sont une structure de donnée (récurrente :-) en informatiqueAlgorithmes efficaces de grand intérêtune approche de leur parcours et utilisation : réduction en arbre (via marqueur)et exploration avec des stratégies connues …