10.07.2015 Views

Les algorithmes voraces - UQAC

Les algorithmes voraces - UQAC

Les algorithmes voraces - UQAC

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Les</strong> <strong>algorithmes</strong> <strong>voraces</strong>Technique pour résoudre des problèmes d’optimisationLa solution optimale à un problème est obtenue en effectuant uneséquence de choix.À chaque point de décision dans l’algorithme, le choix qui semble le plusprometteur à ce moment est effectué.Exemple: Remise de la monnaie avec un nombre minimal de pièces() February 12, 2013 1 / 48


Plus court chemin dans un grapheEntrée:Problème:Un graphe dirigé G = 〈N, A〉 où chaque arc possède unelongueur non négative. Un des noeuds du graphe est appelésource.Trouver la longueur du plus court chemin entre le noeudsource s et tous les autres noeuds.On suppose N = {1, 2, ..., n} et que le noeud source est 1() February 12, 2013 2 / 48


Algorithme de DijkstraA chaque itération on choisit un noeud t tel que le plus court chemin entre1 et t est connu. On dénote par S l’ensemble des éléments choisis.Définition: On dit qu’un chemin entre 1 et t est spécial si tous les noeudintermédiaires sont dans S.Définition: Le tableau D donne la longueur du plus court chemin spécialentre 1 et tous les autres noeuds.Remarque: Si S = N alors D[t] est la longueur du chemin le plus courtentre 1 et t.() February 12, 2013 3 / 48


Définition: La matrice L donne la longueur de l’arc entre chaque pair denoeuds. Si l’arc entre les noeuds i et j est absent alors on a L[i, j] = ∞.fonction Dijkstra(L[1..n,1..n])S={1}pour i=1 à n faireD[i]=L[1,i]répéter n-2 foischoisir v dans N-S tel que D[v] est minimalajouter v à Spour chaque w successeur de v faireD[w]=min{D[w],D[v]+L[v,w]}retourner D() February 12, 2013 4 / 48


Exemple110505 302100104502035Étape v N − S D0 – {2, 3, 4, 5} [50.30.100, 10]1 5 {2, 3, 4} [50, 30, 20, 10]2 4 {2, 3} [40, 30, 20, 10]3 3 {2} [35, 30, 20, 10]() February 12, 2013 5 / 48


Théorème:Rectitude de l’algorithme(a) Si un noeud i ≠ 1 est dans S alors D[i] donne la longueur du pluscourt chemin entre 1 et i.(b) Si un noeud i n’est pas dans S alors D[i] donne la longueur du pluscourt chemin spécial entre 1 et i.Preuve. (par induction mathématique)Base: S = {1}Hypothèse d’induction: <strong>Les</strong> deux conditions sont vraies juste avantd’ajouter le noeud v à S.() February 12, 2013 6 / 48


Pas d’induction pour la condition (a)Rien de changé pour les noeuds déjà dans S.Par hyposthèse d’induction, D[v] est la longueur du chemin spécial le pluscourt.Si le chemin le plus court entre 1 et v passe par un noeud x /∈ S alors onaurait dû choisir x au lieu de v.() February 12, 2013 7 / 48


xsourcev() February 12, 2013 8 / 48


Pas d’induction pour la condition (b)Il y a deux cas:1 Le plus court chemin spécial de 1 à w ne passe pas par v et doncreste D[w] ou2 Le plus court chemin spécial de 1 à w passe par v:2.1 v est le noeud qui précède w2.2 x ≠ v est le noeud qui précède w() February 12, 2013 9 / 48


On doit avoir v = x car sinon on aurait choisis v avant x.sourcevxw() February 12, 2013 10 / 48


Analyse de l’algorithme de DijkstraLe temps est fonction du nombre de noeuds et d’arêtes: T (a, n)Il y a deux structures de données à considérer:graphe L (matrice ou listes d’adjacence)file de priorité D (tableau ou monceau)() February 12, 2013 11 / 48


