La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Cours d'algorithmique 3 - Intranet 1 13 novembre 2006 Cours dAlgorithmique Parcours darbres. Induction sur la structure. Back-track.Minimax.

Présentations similaires


Présentation au sujet: "Cours d'algorithmique 3 - Intranet 1 13 novembre 2006 Cours dAlgorithmique Parcours darbres. Induction sur la structure. Back-track.Minimax."— Transcription de la présentation:

1 Cours d'algorithmique 3 - Intranet 1 13 novembre 2006 Cours dAlgorithmique Parcours darbres. Induction sur la structure. Back-track.Minimax.

2 13 novembre 2006Cours d'algorithmique 3 - Intranet2 Trier et chercher Trier et chercher Listes et arbres Listes et arbres Le back-track Le back-track Arbres équilibrés Arbres équilibrés Récursivité et induction sur la structure Récursivité et induction sur la structure Divide and conquer Divide and conquer Minimax Minimax Dérécursion Dérécursion NP-complétude NP-complétude Logique de Hoare Logique de Hoare Programmation dynamique Programmation dynamique Complexité et calculabilité Complexité et calculabilité Les grandes lignes du cours

3 13 novembre 2006Cours d'algorithmique 3 - Intranet3 Fibonnacci et les arbres ptr_arbre arbre_fibo (int n) {if ( n == 0 ) return( cree_feuille(0) ); else if ( n == 1 ) return( cree_feuille(1) ); else return( cree_noeud( arbre_fibo(n-1), arbre_fibo(n-2) ) ) ; }

4 13 novembre 2006Cours d'algorithmique 3 - Intranet4 Fibonnacci et les arbres arbre_fibo(5) On observe que de nombreux calculs sont répétés !

5 13 novembre 2006Cours d'algorithmique 3 - Intranet5 Calcul de la somme des feuilles int somme_arbre_fibo (ptr_arbre arbre) {if ( est_feuille(arbre) ) return( valeur_feuille(arbre) ); else return( somme_arbre_fibo(fils_gauche(arbre)) + somme_arbre_fibo(fils_droit(arbre)) ) ; }

6 13 novembre 2006Cours d'algorithmique 3 - Intranet6 Calcul de la somme des feuilles somme_arbre_fibo(5) =

7 13 novembre 2006Cours d'algorithmique 3 - Intranet7 Calcul de la somme des feuilles int somme_arbre_fibo (ptr_arbre arbre) {return( somme_acc(arbre, 0) ) ; } int somme_acc(ptr_arbre arbre, int accumule) {if ( est_feuille(arbre) ) return( accumule + valeur_feuille(arbre) ); else return( somme_acc(fils_droit(arbre), somme_acc(fils_gauche(arbre), accumule)) ) ; }

8 13 novembre 2006Cours d'algorithmique 3 - Intranet8 somme_arbre_fibo(5) = 5 Calcul de la somme des feuilles accumule = accumule = 5

9 13 novembre 2006Cours d'algorithmique 3 - Intranet9 Types de parcours Parcours préfixe res_fg = appel ( fg(a) ); res_fd = appel ( fd(a) ); return(... res_fg... res_fd... ); Ou encore :... appel ( fg(a) ) / appel ( fd(a) )...

10 13 novembre 2006Cours d'algorithmique 3 - Intranet10 Types de parcours Parcours suffixe ou postfixe res_fg = appel ( fd(a) ); res_fd = appel ( fg(a) ); return(... res_fg... res_fd... ); Ou encore :... appel ( fd(a) ) / appel ( fg(a) )...

11 13 novembre 2006Cours d'algorithmique 3 - Intranet11 Types de parcours Parcours avec opérateur commutatif : lordre de parcours est sans importance !... oper_commute ( fg(a), fd(a) ) oper_commute ( fd(a), fg(a) )... Exemple : notre calcul de la somme de Fibonnacci.

12 13 novembre 2006Cours d'algorithmique 3 - Intranet12 Types de parcours avec étiquettes Traitement de létiquette, soit avant, soit après, soit pendant ! Impression préfixe de larbre : Impression préfixe de larbre : * Impression postfixe de larbre : Impression postfixe de larbre : * Impression infixe parenthésée : Impression infixe parenthésée : ( ( ) * 3 ) *

13 13 novembre 2006Cours d'algorithmique 3 - Intranet13 Modification dun arbre En reconstruisant : En reconstruisant : Partie qui doit être reconstruite. cree_noeud( fg(arbre), cree_noeud( fg(fd(arbre)), cree_noeud( fg(fd(arbre)), cree_noeud( cree_noeud(cree_feuille(4), cree_noeud( cree_noeud(cree_feuille(4), cree_feuille(6)), cree_feuille(6)), fd(fd(fd(arbre))) ) ) ) ; fd(fd(fd(arbre))) ) ) ) ;

