Coloration de graphe, backtracking, branch and bound

Slides:



Advertisements
Présentations similaires
Université de Nantes CHORD Vincent Trève. Introduction ● Problématique – Comment accéder efficacement aux données réparties sur un système pair à pair?
Advertisements

CINI – Li115 1 Semaine 9 Algorithmes de tri ● Introduction ● Tri à bulle ● - principe ● - algorithme ● - efficacité ● Tri par sélection ● - principe, algorithme,
LE SUPPORT D'ORDINATEUR PORTABLE. Problématique Oh, j'ai chaud aux jambes ! Et moi, j'ai chaud à mon processeur !
II Circuits dans un graphe Une chaine est une liste ordonnée de sommets où deux sommets voisins de la liste sont des sommets adjacents du graphe.
1er partie : Les lois du courant continu
UE2 - M22 Licence acoustique
Le Mouvement Directionnel
Utiliser le calcul littéral pour résoudre ou démontrer
Reforme du collège physique chimie au cycle 4
Outils de Recherche Opérationnelle en Génie MTH 8414
Cycle 3 Cycle 4 Pilotage du robot mBot Site scratch :
Information, Communication, Calcul
Valeurs de toutes les différences observables sous H0
Ecriture collaborative d’une dissertation en classe
Les Tableaux Mme DJEBOURI. D.
Les Bases de données Définition Architecture d’un SGBD
La seconde POP L/T Seconde professionnelle à orientation progressive pour la filière transport et logistique.
Université Abou Bakr Belkaid Faculté des Sciences Département d’informatique Algorithmique Avancée et Complexité Chap5: Les méthodes de résolution exactes.
Niveau 2 : Tables de plongée
L’Instruction de Test Alternatif
IFT 615 – Intelligence artificielle Recherche heuristique
Suivi de réaction chimique par spectroscopie RMN
Javadoc et débogueur Semaine 03 Version A16.
Principes de programmation (suite)
Initiation à la programmation impérative et algorithmique
Projet tutoré DUT1.
Tables de décompression 2/2
Plan Introduction Parcours de Graphe Optimisation et Graphes
Université Abou Bakr Belkaid Faculté des Sciences Département d’informatique Algorithmique Avancée et Complexité Chap7: Les méthodes de résolution exactes.
Programmation Impérative II
Semaine #4 INF130 par Frédérick Henri.
Le choix optimal.
Chapitre 4 : Couleur des objets Les objectifs de connaissance :
LA CHARTE DE LA LAÏCITE A L’ECOLE
Information, Communication, Calcul
Algorithmique & Langage C IUT GEII S1 Notes de cours (deuxième partie)
Concepts de base de la programmation
Stabilité des porteurs horizontaux (Poutres)
Problématiques/plans/rédaction
1.2 dénombrement cours 2.
3- Nouvelles pages d’accueil
PROGRAMMATION ET ENSEIGNEMENT
Chapter 12: Structures de données
DATA WEARHOUSE 1ère année LA: Technologies systèmes d’information
Formation sur les bases de données relationnelles.
Exercice : le jeu. Vous devez concevoir l’algorithme permettant de jouer avec votre calculatrice : elle détermine au hasard un nombre caché entier entre.
Chapitre 3 : Caractéristiques de tendance centrale
OPTIMISATION 1ère année ingénieurs
SDRP & MA Problème du rendez vous : un algorithme probabiliste et une analyse probabiliste 09/11/2018.
Décomposer et encadrer les fractions
Adaptive Neuro Fuzzy Inference System (ANFIS)
Définition Jeu à l'atout 1/35
SIMPLIFICATION D’UNE RACINE CARREE.
Présenté devant le jury formé de:
Baccalauréat professionnel Session 2018 Formation
Présentation logiciel
Plan Introduction Parcours de Graphe Optimisation et Graphes
Élections locales probabilistes
Langages de programmation TP11
Le code de Huffman: est une méthode de compression statistique de données qui permet de réduire la longueur du codage d'un alphabet. Le code de Huffman.
Présentation 4 : Sondage stratifié
Reconnaissance de formes: lettres/chiffres
CSI 3505 Algorithmes Voraces
Tris Simples/Rapides.
Arbre binaire.
CSI 3505 / Automne 2005: Conception et Analyse des Algorithmes I.
« L’évaluation au service de la réussite des élèves »
Python Nicolas THIBAULT
Elections locales probabilistes
DICTIONNAIRES (MAPS).
Transcription de la présentation:

Coloration de graphe, backtracking, branch and bound par Aymeric ‘Bébert’ Bernard

Coloration de graphe

Coloration de graphe : définitions Comment colorer un graphe de telle sorte que deux nœuds adjacents soient de couleur différente ? Couleur : nombre entier, généralement entre 0 et n-1 χ(G) : nombre minimal de couleurs pour colorer G

Coloration de graphe : graphe biparti Il existe une partition des sommets du graphe en deux ensembles G1, G2 telle que toute arête relie un sommet de G1 à un sommet de G2 Graphe biparti : χ(G) = 2 (graphe colorable avec 2 couleurs)

Coloration de graphe : graphe biparti Comment savoir si un graphe est biparti ? → On parcourt le graphe, et à chaque changement de profondeur on change de couleur, Si ce n’est pas possible, le graphe n’est pas biparti

Coloration de graphe : comment faire ? Quel algorithme permet de colorer un graphe ? Quid de l’optimalité ? Deux algorithmes principaux : Algorithme glouton, naïf, non optimal mais rapide Backtracking, complexité élevée mais permet d’avoir un résultat optimal

Coloration de graphe : algorithme glouton Algorithme glouton : avance étape par étape, choisit une solution optimale localement, sans souci d’optimalité globale. Principe : on parcourt le graphe, et à chaque nœud on assigne la première couleur possible (en fonctions des voisins déjà colorés). Problème : le nombre de couleurs dépend du nœud de départ, de la manière de parcourir le graphe…

Coloration de graphe : algorithme glouton Exemple : Couleurs utilisées :

Coloration de graphe : algorithme glouton Exemple : Couleurs utilisées :

Coloration de graphe : algorithme glouton Exemple : Couleurs utilisées :

Coloration de graphe : algorithme glouton Exemple : Couleurs utilisées : 0

Coloration de graphe : algorithme glouton Exemple : Couleurs utilisées : 0

Coloration de graphe : algorithme glouton Exemple : Couleurs utilisées : 0, 1

Coloration de graphe : algorithme glouton Exemple : Couleurs utilisées : 0, 1

Coloration de graphe : algorithme glouton Exemple : Couleurs utilisées : 0, 1, 2

Coloration de graphe : algorithme glouton Exemple : Couleurs utilisées : 0, 1, 2

Coloration de graphe : algorithme glouton Exemple : Couleurs utilisées : 0, 1, 2

Coloration de graphe : algorithme glouton Exemple : Couleurs utilisées : 0, 1, 2

Coloration de graphe : algorithme glouton Exemple : Couleurs utilisées : 0, 1, 2

Coloration de graphe : algorithme glouton Exemple : Couleurs utilisées : 0, 1, 2

Coloration de graphe : algorithme glouton Exemple : Couleurs utilisées : 0, 1, 2, 3

Coloration de graphe : algorithme glouton Exemple : Couleurs utilisées : 0, 1, 2, 3 → 4 couleurs

Coloration de graphe : algorithme glouton Exemple : Et pourtant…

Coloration de graphe : algorithme glouton Exemple : Couleurs utilisées : 0, 1, 2

Coloration de graphe : algorithme glouton Exemple : Couleurs utilisées : 0, 1, 2

Coloration de graphe : algorithme glouton Exemple : Couleurs utilisées : 0, 1, 2

Coloration de graphe : algorithme glouton Exemple : Couleurs utilisées : 0, 1, 2

Coloration de graphe : algorithme glouton Exemple : Couleurs utilisées : 0, 1, 2

