Algorithmique avancée Théorie des graphes Mme Henry Gros-Désormeaux Professeur agrégé de Mathématiques, docteur en informatique Université des Antilles Février 2020 Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 1 / 33 1. Introduction 2. Généralités sur les graphes 2.1 Vocabulaire 2.2 Représentation d'un graphe 2.3 Algorithmes de parcours de graphes 3. Arbres 3.1 Vocabulaire 3.2 Arbre binaire Pré requis : liste, tableau Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 2 / 33 Problème des 7 ponts de Könisgberg, Euler, 1736 Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 3 / 33 Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 4 / 33 Problème du voyageur de commerce, Hamilton Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 5 / 33 Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 6 / 33 Dénition 2.1 Graphe non orienté G = (V , E ), n sommets, m arêtes V : ensemble non vide et ni de sommets E : ensemble d'arêtes (paire d'éléments de V , éventuellement valuée) Si e = (x, y ), x et y sont les extrémité de e et x , y sont dits adjacents ou voisins e est incidente à x et y ordre d'un graphe : nombre de sommets, degré d'un sommet : nombre de voisins, notion de sommet isolé Propriétés 1 P x∈V d(x) = 2|E | Cadre : Graphe simple Graphe orienté : arcs, degré intérieur, degré extérieur Graphe pondéré : arêtes valuées Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 7 / 33 Exemple 2.1 Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 8 / 33 Chaîne, cycle, chemin, circuit Graphe non orienté chaîne [x, y ] : suite nie consécutives d'arêtes reliant les sommets x et y chaîne élémentaire : sommets distincts, chaîne simple : arêtes distinctes cycle : chaîne simple dont les 2 extrémités sont identiques Graphe orienté chemin [x, y ] : suite nie d'arcs consécutifs reliant x à y chemin élémentaire, chaîne élémentaire circuit Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 9 / 33 chemin, chaîne eulérien : toutes les arêtes sont présentes une seule fois cycle, circuit hamiltonien: tous les sommets sont présents une seule fois longueur : nombre d'arêtes Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 10 / 33 Matrice d'adjacence Tableau à double entrée M[i][j], de dimension N(nombre de sommets) M[i, j] = 1 ou 0 0 1 1 0 0 1 0 1 1 1 1 1 0 0 1 0 1 1 0 0 0 1 1 0 0 import numpy as np G=np.array( [[0,1,1,0,0],[1,0,1,1,1],[1,1,0,1,1],[0,1,0,0,0],[0,1,1,0,0]]) Occupation mémoire O(n2 ) Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 11 / 33 Matrice d'incidence Pour un graphe orienté Tableau à double entrée M[i][j], de dimension N(nombre de sommets) M[i, j] = 1 si i est l'origine de l'arc, -1 si i est l'extrémité , 0 sinon Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 12 / 33 Liste d'adjacence 0 → 1, 2, 1 → 0, 2, 3, 4, 2 → 0, 1, 3, 4, 3 → 1, 4 → 1, 2 S=[0,1,2,3,4] G=[[1,2],[0,2,3,4],[0,1,3,4],[1],[1,2]] Graphe orienté : liste de successeurs ou liste de prédecesseurs Occupation mémoire O(n + m) Autre représentation possible : liste des sommets et liste des arêtes ou liste des arcs Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 13 / 33 Représentation par classe en Python class Graph: def __init__(self,nbsommets,listeAdj): self.n=nbsommets self.adjacence=listeAdj def nbsommets(self): return self.n Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 14 / 33 Introduction Exploration globale du graphe Dénition 2.2 Un graphe non orienté est connexe si deux sommets quelconques peuvent être reliés par une chaîne. Un graphe orienté est fortement connexe, s'il existe un chemin entre tous sommets x et y . Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 15 / 33 Exploration en largeur Sommet initial r : racine de l'exploration Un sommet marqué est exploré quand on a marqué tous ses voisins FIFO : premier marqué, premier traité exemple : r : sommet a [[b, c][a, c, d, e], [a, b, e], [b], [b, c]] Ordre d'exploration :a b c d e Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 16 / 33 Entrée : G: graphe, s: racine début file : liste vide marque : liste de n booléens initialisés à Faux marque[s]=vrai enfiler(s,file) Tant que file non vide: u=défiler(file) pour chaque sommet v adjacent au sommet u: si marque[v] est faux alors marque[v]=vrai enfiler(v) fin si fin pour Fin tant que Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 17 / 33 Exploration en profondeur Sommet initial s : racine de l'exploration Un sommet marqué est exploré quand on a marqué tous ses voisins LIFO : dernier marqué, premier traité exemple : s : sommet A Ordre d'exploration : Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 18 / 33 Parcours en profondeur récursif Entrée : G: graphe, s: racine\\ marque : liste initialisée avec n booléens à False Début parcours_profondeur(G,s,marque) marque[s]=True pour chaque sommet v adjacent au sommet s: si v.marque est faux alors parcours_profondeur(G,v,marque) fin si fin pour Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 19 / 33 Recherche de cycles dans un graphe Théorème 2.1 Soit G un graphe non-orienté de matrice d'adjacence A. Le nombre de chaines de longueur n joignant le sommet i au sommet j est donné par le terme d'indice i,j de la matrice An Conséquences : Méthode pour déterminer l'existence de cycles Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 20 / 33 Algorithme de Dijkstra, 1959 Généralisation de BFS Graphe Valué avec des coûts positifs Principe du marquage sommet non marqué, en cours de traitement, marqué Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 21 / 33 Dénition 3.1 Un arbre est un graphe simple non orienté connexe sans cycles Applications : arbres généalogiques, arbres de décision (météorologie, domaine médical...) Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 22 / 33 Vocabulaire racine (→orientation implicite), feuille (degré 1) Propriétés 2 Pour tout sommet u, il existe un unique chemin de la racine vers u. Nombre d'arêtes=nombre de sommets −1 Tout sommet a sur ce chemin est un ancêtre de u et u est dit descendant de a. père, ls, arité d'un sommet : nombre de ls, feuille profondeur d'un sommet : distance à la racine (3 est à la hauteur 0) Hauteur d'un arbre : distance maximale d'une feuille à la racine Le sous-arbre de racine 6 est de hauteur 1 Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 23 / 33 Structure d'arbres class Arbre: def __init__(self,racine,listeFils): self.n=racine self.fils=listeFils def ajoutfils(self,arbre1): self.fils=arbre1 Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 24 / 33 Les arbres binaires sont dénis récursivement. Un arbre binaire T est une structure : qui ne contient aucun noeud (arbre vide) ou qui est formé de 3 ensembles disjoints de noeuds : un noeud racine, un arbre binaire (sous-arbre gauche) et un arbre binaire (sous-arbre droit) Vocabulaire : enfant gauche, enfant droit, enfant manquant Arbre binaire complet : chaque noeud est soit une feuille, soit un noeud qui a 2 enfants. A la profondeur p, 2p noeuds. Si h est la hauteur de l'arbre binaire, le nombre de feuilles est majoré par 2h Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 25 / 33 Implémentation Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 26 / 33 Arbres binaires de recherche Chaque noeud contient une clé et éventuellement des données satellites. Les clés sont stockées de manière à satisfaire la propriété suivante : Propriétés 3 Soit x un noeud d'un arbre binaire. Si y est un noeud du sous-arbre gauche de x, alors y.clé≤ x.clé Si y est un noeud du sous-arbre de droite de x, alors x.clé≤y.clé Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 27 / 33 Parcours en largeur Achage des noeuds niveau par niveau Entrée : A: arbre début file:liste vide Si A non nul, enfiler(A,file) Tant que file non vide: u=défiler(f) Si u.filsG non nul enfiler(u.filsG) Fin Si Si u.filsD non nul enfiler(u.filsD) Fin Si Fin tant que Fin Si Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 28 / 33 Parcours en profondeur 3 types de parcours : parcours préxe : ache la racine avant les valeurs de chacun de ses sous-arbes parcours suxe : ache la racine après la valeur de ses sous-arbres parcours inxe : ache les valeurs du sous-arbre gauche, puis la racine, puis les valeurs du sous-arbre droit (ordre trié) Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 29 / 33 préxe : r,a,c,h,d,i,j,l,b,e,k,f suxe: h,c,i,l,j,d,a,k,e,f,b,r inxe: c,h,a,i,d,l,j,r,k,e,b,f Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 30 / 33 Pseudo-code ParcoursInfixe(x) Si x non nul ParcoursInfixe(x.gauche) Afficher x.clé ParcoursInfixe(x.droite) Fin Si ParcoursPrefixe(x) Si x non nul Afficher x.clé ParcoursPrefixe(x.gauche) ParcoursPrefixe(x.droite) Fin Si Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 31 / 33 Recherche d'une clé Pseudo-code Version récursive Rechercher(x,k) Si x est nul ou k=x.cle renvoie x Si k<x.cle renvoie Rechercher(x.gauche,k) sinon renvoie Rechercher(x.droite,k) Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 32 / 33 Insertion d'un élément Arbre_Inserer(T,z) y=None x=T.racine Tant que x non vide y=x si z.cle < x.cle x=x.gauche sinon x=x.droite z.p=y si y==nul T.racine=z sinon si z.cle<y.cle y.gauche=z sinon y.droite=z Mme Henry Gros-Désormeaux (UA) Algorithmique avancée Février 2020 33 / 33