14 13 novembre 2006Cours d'algorithmique 3 - Intranet14 Modification dun arbre En modifiant : En modifiant : Pointeur qui est modifié. modifie_fg_noeud( fd(fd(arbre)), cree_noeud( cree_feuille(4), cree_noeud( cree_feuille(4), cree_feuille(6) ) ) ; cree_feuille(6) ) ) ;

15 13 novembre 2006Cours d'algorithmique 3 - Intranet15 Modification dun arbre Attention aux partages de structure avec modifications physiques ! avec modifications physiques ! 3 5 sous_arbre = cree_noeud( cree_feuille(3), cree_feuille(5) ); arbre = cree_noeud( sous_arbre, sous_arbre ); 9 5 Représentation physique ! 9 5 Larbre logique ! ! ! Reconstructiondarbre. Modificationphysique.

16 13 novembre 2006Cours d'algorithmique 3 - Intranet16 Induction sur les structures Induction simple sur les entiers naturels : Induction simple sur les entiers naturels : – On démontre la propriété pour 0, le premier entier naturel. – On démontre que la propriété reste vraie pour i+1, si elle est vraie pour i. Cest le pas dinduction ! – Donc, elle est vraie pour tout entier naturel. Induction totale sur les entiers naturels : Induction totale sur les entiers naturels : – On démontre la propriété pour 0, le premier entier naturel. – On démontre que la propriété reste vraie pour i+1, si elle est vraie pour tous les entiers de 0 à i. Cest le pas dinduction ! – Donc, elle est vraie pour tout entier naturel.

17 13 novembre 2006Cours d'algorithmique 3 - Intranet17 Induction sur les listes Induction sur les listes : Induction sur les listes : – On démontre la propriété pour la liste vide (ceci ne marche donc pas pour les listes circulaires !). – On suppose la propriété vraie pour une liste de longueur i – et on démontre quelle reste vraie pour la liste de longueur i+1 que lon obtient en ajoutant un élément (bien choisi) en tête de liste. – Variantes : éventuellement, une propriété nest vraie que pour une liste de longueur au moins k : On démontre pour k On démontre pour k et on démontre quelle reste vraie pour les listes plus longues. et on démontre quelle reste vraie pour les listes plus longues.

18 13 novembre 2006Cours d'algorithmique 3 - Intranet18 Induction sur les arbres Induction sur les arbres : Induction sur les arbres : – On démontre la propriété pour une feuille quelconque. – On suppose la propriété vraie pour les sous-arbres – et on démontre quelle reste vraie pour larbre que lon obtient en ajoutant un nœud père au-dessus des différents sous-arbres (bien choisis). – Remarque : Le raisonnement de correction dune fonction récursive sur arbres, listes, etc, se fait de la même manière : Le raisonnement de correction dune fonction récursive sur arbres, listes, etc, se fait de la même manière : – On démontre la correction du cas de base, – on suppose les appels récursifs corrects – et on démontre la correction de lappel courant.

19 13 novembre 2006Cours d'algorithmique 3 - Intranet19 Correction dune fonction récursive La fonction ci-dessous calcule la profondeur dun arbre ! La fonction ci-dessous calcule la profondeur dun arbre ! – La profondeur dun nœud ou dune feuille dans un arbre correspond au nombre de fois où lon doit « descendre » vers un fils avant datteindre le nœud ou la feuille en question. – La profondeur dun arbre est la profondeur de la feuille la plus profonde. int profond (ptr_arbre arbre) {if ( est_feuille(arbre) ) return( 0 ); else return( 1 + max( profond(fg(arbre)), profond(fd(arbre)) )); } Les appels récursifs sont corrects par hypothèse ! La plus grande des profondeurs. La profondeur de notre arbre ! ! !

20 13 novembre 2006Cours d'algorithmique 3 - Intranet20 Preuves par induction sur les arbres Soient F ( A ) le nombre de feuilles et N ( A ) le nombre de nœuds internes dun arbre A. Soient F ( A ) le nombre de feuilles et N ( A ) le nombre de nœuds internes dun arbre A. Si A est binaire, alors : F ( A ) = N ( A ) + 1 Si A est binaire, alors : F ( A ) = N ( A ) + 1 Preuve : Preuve : – A est une feuille : F ( A ) = 1 = = N ( A ) + 1 ! – A est un nœud interne ayant les deux fils B et C : Hypothèse sur B : F ( B ) = N ( B ) + 1 ! Hypothèse sur B : F ( B ) = N ( B ) + 1 ! Hypothèse sur C : F ( C ) = N ( C ) + 1 ! Hypothèse sur C : F ( C ) = N ( C ) + 1 ! – Donc, pour A : F ( A ) = F ( B ) + F ( C ) = N ( B ) + N ( C ) = N ( A ) + 1 ! ! ! = N ( A ) + 1 ! ! ! N ( A )