Coloration de graphe : algorithme glouton Exemple : Couleurs utilisées : 0, 1, 2 → 3 couleurs

Coloration de graphe : algorithme glouton function greedyColor(G): | c ← 0 | … | return c

Coloration de graphe : algorithme glouton function greedyColor(G): | c ← 0 | for i ← 0 to n-1: | | … | return c

Coloration de graphe : algorithme glouton function greedyColor(G): | c ← 0 | for i ← 0 to n-1: | | forbiddenColors ← tableau(c,False) | | for n in neighbors(G[i]) if n.color != None: | | | forbiddenColors[n.color] ← True | | … | return c

Coloration de graphe : algorithme glouton function greedyColor(G): | c ← 0 | for i ← 0 to n-1: | | forbiddenColors ← tableau(c,False) | | for n in neighbors(G[i]): | | | if n.color != None: | | | | forbiddenColors[n.color] ← True | | k ← c | | for j ← c-1 downto 0 if not(forbiddenColors[j]): | | | k ← j | | … | return c

Coloration de graphe : algorithme glouton function greedyColor(G): | c ← 0 | for i ← 0 to n-1: | | forbiddenColors ← tableau(c,False) | | for n in neighbors(G[i]): | | | if n.color != None: | | | | forbiddenColors[n.color] ← True | | k ← c | | for j ← c-1 downto 0 if not(forbiddenColors[j]): | | | k ← j | | if k = c: | | | c = c+1 | | | G[i].color ← c | | else: | | | G[i].color ← k | return c

Coloration de graphe : algorithme glouton Le nombre de couleurs utilisé ≤ Δ(G) +1 (Δ(G) = degré de G = nombre maximal d’arêtes partant d’un nœud) Complexité : Θ(|V|+|E|)

(et son application à la coloration de graphe) Le backtracking (et son application à la coloration de graphe)

Le backtracking : schéma général Principe général : revenir légèrement en arrière sur les décisions prises en cas de blocage Utilisé surtout dans la programmation sous contraintes : Colorer un graphe Problème des n dames Résolution d’une grille de sudoku Mise en place d’emplois du temps …

Le backtracking : schéma général On veut créer un algorithme qui renvoie True si une solution à notre problème (avec ses contraintes) existe, et False sinon (variante : stocker une ou toutes les solutions trouvées et les renvoyer). « revenir légèrement en arrière » : par récursivité, on ne crée pas de fonction que revient explicitement sur une étape précédente !

Le backtracking : schéma général Schéma de l’algorithme : function backtrack(s,d): # s situation courante, d profondeur courante | …

Le backtracking : schéma général Schéma de l’algorithme : function backtrack(s,d): | -- si s est solution, on renvoie True --

Le backtracking : schéma général Schéma de l’algorithme : function backtrack(s,d): | if isSolution(s): | | return True # ou stocker si on veut stocker toutes les solutions | …

Le backtracking : schéma général Schéma de l’algorithme : function backtrack(s,d): | if isSolution(s): | | return True | -- sinon, on veut parcourir les situations de profondeur d+1 -- | …

Le backtracking : schéma général Schéma de l’algorithme : function backtrack(s,d): | if isSolution(s): | | return True | for n in nextSituations(s): | | … | …

Le backtracking : schéma général Schéma de l’algorithme : function backtrack(s,d): | if isSolution(s): | | return True | for n in nextSituations(s): | | -- appel récursif pour la situation n, à une profondeur d+1 -- | …

Le backtracking : schéma général Schéma de l’algorithme : function backtrack(s,d): | if isSolution(s): | | return True | for n in nextSituations(s): | | if backtrack(n,d+1): # solution trouvée dans cette branche ! | | | … | …

Le backtracking : schéma général Schéma de l’algorithme : function backtrack(s,d): | if isSolution(s): | | return True | for n in nextSituations(s): | | if backtrack(n,d+1): | | | -- on fait remonter l’information dans la recursion -- | …

Le backtracking : schéma général Schéma de l’algorithme : function backtrack(s,d): | if isSolution(s): | | return True | for n in nextSituations(s): | | if backtrack(n,d+1): | | | return True | …