Complexité des opérations sur la file de prioritétableau monceauconstruire O(1) O(n)trouver O(n) O(lg n)enlever O(1) O(lg n)ajouter O(1) O(lg n)modifier O(1) O(lg n)() February 12, 2013 12 / 48


Temps d’exécutionD tableau monceauL matrice listes d’adjacenceT (a, n) O(n 2 ) O((n + a) lg n)graphe dense O(n 2 ) O(n 2 lg n)graphe claisemé O(n 2 ) O(n lg n)Remarque: Si le graphe est réprésenté sous la forme de listes d’adjacenceet que D est un monceau alors le temps total passé à exécuter la dernièreboucle pour sera dans Θ(a log n) où a est le nombre d’arcs.() February 12, 2013 13 / 48


Généralisation de l’algorithme de DijkstraL’algorithme de Dijkstra est utile lorsque l’on ne possède aucuneinformation particulière sur le graphe.En pratique, ce n’est pas le cas.Considérer par exemple, un service Internet, tel que Google Map, quicalcule le meilleur itinéraire entre deux villes. Il est possible de donner uneapproximation du temps nécessaire en utilisant la distance (à vol d’oiseau)entre les deux villes.On peut alors ignorer les villes qui nous éloignent trop de notre destination.() February 12, 2013 14 / 48


PéribonkaSt-FélicienAlmaRobervalChicoutimiJoncquièreLa BaieSaint SiméonLa TuqueBaie Saint PaulShawiniganQuébecTrois RivièreDrumondvilleMontréalSherbrooke() February 12, 2013 15 / 48


Chemin le plus court entre deux noeudsSoit un graphe G = (N, A) tel que N = {1, 2, . . . , n}. On cherche le pluscourt chemin de 1 à n.On suppose l’existence d’une fonction h : N → R tel que h(i) est uneapproximation de la distance entre i et n.On suppose aussi que h ne surestime jamais la distance. En d’autres mots,h(i) est plus petit ou égal à la longueur du plus court chemin entre i et n.() February 12, 2013 16 / 48


Algorithme A ∗fonction A*(L[1..n,1..n])S={1}pour i=1 à n faire D[i]=L[1,i]répéterchoisir v dans N-S t.q. D[v]+h(v) est minimalsi (v=n) alors retourner D[n]ajouter v à Spour chaque w successeur de v fairesi (D[w] > D[v]+L[v,w]) alorsD[w] = D[v]+L[v,w]enlever w de S (s’il s’y trouve)() February 12, 2013 17 / 48


RemarquesL’algorithme de Dijkstra est le cas particulier où h(n) = 0 pour tous n ∈ N.Dans l’algorithme de Dijkstra, tous les noeuds w ∈ S sont tels que D[w]est minimal. On ne peut donc jamais diminuer D[w] et l’instruction“enlever w de S” est inutile.Problème: Modifiez l’algorithme A ∗ pour qu’il retourne le plus courtchemin plutôt que sa longueur.() February 12, 2013 18 / 48


Code d’HuffmanProblème: Sauvegarder un fichier en utilisant le moins d’espace possible.Idée: On lit le fichier 2 fois1 On calcule la fréquence de chaque caractère2 On encode chaque caractère en binaire: Code court pour lescaractères apparaissant le plus souvent.() February 12, 2013 19 / 48


Exemple. Fichier de 100000 caractères (6 caractères distincts)Caractère a b c d e fFréquence 45 13 12 16 9 5Code fixe 000 001 010 011 100 101Code variable 0 101 100 111 1101 1100() February 12, 2013 20 / 48


