Mer de glace
Transcription
Mer de glace
Algorithmes et Applications (Master 1 Info 2011-2012) Partie II (Bilel Derbel) : Algorithmes sur les Graphes et Applications (arbre recouvrant, coloration, graphe du web) Cours 1 : Introduction aux graphes ● Introduction ✓ Terminologie et notions de bases ✓ Représentations d'un graphe ✓ Dessin à main levée ! ● Parcours et Plus courts chemins ✓ Comment raisonner avec les objets graphes ? Un peu d'histoire (1/2) ● Problème des ponts de Konigsberg (kaliningrad) : ‣ Deux îles A et D sur les rives du Pregel reliées entre elles ainsi qu’aux rivages B et C à l’aide de sept ponts ✓ Question : à partir d'une terre de départ, comment traverser chacun des ponts une et une seule fois et retourner à son point de départ ? ‣ Euler (1736) Un peu d'histoire (2/2) ● Kirchhoff (1824-1887) : développa la théorie des arbres pour l’appliquer à l'analyse de circuits électriques ● Cayley (1821-1895) : découvrit la notion d'arbre alors qu'il essayait d'énumérer les isomères saturés des hydrocarbures CnH2n+2 ‣ Conjecture des quatre couleurs ‣ Chemins Hamiltonien ‣ Mobius, de Morgan … ● 1936 : premier ouvrage sur les graphes (Konig) ● 1946 : Kuhn, Ford, Fulkerson, Roy, Berge, etc. ‣ Problèmes concrets : Science de l'information, logistique, télécom, etc Pourquoi un graphe ? ● Un graphe modélise de nombreuses situations concrètes où interviennent des objets en interaction : ‣ ‣ ‣ ‣ ● Les interconnexions routières, ferroviaires ou aériennes Les liens entre les composants d'un circuit électronique Le plan d'une ville et de ses rues en sens unique Autres situations improbables ! Les outils développés en théorie des graphes permettent de déduire des propriétés et de proposer des méthodes de résolution (algos): ‣ Quel est le plus court chemin (en distance ou en temps) pour se rendre d'une ville à une autre ? ‣ Comment minimiser la longueur totale des connexions d'un circuit ‣ Peut-on mettre une rue en sens unique sans rendre impossible la circulation en ville ? C'est quoi un graphe ? (1/2) ● Un graphe permet de décrire un ensemble d'objets (sommets/noeuds) et leurs interactions (arêtes) ● Définition 1 : ‣ Un graphe est un couple G=(V,E) avec V un ensemble de (n) sommets et E un ensemble de (m) arêtes ‣ Une arête e du graphe est une paire e=(x,y) ✓ x et y sont les extrémités de l'arête e ✓ x et y sont adjacents ou voisins ✓ N(x) : l'ensemble des voisins de x ‣ Un graphe est sans boucle : e≠(x,x) ‣ Deux arêtes e1=(x,y) et e2=(x,y) sont dites parallèles ‣ Un graphe sans boucles ni arêtes parallèles est dit simple C'est quoi un graphe ? (2/2) ● Définition 2 : ‣ Un graphe G=(V,E) est dit orienté lorsque pour toute arête e on ordonne ses extrémités ‣ Une arête est alors appelée un arc ‣ Pour un arc (x,y), x est appelé sommet initial (origine) et y sommet terminal (destination) ‣ On note souvent G=(V,A) un graphe orienté et G=(V,E) un graphe non orienté ‣ Les notions d'incidences et d'adjacence restent les mêmes ‣ On définit de façon naturelle les notions de prédécesseurs V-(x) et de successeur V+(x) dans le cas des graphes orientés Notions d'adjacence ● Définition 3 : ‣ Dans un graphe non orienté, d(x) := |N(x)| d'un sommet x désigne le nombre de voisins de x ✓ Le degré ✓ ∑x d(x) = 2m ✓ Le nombre de sommets de degré impair est pair – Question : Est-il vrai que dans une classe 33 étudiants, au moins un étudiant connaît un nombre pair d’autes étudiants dès la rentée ? ‣ Dans un graphe orienté, on parle de degré entrant d-(x) et degré sortant d+(x) ‣ δ(G)≤ 2m/n ; ∆(G)≥ 2m/n Sous graphes ● Pour caractériser une partie d'un graphe de façon moins locale on parle de sous-graphe et de graphe partiel ● Définitions 4 : ‣ Un sous-graphe de G est un graphe H=(W, E(W)) tel que W est un sous-ensemble de V, et E(W) sont les arêtes induites par E sur W, c'est à dire les arêtes de E dont les 2 extrémités sont des sommets de W ✓ Exemple : liaisons aériennes entre villes ‣ Un graphe partiel de G est un graphe I=(V,F) tel que F ⊆ E. ✓ Exemple : liaisons d'au plus 3 heures Cliques et stables ● Pour un graphe, deux cas extrêmes sont possibles pour les arêtes : ‣ Aucune arêtes n'est présente (tous les sommets sont isolés) ‣ Toutes les arêtes possibles sont présentes ● Définitions 5 : ‣ Un graphe complet est un graphe où chaque sommet est relié à tous les autres ✓ Kn : graphe complet d'ordre n ✓ Chaque sommet est de degré n-1 ‣ Une clique est un sous graphe complet ‣ Un stable est un sous-graphe sans arêtes Représentation d'un graphe ● Suivant l'application visée et les traitements à effectuer, on peut adopter des représentations différentes pour un graphe ‣ Représentation matricielle ✓ Simple mais gourmande en mémoire ‣ Représentation tabulaire ✓ Statique (allocation de mémoire couteuse en cas de changement) ‣ Représentation par listes chaînées (par exemple chainage successeurs/prédécesseurs) Représentation matricielle ● Graphe non orienté ‣ Matrice d'adjacence (n x n) : A(G) = [aij] avec aij : le nombre d'arêtes reliant le sommet xi au sommet xj ✓ n2 cases mémoires ‣ Matrice d'incidence (n x m) : B(G) = [bij] avec bij = le nombre de fois où ej est incidente à xi ✓ n x m cases mémoires Représentation matricielle ● Graphe orienté ‣ Matrice d'adjacence (n x n) A(G) = [aij] avec : ✓ aij = le nombre d'arc ayant xi comme extrémité initiale et xj comme extrémité terminale ‣ Matrice d'incidence (n x m) B(G) = [bij] avec : ✓ bij = 1 si xi est origine de l'arc aj ✓ bij = -1 si xi est destination de l'arc aj ✓ bij = 0 sinon (pertinent seulement pour un graphe sans boucle et sans arêtes multiples) Représentation tabulaire ● Tableaux des arcs (2m cases mémoires) ‣ Deux tableaux SI (sommet initial) et ST (sommet terminale) ✓ SI[i] : sommet initial de l'arc i ✓ ST[i] : sommet terminale de l'arc i ● Tableaux des successeurs (n+m cases mémoires) ‣ Deux tableaux P et S P: a, ? b, ? c, ? d, ? e, ? f, ? ✓ S : concaténation des successeurs des sommets xi S: ✓ P[i] : l'indice du premier successeur de xi dans S g, ? h, ? i, ? Se déplacer dans un graphe ! ● Comment découvrir les sommets/les arêtes/les chemins dans un graphe ? ‣ Explorer un labyrinthe ‣ Découvrir les liaisons entre sommets ‣ Exemples : plusieurs ! ● Existe-t-il un chemin qui mène d'un sommet à un autre ? ● Comment trouver le plus court chemin entre deux sommets ? ● Quel est l'ensemble des sommets qu'on peut atteindre à partir d'un sommet de départ ? ● etc. Chemins et Cycles ● Définitions 6 : ‣ Un chemin (path) est une succession de sommets p=(x1, x2, … , xk-1, xk) tel que il existe dans le graphe une arête entre deux sommets successifs ‣ La longueur du chemin = nombre d'arêtes parcourues ‣ Un chemin est simple si chaque arête du chemin est empruntée une seule fois ‣ Un chemin est élémentaire si chaque sommet n'apparaît qu'une seule fois ✓ Question : Est-il vrai que si il existe un chemin entre deux sommets alors il existe un chemin élémentaire entre les deux sommets ? Chemins et Cycles ● Définitions 7 : ‣ Un cycle est un chemin qui se termine à son point de départ ✓ Question : Est-il vrai que si tout sommet dans G est de degré supérieur ou égal à 2, alors G possède au moins un cycle ? ‣ Graphe orienté : chemin/cycle Vs Graphe non orienté : chaine/circuit Notions de Connexité ● Définition 8 : ‣ Un graphe est connexe ssi il existe un chemin entre chaque paire de ses sommets ‣ Une composante connexe de G=(V,E) est un sous graphe G=(V',E') connexe et maximal pour l'inclusion ‣ Un graphe ne possédant qu'une seule composante connexe est connexe ! ‣ Question : Est-il vrai qu'un graphe connexe possède au moins n-1 arêtes ? Parcours Eulériens ● Définition 9 : ‣ Un chemin eulérien est un chemin empruntant une et une seule fois chaque arête de G ‣ Un cycle eulérien est un chemin eulérien dont les extrémités coïncident ‣ Un graphe eulérien est un graphe qui possède un cycle eulérien ● Théorème 1 : ‣ Un graphe non orienté connexe est eulérien si et seulement si tous les sommets ont un degré pair ‣ Un graphe non orienté connexe possède un chemin eulérien si et seulement si le nombre de sommets de degré impair est égal à 0 ou 2 Algorithme d'Euler Input : G=(V,E) et un sommet x de V Output : Φ Liste des sommets du cycle eulérien Initialiser Φ := (x) ; /* Base de la récursivité : x est isolé */ Si x est un sommet isolé Alors Retourner Sinon /* On construit un cycle contenant x */ Initialiser y := x Tant Que y n'est pas un sommet isolé Faire Choisir z l'un de ses voisins ; Supprimer l'arête (y,z) de G ; y := z ; Φ ← y ; /* on ajoute le sommet au cycle */ Fin Tant Que /* Appel récursif sur chacun des k sommets du cycle en concaténant les réponses */ Retourner Euler(G,Φ(1)) o … o Euler(G,Φ(k)) ; Fin Si Parcours Hamiltonien ● Définitions 10 : ‣ Un chemin hamiltonien est un chemin passant une seule fois par chaque sommet du graphe ‣ Un cycle hamiltonien est un chemin hamiltonien dont les extrémités coïncident ‣ Un graphe est hamiltonien s'il contient un cycle hamiltonien ‣ Construire un chemin hamiltonien est algorithmiquement difficile ● Exemple : ‣ Voyageur de commerce Parcours en Profondeur/Largeur ● Visiter tous les sommets d'un graphe / explorer un graphe ● L'exploration d'un graphe à partir d'un sommet de départ permet de trouver la composante connexe du sommet ● Dans un procédé d'exploration, il s'agit de fixer une politique permettant à partir d'un sommet de choisir le sommet suivant à visiter ‣ Exploration en Largeur ‣ Exploration en profondeur ‣ Algorithmes de recherche Input : G=(V,E) et un sommet source s Initialiser tous les sommets à non marqué ; Marquer s ; TantQue il existe un sommet non marqué adjacent à un sommet marqué Faire Sélectionner un sommet y non marqué adjacent à un sommet marqué ; Marquer y ; FinTantQue BFS (plus court chemin) (1/5) ● Comment trouver un plus court chemin ? ‣ Nous aimerions avoir une méthode systématique : un algo ! ‣ Comment arrive-t-on à concevoir un tel algorithme ? ✓ On utilise les propriétés de l'objet plus court chemin ! ● Propriété 1 : un plus court chemin est élémentaire : énumération ! ● Propriété 2 : Sous-optimalité ‣ Si p=(s,...,t) est un plus court chemin entre s et t, alors pour tout sommet x sur le chemin p, on a : ✓ Le sous-chemin de p jusqu'à x, (s,...,x), est un plus court chemin de s à x ✓ Le sous-chemin de p depuis x, (x,...,t), est un plus court chemin de x à t BFS (plus court chemin) (2/5) ● Le principe de sous-optimalité montre que trouver un plus court chemin entre s et t conduit à trouver tous les plus courts chemins entre s et les sommets x sur le trajet ‣ Mais nous ne connaissons pas les sommets x sur le trajet ! ‣ On va essayer de trouver tous les plus courts chemins vers les autres sommets du graphe ‣ Pour cela, intéressons nous à la longueur de ces plus courts chemins ✓ Pour tout sommet y sa distance D(y) de s BFS (plus court chemin) (3/5) ● Propriété : ‣ D(y) = 0 si y=s ‣ D(y) = 1 + min { D(x) | x voisin de y } sinon ● On va alors visiter les sommets des plus proches vers les plus éloignés jusqu'à tomber sur t ‣ Il faut choisir le bon ordre de visite/d'exploration BFS (plus court chemin) (4/5) ● Algorithme BFS et calcul de plus court chemin Input : Graphe G=(V,E), Sommet s F : FILE (liste FIFO) Initialiser tous les sommets à non marqué ; L(s) := 0; /* Marquer s */ F ← s ; /* enfiler s*/ Tant Que F n'est pas vide Faire x← F; /* Retirer le premier sommet de la file */ Pour chaque voisin y non marqué de x Faire Marquer y ; L(y) := L(x) + 1 ; F← y Fin Pour Fin TantQue /* Ajouter y à la fin de la file */ BFS (plus court chemin) (5/5) ● Théorème : ‣ L'algorithme BFS calcule en temps O(|E|) la longueur des plus courts chemins du sommet s à tous les autres sommets du graphe ‣ Pour tout x, L(x)=D(x) ‣ L'algorithme BFS est optimal en temps : on doit considérer au moins une fois chaque arête si l'on veut pas rater le plus court chemin ! ✓ Pensez y la prochaine fois que vous cherchez votre trajet dans le métro ! Devinette ! ● Le jeu des trois seaux : ‣ On dispose de trois seaux A, B et C de respectivement 3, 5 et 8 litres. Initialement, le seau de 8 litres est complètement rempli et les deux autres sont vides. ‣ En étant seulement autorisé à transvaser un seau dans l'autre, est-il possible d'arriver à une configuration où le seau A est vide et les seaux B et C contiennent exactement 4 litres chacun ? ‣ Comment peut-on faire pour généraliser se jeu à plus de 3 seaux ?