Le backtracking : schéma général Schéma de l’algorithme : function backtrack(s,d): | if isSolution(s): | | return True | for n in nextSituations(s): | | if backtrack(n,d+1): | | | return True | -- si aucune de ces situations n’est possible, renvoyer False --

Le backtracking : schéma général Schéma de l’algorithme : function backtrack(s,d): | if isSolution(s): | | return True | for n in nextSituations(s): | | if backtrack(n,d+1): | | | return True | return False

Le backtracking : illustration du principe 1 function backtrack(s,d): 2 | if isSolution(s): 3 | | return True 4 | for n in nextSituations(s): 5 | | if backtrack(n,d+1): 6 | | | return True 7 | return False

Le backtracking : illustration du principe 1 function backtrack(s,d): 2 | if isSolution(s): 3 | | return True 4 | for n in nextSituations(s): 5 | | if backtrack(n,d+1): 6 | | | return True 7 | return False

Le backtracking : illustration du principe 1 function backtrack(s,d): 2 | if isSolution(s): 3 | | return True 4 | for n in nextSituations(s): 5 | | if backtrack(n,d+1): 6 | | | return True 7 | return False

Le backtracking : illustration du principe 1 function backtrack(s,d): 2 | if isSolution(s): 3 | | return True 4 | for n in nextSituations(s): 5 | | if backtrack(n,d+1): 6 | | | return True 7 | return False

Le backtracking : illustration du principe 1 function backtrack(s,d): 2 | if isSolution(s): 3 | | return True 4 | for n in nextSituations(s): 5 | | if backtrack(n,d+1): 6 | | | return True 7 | return False

Le backtracking : illustration du principe 1 function backtrack(s,d): 2 | if isSolution(s): 3 | | return True 4 | for n in nextSituations(s): 5 | | if backtrack(n,d+1): 6 | | | return True 7 | return False

Le backtracking : illustration du principe 1 function backtrack(s,d): 2 | if isSolution(s): 3 | | return True 4 | for n in nextSituations(s): 5 | | if backtrack(n,d+1): 6 | | | return True 7 | return False

Le backtracking : illustration du principe 1 function backtrack(s,d): 2 | if isSolution(s): 3 | | return True 4 | for n in nextSituations(s): 5 | | if backtrack(n,d+1): 6 | | | return True 7 | return False

Le backtracking : illustration du principe 1 function backtrack(s,d): 2 | if isSolution(s): 3 | | return True 4 | for n in nextSituations(s): 5 | | if backtrack(n,d+1): 6 | | | return True 7 | return False

Le backtracking : illustration du principe 1 function backtrack(s,d): 2 | if isSolution(s): 3 | | return True 4 | for n in nextSituations(s): 5 | | if backtrack(n,d+1): 6 | | | return True 7 | return False

Le backtracking : illustration du principe 1 function backtrack(s,d): 2 | if isSolution(s): 3 | | return True 4 | for n in nextSituations(s): 5 | | if backtrack(n,d+1): 6 | | | return True 7 | return False

Le backtracking : illustration du principe 1 function backtrack(s,d): 2 | if isSolution(s): 3 | | return True 4 | for n in nextSituations(s): 5 | | if backtrack(n,d+1): 6 | | | return True 7 | return False

Le backtracking : illustration du principe 1 function backtrack(s,d): 2 | if isSolution(s): 3 | | return True 4 | for n in nextSituations(s): 5 | | if backtrack(n,d+1): 6 | | | return True 7 | return False

Le backtracking : illustration du principe 1 function backtrack(s,d): 2 | if isSolution(s): 3 | | return True 4 | for n in nextSituations(s): 5 | | if backtrack(n,d+1): 6 | | | return True 7 | return False

Le backtracking : illustration du principe 1 function backtrack(s,d): 2 | if isSolution(s): 3 | | return True 4 | for n in nextSituations(s): 5 | | if backtrack(n,d+1): 6 | | | return True 7 | return False