Encoder abc:Code fixe:Code variable:Taille du fichier encodé:}{{} 000 }{{} 001 }{{} 010a b c}{{} 0 }{{} 101 }{{} 100a b cCode fixe: 3 ∗ 100000 = 300000 bitsCode variable: 1 ∗ 45000 + 3 ∗ 13000 + 3 ∗ 12000+ 3 ∗ 16000 + 4 ∗ 5000= 224000 bits() February 12, 2013 21 / 48


Code préfixeCode dont l’encodage d’un caractère n’est le préfixe d’aucun autre.Exemple: Le code suivant n’est pas préfixea → 10b → 1011Simplifie l’encodage: concaténationSimplifie le décodage: pas d’ambiguïtéExemple:0010111010 0 101 1101a a b e() February 12, 2013 22 / 48


Un code préfixe peut toujours être représenté à l’aide d’un arbre binaire.Si l’arbre n’est pas complet alors le code n’est pas optimal.a: 000b: 001c: 010d: 011e: 100f: 101() February 12, 2013 23 / 48


En général:Alphabet ALa profondeur d’un caractère=la longueur de l’encodage de ce caractèref (c) dénote la fréquence du caractère c ∈ Ad T (c) dénote la profondeur du caractère c dans l’arbre TLe nombre de bits requis pour encoder le fichier à l’aide de T est appelé lecoût de T et défini par:coût(T ) = ∑ f (c)d T (c)c∈A() February 12, 2013 24 / 48


Construire un code d’HuffmanExemple:a)f: 5 e: 9 c: 12 b: 13 d: 16 a: 45b)c: 12 b: 1314d: 16a: 45f: 5e: 9() February 12, 2013 25 / 48


c)d: 161425a: 45f: 5e: 9c: 12b: 13d)2530a: 45c: 12b: 1314d: 16f: 5e: 9() February 12, 2013 26 / 48


e)a: 45552530c: 12b: 1314d: 16f: 5e: 9() February 12, 2013 27 / 48


f)100a: 45552530c: 12b: 1314d: 16f: 5e: 9() February 12, 2013 28 / 48


ImplémentationRappel: File de prioritéStructure de données permettant de manipuler un ensembleQ = {x 1 , x 2 , ..., x n }x i :valeurfréquencegauche droite() February 12, 2013 29 / 48


Opérations:1 Q=créer file(A) O(n)2 insérer(Q,x) O(lg n)3 m=extraire min(Q) O(lg n)4 x=creer element() O(1)5 v=valeur(x) O(1)6 f=frequence(x) O(1)7 xd=droite(x) O(1)8 xg=gauche(x) O(1)() February 12, 2013 30 / 48


ExempleA = {[a, 45], [b, 13], [c, 12], [d, 16], [e, 9], [f , 5]}() February 12, 2013 31 / 48


AlgorithmeA est un alphabet contenant n caractèresOn associe à chaque caractère c une valeur f (c)Huffman(A,n)Q=creer_file(A,n)pour i=1 à n-1 fairez=creer_element()x=gauche(z)=extraire_min(Q)y=droite(z)=extraire_min(Q)f(z)=f(x)+f(y)inserer(Q,z)retourner extraire_min(Q)Temps d’exécution: O(n lg n)() February 12, 2013 32 / 48


Optimalité de la constructionx: le caractère ayant la moins grande fréquencey: le caractère ayant la seconde moins grande fréquenceFait 1: x et y doivent être à une profondeur maximaleFait 2: SPDG x et y ont le même père() February 12, 2013 33 / 48


Exemple pour 1c: 12010 1b: 13 a: 45128000a: 45010 1b: 13 c: 1295000() February 12, 2013 34 / 48


Fait 3: Si on remplace x et y par un nouveau caractère z ayant unefréquencef (z) = f (x) + f (y)alors le nouvel arbre représente un code optimal pourA − {x, y} ∪ {z}() February 12, 2013 35 / 48


Exemple 2TT‘14z: 14x: 5 y: 9() February 12, 2013 36 / 48


Arbre couvrant minimalEntrée: Un graphe G = 〈N, A〉 où chaque arête a ∈ A a une longueurpositive l(a).Problème: Trouver un sous-ensemble T ⊆ A, tel que le graphe demeureconnecté si seules les arêtes dans T sont utilisées. De plus, on doitminimiser ∑ l(x).x∈TFait: T doit être un arbre.() February 12, 2013 37 / 48