21 13 novembre 2006Cours d'algorithmique 3 - Intranet21 Preuves par induction sur les arbres On considère un arbre A qui vérifie pour tous ses nœuds internes la propriété qui dit que : On considère un arbre A qui vérifie pour tous ses nœuds internes la propriété qui dit que : soit, les deux sous-arbres sont de profondeur 0, soit, les deux sous-arbres sont de profondeur 0, soit, la profondeur du fils droit dépasse la profondeur du fils gauche dune unité. soit, la profondeur du fils droit dépasse la profondeur du fils gauche dune unité. Montrer que, pour une profondeur p fixée, larbre A est unique ! Montrer que, pour une profondeur p fixée, larbre A est unique ! Preuve : Preuve : – p = 1 : Larbre est unique, car les deux fils sont des feuilles ! – p > 1 : Le fils droit C doit être de profondeur p-1 et le fils gauche B doit être de profondeur p-2 : gauche B doit être de profondeur p-2 : Hypothèse sur B : B est unique ! Hypothèse sur B : B est unique ! Hypothèse sur C : C est unique ! Hypothèse sur C : C est unique ! Donc, A sera unique ! Donc, A sera unique !

22 13 novembre 2006Cours d'algorithmique 3 - Intranet22 Preuves par induction sur les arbres Les voici : Le prochain.

23 13 novembre 2006Cours d'algorithmique 3 - Intranet23 Back-track Un exemple archi-classique : Un exemple archi-classique : – Soient des variables v, …, v logiques, – soit une formule F construite à partir de ces variables et des connectives et, ou et not, – trouver un n-uplet de valeurs pour les v de façon à rendre vraie la formule F. Solution : Solution : – Nous construisons la table de vérité ! Cest simple ! ! ! – Mais, cest très coûteux ! Jusquà 2 cas à inspecter ! ! ! – Pouvons-nous faire mieux ? Probablement non ! ! ! 1 n i n

24 13 novembre 2006Cours d'algorithmique 3 - Intranet24 Back-track F = x et not( y) et z F = x et not( y) et z x y z F Au pire, nous parcourons tout le tableau avant de constater quil ny a aucune solution. Au pire, nous parcourons tout le tableau avant de constater quil ny a aucune solution. Parfois, nous avons une idée où chercher la solution, mais ce nest pas toujours le cas. Parfois, nous avons une idée où chercher la solution, mais ce nest pas toujours le cas. Nous pouvons nous arrêter !

25 13 novembre 2006Cours d'algorithmique 3 - Intranet25 Back-track x y z F Cheminactuel. Sous-arbres en attente! en attente!

26 13 novembre 2006Cours d'algorithmique 3 - Intranet26 Back-track x y z F Exploré sans succès ! Cheminactuel. Sous-arbres en attente! en attente!

27 13 novembre 2006Cours d'algorithmique 3 - Intranet27 Back-track x y z F Exploré sans succès ! Cheminactuel. Sous-arbres en attente! en attente!

28 13 novembre 2006Cours d'algorithmique 3 - Intranet28 Back-track x y z F Exploré sans succès ! Cheminactuel. Sous-arbres en attente! en attente!

29 13 novembre 2006Cours d'algorithmique 3 - Intranet29 Back-track x y z F Explorés sans succès ! Cheminactuel. Sous-arbre en attente! en attente! Un peu plus tard …

30 13 novembre 2006Cours d'algorithmique 3 - Intranet30 Back-track x y z F Explorés sans succès ! Cheminactuel. Sous-arbre en attente! en attente!

31 13 novembre 2006Cours d'algorithmique 3 - Intranet31 Situation générale du Back-track Cheminactuel. Sous-arbres explorés sans succès. Sous-arbres en attente de traitement. Dynamique : Nous abandonnons les points de back-track !

32 13 novembre 2006Cours d'algorithmique 3 - Intranet32 Situation générale du Back-track Cheminactuel. Sous-arbres explorés sans succès. Sous-arbres en attente de traitement. Dynamique :