Le backtracking : illustration du principe 1 function backtrack(s,d): 2 | if isSolution(s): 3 | | return True 4 | for n in nextSituations(s): 5 | | if backtrack(n,d+1): 6 | | | return True 7 | return False

Le backtracking : illustration du principe 1 function backtrack(s,d): 2 | if isSolution(s): 3 | | return True 4 | for n in nextSituations(s): 5 | | if backtrack(n,d+1): 6 | | | return True 7 | return False

Le backtracking : illustration du principe 1 function backtrack(s,d): 2 | if isSolution(s): 3 | | return True 4 | for n in nextSituations(s): 5 | | if backtrack(n,d+1): 6 | | | return True 7 | return False

Le backtracking : illustration du principe 1 function backtrack(s,d): 2 | if isSolution(s): 3 | | return True 4 | for n in nextSituations(s): 5 | | if backtrack(n,d+1): 6 | | | return True 7 | return False

Le backtracking : illustration du principe 1 function backtrack(s,d): 2 | if isSolution(s): 3 | | return True 4 | for n in nextSituations(s): 5 | | if backtrack(n,d+1): 6 | | | return True 7 | return False

Le backtracking : attention Lors d’une mise en place d’un algorithme de backtracking, faire attention aux points suivants : Soigner la situation d’arrêt (valable pour tout algorithme récursif) Si le problème peut présenter un cycle (on peut revenir à un état déjà traité), il faut trouver un moyen de repérer les états déjà parcourus (attribut, stockage dans un dictionnaire,…) La complexité du backtracking est exponentielle, en Θ(bd) avec `b` le facteur de branchement et `d` la profondeur maximale de récursion.

Le backtracking : coloration de graphe maxColor = n function backtrackColor(G,k): # k : noeud courant | if k = |V(G)|: | | return True | for c ← 0 to maxColor: | | V(G)[k].color ← c | | if not c in [n.color for n in neighbors(V(G)[k])]: | | | if backtrackColor(G,k+1): | | | | return True | V(G)[k].color ← -1 # décolorer le sommet | return False function backtrack(s,d): | if isSolution(s): | | return True | for n in nextSituations(s): | | if backtrack(n,d+1): | | | return True | return False L’algorithme renvoie True si le graphe est colorable avec maxColor couleurs.

Le backtracking : coloration de graphe optimale A partir de cet algorithme, il est possible d’obtenir χ(G) maxColor = n function backtrackColor(G,k): | if k = |V(G)|: | | return True | for c ← 0 to maxColor: | | V(G)[k].color ← c | | if not c in [n.color for n in neighbors(V(G)[k])]: | | | if backtrackColor(G,k+1): | | | | return True | V(G)[k].color ← -1 | return False maxColor ← ∞ function backtrackColorOpt(G,k): | if k = |V(G)|: | | maxColor ← min(maxColor,countColors(G)) | for c ← 0 to maxColor: | | V(G)[k].color ← c | | if not c in [n.color for n in neighbors(V(G)[k])]: | | | backtrackColorOpt(G,k+1): | V(G)[k].color ← -1

(séparation et évaluation) Branch and bound (séparation et évaluation)

Branch and bound : principe Branch : séparer l’ensemble des solutions en ensembles plus petits Bound : évaluer ces sous-ensembles et n’explorer que ceux pouvant contenir une solution meilleure que la meilleure solution courante (par majoration). « solution courante » : on stocke la meilleure solution trouvée jusqu’à présent par l’algorithme. Cela nous donne encore une fois une structure d’arbre, dans lequel seules les branches les plus prometteuses vont être parcourues (on parle d’élagage, d’arbre de décision,…)