Algorithme de Kruskal1 Trier les arêtes en ordre croissant2 Choisir la prochaine arête qui ne crée par de cycle avec celles déjàchoisies.() February 12, 2013 38 / 48


1 21 2 346 54 63 84 5 674 37{1}{2}{3}{4}{5}{6}{7}(1, 2) 1 {1, 2}{3}{4}{5}{6}{7}(2, 3) 2 {1, 2, 3}{4}{5}{6}{7}(4, 5) 3 {1, 2, 3}{4, 5}{6}{7}(6, 7) 3 {1, 2, 3}{4, 5}{6, 7}(1, 4) 4 {1, 2, 3, 4, 5}{6, 7}(2, 5) 4 X(4, 7) 4 {1, 2, 3, 4, 5, 6, 7}() February 12, 2013 39 / 48


Structure d’ensembles disjointsN objets numérotés de 1 à NOn veut regrouper ces objets en un certains nombre d’ensemblesdisjoints.Dans chaque ensemble, on choisi un objet pour servir de représentant2 sortes d’opérations1 representant(a): retourne le représentant de l’ensemble contenant a2 fusionner(a, b): fusionne les deux ensembles contenant a et b, retourneun représentant pour le nouvel ensemble.() February 12, 2013 40 / 48


Chaque ensemble est représenté par un arbre inversé:64 911 112 20 25() February 12, 2013 41 / 48


fonction representant(x)i=xtantque père[i] != i fairei=père[i]retourner i// a et b sont des représentant distinctsprocedure fusion(a,b)si hauteur[a]=hauteur[b] alorshauteur[a]=hauteur[a]+1père[b]=asinonsi hauteur[a]> hauteur[b] alorspère[b]=asinonpère[a]=b() February 12, 2013 42 / 48


Exemple 1:614 912 20 251612 20 254 9() February 12, 2013 43 / 48


Exemple 2:614 912 20 2571612 20 254 97() February 12, 2013 44 / 48


Analyse de la structure d’ensembles disjointsNoeuds:pèrehauteurinformationInitialisation: père[a]=a et hauteur[a]=0Proposition: Après une séquence arbitraire d’opérations fusion à partir dela situation initiale, un arbre a contenant k noeuds aura une hauteur d’auplus ⌊lg k⌋.Corollaire: Le temps requis pour effectuer une séquence arbitraire de nopérations representant et fusion est dans O(n lg n)en pire cas.() February 12, 2013 45 / 48


Preuve par induction de la propositionTrivial si l’arbre a contient k = 1 noeud.Supposons que l’arbre a contient k > 1 noeuds.L’abre a est construit à partir de 2 sous-arbres b et c :b contient i noeuds et hauteur[i] ≤ lg i (hypothèse d’induction)c contient j noeuds et hauteur[j] ≤ lg j (hypothèse d’induction)i + j = k et SPDG i ≤ jSi i < j alorshauteur[a] = hauteur[c]≤ lg j ≤ lg kSi i = j alorshauteur[a] =1+hauteur[c]≤ 1 + lg j = lg(2j) = lg k() February 12, 2013 46 / 48


Algorithme de Kruskalfonction Kruskal(G=(N,A))Trier A en ordre croissantT={}Initialiser n ensemblesTantque |T|< n-1 faire(u,v)=prochaine ar^eteurep=representant(u)vrep=representant(v)si urep != vrep alorsfusion(urep,vrep)ajouter (u,v) à T() February 12, 2013 47 / 48


AnalyseOn peut trier un ensemble de k éléments en temps O(k lg k)Le temps pour trier est dans O(|A| lg |A|) = O(|A| lg n)puisque |A| ≤ n(n − 1)/2Initialisation: O(n)Boucle tant que: Au plus |A| itérations=⇒ une séquence d’au plus 3|A| opérations representant et fusion=⇒ O(|A| log n)T (n) ∈ O(|A| lg n)() February 12, 2013 48 / 48

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!