33 13 novembre 2006Cours d'algorithmique 3 - Intranet33 Back-track, code générique int back_track (un_type situation) {if ( decidable(situation) ) return( ca_vaut_tant(situation) ); else {dabord = back_track( premiere_alternative(situation) ); if ( suffisant(dabord) ) return( dabord ); /* les points de back-track sont abandonnés */ else return( seconde_alternative(situation) ); } Comme pour Fibonnacci, nous parcourons un arbre imaginaire, qui ne sera jamais construit en tant que tel !

34 13 novembre 2006Cours d'algorithmique 3 - Intranet34 Back-track, toutes les solutions set_un_type back_track_toutes (un_type situation) {if ( decidable(situation) ) if ( est_satisfaisant(situation) ) return( { situation } ); else return( {} ); else return( back_track_toutes(premiere_alternative(situation)) union back_track_toutes(seconde_alternative(situation)) ); }

35 13 novembre 2006Cours d'algorithmique 3 - Intranet35 Minimax Considérons un arbre dont : Considérons un arbre dont : – les feuilles valent Vrai ou Faux – et les nœuds internes portent alternativement (depuis la racine vers les feuilles) les connectives et et ou. Par réduction nous calculons une valeur pour la racine : Par réduction nous calculons une valeur pour la racine : et ou et V F et VVFV F V V V

36 13 novembre 2006Cours d'algorithmique 3 - Intranet36 Minimax Nous navons pas toujours besoin de parcourir tout larbre. et ou V et VV V V V ?????? Ces sous-arbres nont aucune incidence sur le résultat ! ! !

37 13 novembre 2006Cours d'algorithmique 3 - Intranet37 Minimax Règles pour le et : Règles pour le et : et ?FV et ? donne ? donne F Règles pour le ou : Règles pour le ou : ou ?FV ou ? donne V donne ? On dit que lon fait des coupes dans larbre.

38 13 novembre 2006Cours d'algorithmique 3 - Intranet38 Minimax Règles pour le min : Règles pour le min : min ?01 min ? donne ? donne 0 Règles pour le max : Règles pour le max : max ?01 max ? donne 1 donne ?

39 13 novembre 2006Cours d'algorithmique 3 - Intranet39 Minimax Définition générale dun arbre Minimax : Définition générale dun arbre Minimax : – les feuilles ont des valeurs entières (ou réelles) – et les nœuds internes portent alternativement (depuis la racine vers les feuilles) les connectives max et min. La valeur Minimax dun arbre A vaut : La valeur Minimax dun arbre A vaut : – si A est une feuille, alors la valeur de cette feuille, – si A est un nœud interne de type max ayant des fils B et C, alors le maximum des valeurs minimax de B et C, alors le maximum des valeurs minimax de B et C, – si A est un nœud interne de type min ayant des fils B et C, alors le minimum des valeurs minimax de B et C. alors le minimum des valeurs minimax de B et C.

40 13 novembre 2006Cours d'algorithmique 3 - Intranet40 Minimax int mini_max (un_type situation, int max_ou_pas ) {if ( feuille(situation) ) return( valeur(situation) ); else if ( max_ou_pas ) return( max( minimax( genere_fils_gauche(situation), not(max_ou_pas) ), minimax( genere_fils_droit(situation), not(max_ou_pas) ) ) ) ; else return( min( minimax( genere_fils_gauche(situation), not(max_ou_pas) ), minimax( genere_fils_droit(situation), not(max_ou_pas) ) ) ) ; } Cest assez logique ! Cas symétrique !

41 13 novembre 2006Cours d'algorithmique 3 - Intranet41 Minimax Les arbres Minimax servent dans les jeux : Les arbres Minimax servent dans les jeux : – Je suis MAX et je veux maximiser mon bénéfice ! – Mon adversaire est MIN et veut minimiser mon bénéfice ! max min 5 min Le chemin du minimax correspond à la fois à : - la meilleure attaque de MAX - la meilleure attaque de MAX - et à la meilleure riposte de MIN. - et à la meilleure riposte de MIN.

42 13 novembre 2006Cours d'algorithmique 3 - Intranet42 Minimax Minimax sapplique aux jeux : Minimax sapplique aux jeux : – de somme nulle, – déterministes, – et dinformation parfaite. Mon avantage est un inconvénient pour mon adversaire, et vice-versa. Pas délément de chance pour le résultat dun lancer de dé. Tous voient toute linformation, contrairement aux jeux de carte où la main est cachée. Exemples : les échecs, les dames, le go, …


Télécharger ppt "Cours d'algorithmique 3 - Intranet 1 13 novembre 2006 Cours dAlgorithmique Parcours darbres. Induction sur la structure. Back-track.Minimax."

Présentations similaires


Annonces Google