Branch and bound : comment s’y prendre ? Comment savoir si un ensemble de solutions ne contient pas de solution optimale ? → Déterminer une borne inférieure pour le coût des solutions de cet ensemble (s'il s'agit d'un problème de minimisation). Si cette borne inférieure est de coût supérieur au coût de la meilleure solution courante, le sous-ensemble ne contient pas d'optimum.

Branch and bound : complexité En théorie la même que celle du backtracking : exponentielle, en Θ(bd) En pratique, on peut arriver bien plus vite à une solution optimale (ou acceptable, on peut s’arrêter quand on veut) Utilisations : Problèmes d’optimisation IA (échecs,…)

Branch and bound : exemple item 1 item 2 item 3 item 4 coût 4 5 6 2 poids 33 49 60 32 Nombre x1 x2 x3 x4 Poids maximal : 130 Nombre d’objet maximal : 4 On veut maximiser : 4x1 + 5x1 + 6x1 + 2x1 Sous la contrainte : 33x1 + 49x1 + 60x1 + 32x1 ≤ 130

Branch and bound : exemple item 1 item 2 item 3 item 4 coût 4 5 6 2 poids 33 49 60 32 Nombre x1 x2 x3 x4 Fonction d’évaluation pour ce problème (critère de choix pour le prochain nœud) : maximiser coût/poids Ici item 1 a un coût/poids maximal, on va commencer par ajouter des items 1

Branch and bound : exemple 12 item 1 item 2 item 3 item 4 coût 4 5 6 2 poids 33 49 60 32 > x1 = 3 : on ne peut plus rien mettre dans le sac, on a donc une (meilleure) solution à 12 Meilleure solution : 12

Branch and bound : exemple 12 item 1 item 2 item 3 item 4 coût 4 5 6 2 poids 33 49 60 32 14,53 > x1 = 2 : item 2 a maintenant le meilleur coût/poids. Evaluation : 2*4 + 5/49 x (130 - 2x33) = 14,53 14,53 > 13 = 12+1 donc on a potentiellement une meilleure solution, on sépare le nœud Meilleure solution : 12

Branch and bound : exemple 12 13 item 1 item 2 item 3 item 4 coût 4 5 6 2 poids 33 49 60 32 14,53 >> x1 = 2, x2 = 1 : on ne peut plus rien ajouter, solution à 2x4 + 5 = 13, c’est une meilleure solution Meilleure solution : 13

Branch and bound : exemple 12 13 item 1 item 2 item 3 item 4 coût 4 5 6 2 poids 33 49 60 32 14,53 14,4 >> x1 = 2, x2 = 0 : l’item 3 a maintenant le meilleur coût/poids. Evaluation : 2*4 + 0 + 6/60 x (130 - 2x33) = 14,4 14 > 13+1 donc on a potentiellement une meilleure solution, on sépare le nœud Meilleure solution : 13

Branch and bound : exemple 12 13 item 1 item 2 item 3 item 4 coût 4 5 6 2 poids 33 49 60 32 14,53 14 14,4 >>> x1 = 2, x2 = 0, x3 = 1 : on ne peut plus rien ajouter, solution à 2x4 + 6 = 14, c’est une meilleure solution Meilleure solution : 14

Branch and bound : exemple 12 13 item 1 item 2 item 3 item 4 coût 4 5 6 2 poids 33 49 60 32 14,53 14 14,4 13,89 > x1 = 1 : évaluation 4 + 5/49 x (130 – 33) = 13,89 On n’aura pas de meilleure solution dans cette branche (branche élaguée) Meilleure solution : 14

Branch and bound : exemple 12 13 item 1 item 2 item 3 item 4 coût 4 5 6 2 poids 33 49 60 32 14,53 14 14,4 13,89 > x1 = 0 : évaluation 5/49 x 130 = 13,27 On n’aura pas de meilleure solution dans cette branche (branche élaguée) 13,27 Meilleure solution : 14

Branch and bound : algorithme function solveBB(problem): | activeNodes ← getActiveNodes(problem) | best ← -∞ | while activeNodes != []: | | n = choseActiveNode(activeNodes) # à définir | | if estSolution(n): | | | best ← max(best,n) | | else: | | | children ← split(n) | | | for f in children: | | | | e ← eval(f) # à définir | | | | if e > best: | | | | | activeNodes.add(f) | return best