Cours d'algorithmique 8 - Intranet 1 4 décembre 2006 Cours dAlgorithmique Dérécursion (fin) : Équivalences entre programmes récursifs et programmes itératifs.

Slides:



Advertisements
Présentations similaires
Explorer un espace d’états
Advertisements

Présentation générale Marc Gengler
Chapitre annexe. Récursivité
Structures de données et complexité
Sensibilisation à l’Algorithmique
Au programme du jour …. Un peu plus de structures de données
Introduction à l’Algorithmique
Sensibilisation à l’Algorithmique et structure de données
Les Structures de contrôles itératives
Algorithmes à base darbre BSP. Principe Se servir dune structure arborescente afin déliminer le traitement dune branche entière sur un test de visualisation.
Cours d’Algorithmique
Cours d’Algorithmique
Cours d’Algorithmique
Cours d'algorithmique 10 / Intranet 1 19 décembre 2006 Cours dAlgorithmique Logique de Hoare (fin) : Les boucles et les invariants.
Cours d’Algorithmique
Cours d'algorithmique 9 - Intranet 1 12 décembre 2006 Cours dAlgorithmique Logique de Hoare (début) : Principes et constructions élémentaires.
Cours d’Algorithmique
Problème des 4 couleurs, graphes planaires.
Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.
18 octobre 2007Cours de compilation 7 - Intranet1 Cours de compilation Génération de code Optimisation de code.
Cours de graphes Problèmes de flots. Théorème du Max-flow – Min-cut.
Cours d’Algorithmique
Cours d’Algorithmique
Cours d'algorithmique 9 - Intranet 1 12 décembre 2006 Cours dAlgorithmique Logique de Hoare (début) : Principes et constructions élémentaires.
Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.
Cours d'algorithmique 4 - Intranet 1 16 novembre 2006 Cours dAlgorithmique Lalgorithme alpha-beta. Sous-arbres alpha et beta dun arbre minimax et propriétés.
Cours d’Algorithmique
Cours d'algorithmique 11 / Intranet 1 9 janvier 2006 Cours dAlgorithmique N P - complétude.
Cours d'algorithmique 5 - Intranet 1 17/21 novembre 2006 Cours dAlgorithmique Divide and Conquer : principes et applications. Calculabilité.Complexité.
18 octobre 2007Cours de compilation 7 - Intranet1 Cours de compilation Génération de code Optimisation de code.
21 septembre 2007Cours de compilation 2 - Intranet1 Cours de compilation Evaluation partielle etcompilation.
24 septembre 2007Cours de compilation 4 - Intranet1 Cours de compilation Techniques danalyse descendantes.
Cours d’Algorithmique
Cours d'algorithmique 5 - Intranet 1 17/21 novembre 2006 Cours dAlgorithmique Divide and Conquer : principes et applications. Calculabilité.Complexité.
Cours d’Algorithmique
Structures de données linéaires
Récursivité.
Cours d’Algorithmique
Dérécursivation Dérécursiver, c’est transformer un algorithme récursif en un algorithme équivalent ne contenant pas d’appels récursifs. Récursivité terminale.
Les structures de données arborescentes
II. Chaînage, SDD séquentielles
Les algorithmes: complexité et notation asymptotique
Bibliothèque standard du C++
Problème des 4 couleurs, graphes planaires.
Quelques applications.
Programmation fonctionnelle Le langage LISP
16 mars 2007Cours de graphes 7 - Intranet1 Cours de graphes Problèmes NP-complets. Réductions polynômiales.
LES ARBRES IUP 2 Génie Informatique

Cours de graphes Marc Gengler Alexandra Bac Sébastien Fournier
21 février 2006Cours de graphes 2 - Intranet1 Cours de graphes Les plus courts chemins, les chemins les plus légers : à laide de la vague, à laide de la.
Cours de graphes 6 - Intranet
23 février 2007Cours de graphes 4 - Intranet1 Cours de graphes Problèmes de flots. Théorème du Max-flow – Min-cut. Algos de Ford-Fulkerson et Edmonds-Karp.
IFT-2000: Structures de données Piles et files Dominic Genest, 2009.
Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009.
III. Récursivité Principe et exemples

Heuristiques C. Recherche de la meilleure branche . Branch And Bound
ALGORITHME DE TRI Le tri par insertion.
Programmation procédurale preuves D. Preuves Preuves sur les R-algorithmes. Règle de l'appel (Hoare). Exemple Preuves sur les B-algorithmes (Floyd) Automatisation.
III. Récursivité Principe et exemples
Programmation linéaire en nombres entiers
Chaînage et LSC : motivation et principe Manipuler la LSC : exemples Variantes : LDC, liste circulaire, … Etude de cas : réalisation d’un buffer clavier.
Programmation fonctionnelle Preuve
Introduction à la récursivité
Programmation Orienté Objet en C++
Cours d'algorithmique 10 / Intranet 1 19 décembre 2006 Cours d’Algorithmique Logique de Hoare (fin) : Les boucles et les invariants.
La récursivité Mireille Goud HEG Vd AlgSD - Résurisivité.
Chaînage et LSC : motivation et principe Manipuler la LSC : exemples Variantes : LDC, liste circulaire, … Etude de cas : réalisation d’un buffer clavier.
IFT359 – Programmation fonctionnelle Thème 07 Fermeture, affectation ou monades 1.
Transcription de la présentation:

Cours d'algorithmique 8 - Intranet 1 4 décembre 2006 Cours dAlgorithmique Dérécursion (fin) : Équivalences entre programmes récursifs et programmes itératifs avec ou sans gestion de pile. Algorithmes gloutons.

4 décembre 2006Cours d'algorithmique 8 - Intranet2 Trier et chercher, recherche textuelle Trier et chercher, recherche textuelle 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, algorithmes gloutons Divide and conquer, algorithmes gloutons Minimax, alpha-beta Minimax, alpha-beta Dérécursion Dérécursion Divers problèmes particuliers Divers problèmes particuliers Logique de Hoare Logique de Hoare Programmation dynamique Programmation dynamique Complexité et calculabilité Complexité et calculabilité Les grandes lignes du cours

4 décembre 2006Cours d'algorithmique 8 - Intranet3 Plan Nombre dappels récursifs Un Deux Fonction auto-enveloppée Non Oui Enveloppe associative Oui Non Avec élément neutre Oui Non Appréciations ! Transformation intéressante ! Celle-là aussi ! Sans espoir ! ! !

4 décembre 2006Cours d'algorithmique 8 - Intranet4 Deux appels récursifs auto-enveloppés f ( acc, x ) = si ( ( acc, x ) ) si ( ( acc, x ) ) a( acc, x ) a( acc, x ) sinon sinon f( f( ( acc, x ), ( acc, x ) ), f( f( ( acc, x ), ( acc, x ) ), ( acc, x ) ) ( acc, x ) ) Le cas darrêt. Lappel récursif interne ! Lappel récursif externe ! Le cas de base est celui des appels auto-enveloppés ! Le cas de base est celui des appels auto-enveloppés ! Nous explorons x à laide dun accumulateur acc.

4 décembre 2006Cours d'algorithmique 8 - Intranet5 Deux appels récursifs auto-enveloppés f ( acc, x ) = si ( ( x ) ) si ( ( x ) ) a( acc, x ) a( acc, x ) sinon sinon f( f( acc, ( x ) ), ( x ) ) f( f( acc, ( x ) ), ( x ) ) x ( x ) ( x ) acc Le flot des informations ! Laccumulateur récolte les contributions locales au fur et à mesure du parcours !

4 décembre 2006Cours d'algorithmique 8 - Intranet6 Deux appels récursifs auto-enveloppés Introduisons la fonction F suivante : Introduisons la fonction F suivante : F( acc, p ) = si ( V( p ) ) F( acc, p ) = si ( V( p ) ) acc acc sinon sinon x < - S( p ) x < - S( p ) p < - D( p ) p < - D( p ) F( f( acc, x ), p ) F( f( acc, x ), p ) La pile contient les éléments qui sont à traiter. Nous la traitons. Et nous recommençons. Nous enlevons la valeur du sommet de la pile.

4 décembre 2006Cours d'algorithmique 8 - Intranet7 Deux appels récursifs auto-enveloppés Nous avons : Nous avons : F( acc, E( v, I( ) ) ) = si ( V( E( v, I( ) ) ) ) acc acc sinon sinon x < - S( E( v, I( ) ) ) v x < - S( E( v, I( ) ) ) v p < - D( E( v, I( ) ) ) I( ) p < - D( E( v, I( ) ) ) I( ) F( f( acc, x ), p ) F( f( acc, x ), p ) = F( f( acc, v ), I( ) ) = F( f( acc, v ), I( ) ) = si ( V( I( ) ) ) = si ( V( I( ) ) ) f( acc, v ) f( acc, v ) sinon sinon = f( acc, v ) = f( acc, v ) Plutôt que dappeler « f( acc, v ) » nous pouvons appeler F avec « acc » et une pile qui contient le seul élément « v » qui est à traiter.

4 décembre 2006Cours d'algorithmique 8 - Intranet8 Deux appels récursifs auto-enveloppés Nous avons plus généralement : Nous avons plus généralement : F( acc, E( v, p ) ) = si ( V( E( v, p ) ) ) acc acc sinon sinon x < - S( E( v, p ) ) v x < - S( E( v, p ) ) v p < - D( E( v, p ) ) p p < - D( E( v, p ) ) p F( f( acc, x ), p ) F( f( acc, x ), p ) = F( f( acc, v ), p ) = F( f( acc, v ), p ) F( acc, E( v, p ) ) = F( f( acc, v ), p ) F( acc, E( v, p ) ) = F( f( acc, v ), p ) Empiler Dépiler

4 décembre 2006Cours d'algorithmique 8 - Intranet9 Deux appels récursifs auto-enveloppés Exprimons F à laide d elle-même et de manière terminale. Nous aurons une itération avec gestion de la pile. Exprimons F à laide d elle-même et de manière terminale. Nous aurons une itération avec gestion de la pile. F( acc, p ) = si ( V( p ) ) F( acc, p ) = si ( V( p ) ) acc acc sinon sinon x < - S( p ) x < - S( p ) p < - D( p ) p < - D( p ) si ( ) si ( ) F( a, p ) F( a, p ) sinon sinon F(, E( E(, p ) ) ) F(, E( E(, p ) ) )

4 décembre 2006Cours d'algorithmique 8 - Intranet10 Deux appels récursifs auto-enveloppés Pour un appel res < - f( init, v ) nous obtenons le code : Pour un appel res < - f( init, v ) nous obtenons le code : acc <- init p <- E( v, I( ) ) while ( V( p ) ) x <- S( p ) x <- S( p ) p <- D( p ) p <- D( p ) si ( ( acc, x ) ) si ( ( acc, x ) ) acc <- a( acc, x ) acc <- a( acc, x ) sinon sinon p <- E( ( acc, x ), p ) p <- E( ( acc, x ), p ) acc <- ( acc, x ) acc <- ( acc, x ) res <- acc Initialisation de acc et p ! Le prochain élément est prélevé sur la pile ! Sinon, nous empilons les deux fils et nous recommençons ! Le résultat final est dans acc ! Sil est élémentaire, nous laccumulons !

4 décembre 2006Cours d'algorithmique 8 - Intranet11 Sous forme darbre Dans la pile ! X Y Z arbre = T X Z arbre < - S( p ) p < - D( p ) k l Y m acc = ( ( ( 0 + k ) + l ) + m ) Dans laccumulateur : acc = ( ( 0 + k ) + l ) Premier cas : feuille( arbre ) est vrai et valeur( arbre ) = m

4 décembre 2006Cours d'algorithmique 8 - Intranet12 Sous forme darbre Dans la pile ! X Y Z X Z arbre < - S( p ) p < - D( p ) k l Y Dans laccumulateur : acc = ( ( 0 + k ) + l ) Second cas : feuille( arbre ) est faux et fg( arbre ) = U et fd( arbre ) = V VU V U

4 décembre 2006Cours d'algorithmique 8 - Intranet13 Deux appels récursifs, enveloppe associative Soient deux appels récursifs avec une enveloppe associative ! Soient deux appels récursifs avec une enveloppe associative ! La forme générale est la suivante : La forme générale est la suivante : Le flot des informations est le suivant : Le flot des informations est le suivant : f ( x ) = si ( ( x ) ) si ( ( x ) ) a( x ) a( x ) sinon sinon h( f( ( x ) ), f( ( x ) ) ) h( f( ( x ) ), f( ( x ) ) ) x h

4 décembre 2006Cours d'algorithmique 8 - Intranet14 Deux appels récursifs, enveloppe associative Nous nous ramenons au cas auto-enveloppé en posant : Nous nous ramenons au cas auto-enveloppé en posant : g( acc, x ) = h( acc, f( x ) ) g( acc, x ) = h( acc, f( x ) ) Alors : Alors : g( acc, x ) = h( acc, si ( ( x ) ) g( acc, x ) = h( acc, si ( ( x ) ) a( x ) a( x ) sinon sinon h( f( ( x ) ), f( ( x ) ) ) ) h( f( ( x ) ), f( ( x ) ) ) ) = si ( ( x ) ) = si ( ( x ) ) h( acc, a( x ) ) h( acc, a( x ) ) sinon sinon h( acc, h( f( ( x ) ), f( ( x ) ) ) ) h( acc, h( f( ( x ) ), f( ( x ) ) ) ) h( h( acc, f( ( x ) ) ), f( ( x ) ) ) h( h( acc, f( ( x ) ) ), f( ( x ) ) ) h( g( acc, ( x ) ), f( ( x ) ) ) h( g( acc, ( x ) ), f( ( x ) ) ) g( g( acc, ( x ) ), ( x ) ) g( g( acc, ( x ) ), ( x ) ) Associativité de h! Définition de g !

4 décembre 2006Cours d'algorithmique 8 - Intranet15 Deux appels récursifs, enveloppe associative Nous nous ramenons au cas auto-enveloppé en posant : Nous nous ramenons au cas auto-enveloppé en posant : g( acc, x ) = h( acc, f( x ) ) g( acc, x ) = h( acc, f( x ) ) Alors : Alors : g( acc, x ) = si ( ( x ) ) g( acc, x ) = si ( ( x ) ) h( acc, a( x ) ) h( acc, a( x ) ) sinon sinon g( g( acc, ( x ) ), ( x ) ) g( g( acc, ( x ) ), ( x ) ) Le flot des informations a changé : Le flot des informations a changé : Nous sommes donc revenus au cas dune fonction auto-enveloppée ! x acc x h

4 décembre 2006Cours d'algorithmique 8 - Intranet16 Deux appels récursifs, enveloppe associative acc <- e p <- E( v, I( ) ) while ( V( p ) ) x <- S( p ) x <- S( p ) p <- D( p ) p <- D( p ) si ( ( x ) ) si ( ( x ) ) acc <- h( acc, a( x ) ) acc <- h( acc, a( x ) ) sinon sinon p <- E( ( x ), p ) p <- E( ( x ), p ) res <- acc Pour deux appels avec une enveloppe « h » associative avec neutre « e », nous avons : Pour deux appels avec une enveloppe « h » associative avec neutre « e », nous avons : res <- f( v ) f ( x ) = si ( ( x ) ) si ( ( x ) ) a( x ) a( x ) sinon sinon h( f( ( x ) ), h( f( ( x ) ), f( ( x ) ) ) f( ( x ) ) )

4 décembre 2006Cours d'algorithmique 8 - Intranet17 Deux appels récursifs, enveloppe associative Si « h » est sans neutre, cest plus embêtant. Si « h » est sans neutre, cest plus embêtant. Le code : Le code : x <- v p <- I( ) while ( ( ( x ) ) p <- E( ( x ), p ) p <- E( ( x ), p ) x <- ( x ) x <- ( x ) acc <- a( x ) while ( V( p ) ) x <- S( p ) x <- S( p ) p <- D( p ) p <- D( p ) si ( ( x ) ) si ( ( x ) ) acc <- h( acc, a( x ) ) acc <- h( acc, a( x ) ) sinon sinon p <- E( ( x ), p ) p <- E( ( x ), p ) res <- acc Linitialisation est triviale ! La descente à gauche vers la première feuille. Nous empilons les fils droits. Finalement, nous pouvons Initialiser laccumulateur ! Le reste ne change pas ! ! !

4 décembre 2006Cours d'algorithmique 8 - Intranet18 Deux appels récursifs, enveloppe non associative Cest le cas le plus compliqué à gérer ! Cest le cas le plus compliqué à gérer ! Comme lenveloppe nest pas associative, nous devons respecter la structure de larbre : Comme lenveloppe nest pas associative, nous devons respecter la structure de larbre : Traitements en attente ! X Z T Y Noeud courant Résultats en attente ! La pile ! X Y Z X X T

4 décembre 2006Cours d'algorithmique 8 - Intranet19 Deux appels récursifs, enveloppe non associative Nous avons quatre variables globales : Nous avons quatre variables globales : – la variable « x » qui indique lélément à traiter, – la variable « res » qui indique le résultat courant, – la variable « marq » qui est la valeur du dernier marqueur, – la variable « p » qui est la pile courante. Nous distinguons deux types de traitements : Nous distinguons deux types de traitements : – cas 1 – la variable « x » ne vérifie pas le test darrêt, – cas 2 – la variable « x » vérifie le test darrêt.

4 décembre 2006Cours d'algorithmique 8 - Intranet20 Deux appels récursifs, enveloppe non associative Fusion des cas 1 & 2 - la variable « x » doit être traitée : Fusion des cas 1 & 2 - la variable « x » doit être traitée : CALCUL : si ( ( x ) ) si ( ( x ) ) res <- a( x ) res <- a( x ) goto PILE goto PILE sinon sinon p <- E( ( x ), p ) p <- E( ( x ), p ) p <- E( C, p ) p <- E( C, p ) x <- ( x ) x <- ( x ) goto CALCUL goto CALCUL Une boucle ! Une sortie !

4 décembre 2006Cours d'algorithmique 8 - Intranet21 Deux appels récursifs, enveloppe non associative Dès quil y a un résultat « res », nous inspectons la pile : Dès quil y a un résultat « res », nous inspectons la pile : Trois cas se présentent pour la pile : Trois cas se présentent pour la pile : – cas 3 – elle est vide, – cas 4 – elle a un marqueur « C » au sommet et – cas 5 – elle a un marqueur « R » au sommet.

4 décembre 2006Cours d'algorithmique 8 - Intranet22 Deux appels récursifs, enveloppe non associative Fusion des Fusion des cas 3, 4 & 5 : cas 3, 4 & 5 : PILE: si ( V( p ) ) si ( V( p ) ) goto FIN goto FIN sinon sinon marq <- S( p ) marq <- S( p ) p <- D( p ) p <- D( p ) si ( marq = C ) si ( marq = C ) x <- S( p ) x <- S( p ) p <- D( p ) p <- D( p ) p <- E( res, p ) p <- E( res, p ) p <- E( R, p ) p <- E( R, p ) goto CALCUL goto CALCUL sinon sinon res <- h( S( p ), res ) res <- h( S( p ), res ) p <- D( p ) p <- D( p ) goto PILE goto PILE Nous consultons le marqueur ! Nous allons traiter le second fils et sauvons le résultat du premier ! Nous combinons deux résultats ! Une boucle ! Une sortie !

4 décembre 2006Cours d'algorithmique 8 - Intranet23 Deux appels récursifs, enveloppe non associative PILE: si ( V( p ) ) si ( V( p ) ) goto FIN goto FIN sinon sinon marq <- S( p ) marq <- S( p ) p <- D( p ) p <- D( p ) si ( marq = C ) si ( marq = C ) x <- S( p ) x <- S( p ) p <- D( p ) p <- D( p ) p <- E( res, p ) p <- E( res, p ) p <- E( R, p ) p <- E( R, p ) goto CALCUL goto CALCUL sinon sinon res <- h( S( p ), res ) res <- h( S( p ), res ) p <- D( p ) p <- D( p ) goto PILE goto PILE CALCUL : si ( ( x ) ) si ( ( x ) ) res <- a( x ) res <- a( x ) goto PILE goto PILE sinon sinon p <- E( ( x ), p ) p <- E( ( x ), p ) p <- E( C, p ) p <- E( C, p ) x <- ( x ) x <- ( x ) goto CALCUL goto CALCUL DEBUT : x <- v x <- v p <- I( ) p <- I( ) goto CALCUL goto CALCUL FIN :......

4 décembre 2006Cours d'algorithmique 8 - Intranet24 Deux appels récursifs, enveloppe non associative while_PILE: while ( PILE ) while ( PILE ) si ( V( p ) ) si ( V( p ) ) PILE <- faux PILE <- faux FIN <- vrai FIN <- vrai sinon sinon marq <- S( p ) marq <- S( p ) p <- D( p ) p <- D( p ) si ( marq = C ) si ( marq = C ) x <- S( p ) x <- S( p ) p <- D( p ) p <- D( p ) p <- E( res, p ) p <- E( res, p ) p <- E( R, p ) p <- E( R, p ) PILE <- faux PILE <- faux CALCUL <- vrai CALCUL <- vrai sinon sinon res <- h( S( p ), res ) res <- h( S( p ), res ) p <- D( p ) p <- D( p ) while_CALCUL : while ( CALCUL ) while ( CALCUL ) si ( ( x ) ) si ( ( x ) ) res <- a( x ) res <- a( x ) CALCUL <- faux CALCUL <- faux PILE <- vrai PILE <- vrai sinon sinon p <- E( ( x ), p ) p <- E( ( x ), p ) p <- E( C, p ) p <- E( C, p ) x <- ( x ) x <- ( x ) DEBUT : x <- v x <- v p <- I( ) p <- I( ) FIN <- faux FIN <- faux CALCUL <- vrai CALCUL <- vrai PILE <- faux PILE <- faux while ( FIN ) while ( FIN ) while_CALCUL while_CALCUL while_PILE while_PILE

4 décembre 2006Cours d'algorithmique 8 - Intranet25 acc <- init p <- E( v, I( ) ) while ( V( p ) ) x <- S( p ) x <- S( p ) p <- D( p ) p <- D( p ) si ( ( acc, x ) ) si ( ( acc, x ) ) acc <- a( acc, x ) acc <- a( acc, x ) sinon sinon p <- E( ( acc, x ), p ) p <- E( ( acc, x ), p ) acc <- ( acc, x ) acc <- ( acc, x ) res <- acc Deux appels récursifs --- résumé ) Deux appels récursifs auto-enveloppés ! 5) Deux appels récursifs auto-enveloppés ! Code itératif peu raisonnable ! f ( acc, x ) = si ( ( acc, x ) ) si ( ( acc, x ) ) a( acc, x ) a( acc, x ) sinon sinon f( f( ( acc, x ), f( f( ( acc, x ), ( acc, x ) ), ( acc, x ) ), ( acc, x ) ) ( acc, x ) )

4 décembre 2006Cours d'algorithmique 8 - Intranet26 Deux appels récursifs --- résumé ) Appels avec enveloppe associative et neutre « e » ! 6) Appels avec enveloppe associative et neutre « e » ! Code itératif peu raisonnable ! f ( x ) = si ( ( x ) ) si ( ( x ) ) a( x ) a( x ) sinon sinon h( f( ( x ) ), f( ( x ) ) ) h( f( ( x ) ), f( ( x ) ) ) acc <- e p <- E( v, I( ) ) while ( V( p ) ) x <- S( p ) x <- S( p ) p <- D( p ) p <- D( p ) si ( ( x ) ) si ( ( x ) ) acc <- h( acc, a( x ) ) acc <- h( acc, a( x ) ) sinon sinon p <- E( ( x ), p ) p <- E( ( x ), p ) res <- acc

4 décembre 2006Cours d'algorithmique 8 - Intranet27 x <- v p <- I( ) while ( ( ( x ) ) p <- E( ( x ), p ) p <- E( ( x ), p ) x <- ( x ) x <- ( x ) acc <- a( x ) while ( V( p ) ) x <- S( p ) x <- S( p ) p <- D( p ) p <- D( p ) si ( ( x ) ) si ( ( x ) ) acc <- h( acc, a( x ) ) acc <- h( acc, a( x ) ) sinon sinon p <- E( ( x ), p ) p <- E( ( x ), p ) res <- acc Deux appels récursifs --- résumé ) Appels avec enveloppe 7) Appels avec enveloppe associative, sans neutre ! associative, sans neutre ! Code itératif très peu raisonnable ! f ( x ) = si ( ( x ) ) si ( ( x ) ) a( x ) a( x ) sinon sinon h( f( ( x ) ), f( ( x ) ) ) h( f( ( x ) ), f( ( x ) ) )

4 décembre 2006Cours d'algorithmique 8 - Intranet28 Deux appels récursifs --- résumé ) Appels avec enveloppe 8) Appels avec enveloppe non associative ! non associative ! Code itératif déraisonnable ! f ( x ) = si ( ( x ) ) si ( ( x ) ) a( x ) a( x ) sinon sinon h( f( ( x ) ), f( ( x ) ) ) h( f( ( x ) ), f( ( x ) ) ) while_PILE: while ( PILE ) while ( PILE ) si ( V( p ) ) si ( V( p ) ) PILE <- faux PILE <- faux FIN <- vrai FIN <- vrai sinon sinon marq <- S( p ) marq <- S( p ) p <- D( p ) p <- D( p ) si ( marq = C ) si ( marq = C ) x <- S( p ) x <- S( p ) p <- D( p ) p <- D( p ) p <- E( res, p ) p <- E( res, p ) p <- E( R, p ) p <- E( R, p ) PILE <- faux PILE <- faux CALCUL <- vrai CALCUL <- vrai sinon sinon res <- h( S( p ), res <- h( S( p ), res ) res ) p <- D( p ) p <- D( p ) while_CALCUL : while ( CALCUL ) while ( CALCUL ) si ( ( x ) ) si ( ( x ) ) res <- a( x ) res <- a( x ) CALCUL <- faux CALCUL <- faux PILE <- vrai PILE <- vrai sinon sinon p <- E( b( x ), p ) p <- E( b( x ), p ) p <- E( C, p ) p <- E( C, p ) x <- a( x ) x <- a( x ) DEBUT : x <- v x <- v p <- I( ) p <- I( ) FIN <- faux FIN <- faux CALCUL <- vrai CALCUL <- vrai PILE <- faux PILE <- faux while ( FIN ) while ( FIN ) while_CALCUL while_CALCUL while_PILE while_PILE

4 décembre 2006Cours d'algorithmique 8 - Intranet29 Résumé général Récursif ! Itératif ! Se ramène à … Les quatre cas à unique appel récursif : Les quatre cas à unique appel récursif : – Récursif terminal. – Enveloppe associative avec neutre. – Enveloppe associative sans neutre. – Enveloppe non associative. Les quatre cas à deux appels récursifs : Les quatre cas à deux appels récursifs : – Récursif auto-enveloppé. – Enveloppe associative avec neutre. – Enveloppe associative sans neutre. – Enveloppe non associative.

4 décembre 2006Cours d'algorithmique 8 - Intranet30 Algorithmes gloutons Greedy algorithms en anglais ! Greedy algorithms en anglais ! Une suite de décisions optimales locales Une suite de décisions optimales locales conduit à conduit à un optimum global ! un optimum global ! Complexité pour « n » éléments : Complexité pour « n » éléments : – O( n * x ) où O( x ) est la complexité de la décision locale ! – O( 2 ) pour le back-track (cascade de décisions locales) ! n

4 décembre 2006Cours d'algorithmique 8 - Intranet31 Algorithmes gloutons Exemple dun choix glouton : Exemple dun choix glouton : – GLOBAL : Choisir les 10 plus petits de lamphi ! – LOCAL : Trouver et retirer le plus petit ! Ce choix est indépendant des autres personnes déjà choisies ou restant à choisir. Ce choix est indépendant des autres personnes déjà choisies ou restant à choisir. Exemple dun choix non glouton : Exemple dun choix non glouton : – GLOBAL : Choisir le plus court chemin de Marseille à Paris ! – LOCAL : Trouver à partir de la ville courante, létape la plus courte ! plus courte ! Un tel choix nest pas sûr de nous rapprocher de Paris ! Un tel choix nest pas sûr de nous rapprocher de Paris !

4 décembre 2006Cours d'algorithmique 8 - Intranet32 Action Selection Problem Un exemple complet : Un exemple complet : – Ensemble « E » de tâches, dont le « début » et la « fin » sont connues ! – t et t sont compatibles si leurs intersections sont vides ! – OBJECTIF : Trouvez le plus grand ensemble de tâches compatibles ! ! ! tâches compatibles ! ! ! i j i d f i i i d f i i Triées par f croissants ! i

4 décembre 2006Cours d'algorithmique 8 - Intranet33 Action Selection Problem ens BT ( ens choisies, ens restantes ) = si ( restantes = {} ) choisies choisiessinon choix <- choisir( restantes ) choix <- choisir( restantes ) restantes <- restantes \ { choix } restantes <- restantes \ { choix } sans_choix = BT( choisies, restantes ) sans_choix = BT( choisies, restantes ) si ( compatible( choix, choisies ) ) si ( compatible( choix, choisies ) ) max_ens( BT( choisies v { choix }, restantes ), max_ens( BT( choisies v { choix }, restantes ), sans_choix ) sans_choix ) sinon sinon sans_choix sans_choix Les tâches déjà choisies. Les tâches non encore considérées. Assez naturel ! Nous choisissons ! Nous avons toujours la possibilité de ne pas retenir la tâche choisie ! Le choix est retenu sil est compatible...

4 décembre 2006Cours d'algorithmique 8 - Intranet34 Considérons : Considérons : E( i, j ) = { t E | f <= d <= f <= d } E( i, j ) = { t E | f <= d <= f <= d } Initialisation : Initialisation : – soit t avec f = 0, – soit t avec d = +inf, – alors E = E( 0, n+1 ). Action Selection Problem kkkji 00 n+1n+1 d j f i d k f k

4 décembre 2006Cours d'algorithmique 8 - Intranet35 Décomposition : Décomposition : { } si E( i, j ) = { } { } si E( i, j ) = { } S( i, j ) = S( i, j ) = max_ens { { t } v S( i, k ) v S( k, j ) } sinon max_ens { { t } v S( i, k ) v S( k, j ) } sinon Action Selection Problem d j f i d k f k E( i, j ) t E( i, j ) k {{ E( i, k ) E( k, j ) { t E( i, j ) k k On maximise sur tous les choix pour t. k Cest la tâche t et les solutions optimales pour E( i, k ) et E( k, j ). k

4 décembre 2006Cours d'algorithmique 8 - Intranet36... Action Selection Problem Graphiquement, pour i < j : Graphiquement, pour i < j : Tâches triées par f croissants, donc i < k < j ! x i j S( i, j ) j i S( k, j ) S( i, k )... Premier axe de temps Second axe de temps

4 décembre 2006Cours d'algorithmique 8 - Intranet37 Action Selection Problem Lapproche gloutonne dit : Lapproche gloutonne dit : – Ce nest pas la peine de parcourir toutes les tâches de E( i, j ) ! – S( i, j ) = max_ens { { t } v S( i, k ) v S( k, j ) } Considérez la tâche t avec f minimal sur E( i, j ) ! Alors : Considérez la tâche t avec f minimal sur E( i, j ) ! Alors : – S( i, j ) = max_ens { { t } v S( i, k ) v S( k, j ) } = { t } v S( i, l ) v S( l, j ) = { t } v S( i, l ) v S( l, j ) = { t } v S( l, j ) = { t } v S( l, j ) t E( i, j ) k l k l k k l l

4 décembre 2006Cours d'algorithmique 8 - Intranet38 Action Selection Problem Trois approches de solution : Trois approches de solution : – Back-track ! Complexité : O ( 2^n ) – Programmation dynamique ! Complexité : O ( n^2 ) – Algorithme glouton ! Complexité : O ( n ) Lalgorithme glouton est souvent obtenu comme optimisation dune programmation dynamique ! Lalgorithme glouton est souvent obtenu comme optimisation dune programmation dynamique !

4 décembre 2006Cours d'algorithmique 8 - Intranet39 Task Scheduling with Penalties Définition : Définition : – « n » tâches de temps unitaires ! – Chaque tâche « t » comporte une deadline « d » et une pénalité « p », due si la deadline est dépassée. une pénalité « p », due si la deadline est dépassée. – Objectif : Trouver un ordonnancement qui minimise la somme des pénalités ! i ii

4 décembre 2006Cours d'algorithmique 8 - Intranet40 Task Scheduling with Penalties Solution : Solution : Pourquoi est-ce correct ? Pourquoi est-ce correct ? – Soit une suite optimale de tâches : ( t,..., t, t,..., t ) ( t,..., t, t,..., t ) Trier les tâches par deadlines croissantes. Parcourir les tâches et retenir celles qui peuvent être exécutées dans les temps. Compléter par les autres ! i+1 1 n i

4 décembre 2006Cours d'algorithmique 8 - Intranet41 Task Scheduling with Penalties Correction : Correction : – Soit une suite optimale de tâches : ( t,..., t, t,..., t ) ( t,..., t, t,..., t ) avec t en retard et t à lheure. avec t en retard et t à lheure. On peut échanger t et t sans changer la pénalité : On peut échanger t et t sans changer la pénalité : – t plus tôt, OK, et t plus tard, OK. Donc, il existe une solution optimale telle que : Donc, il existe une solution optimale telle que : ( t,..., t, t,..., t ) ( t,..., t, t,..., t ) à lheure en retard à lheure en retard i+1 1 n i ii+1 ii+1 i i+1 k+11 n k

4 décembre 2006Cours d'algorithmique 8 - Intranet42 Task Scheduling with Penalties Correction : Correction : – Dans une suite optimale, si t et t sont à lheure et que d > d, on peut les échanger sans modifier les pénalités. d > d, on peut les échanger sans modifier les pénalités. – Sans pénalité : f <= d et f <= d. – Par ailleurs : f < f <= d < d. – Donc : f < d et f < d. Donc, il existe une solution optimale telle que : Donc, il existe une solution optimale telle que : ( t,..., t, t,..., t ) ( t,..., t, t,..., t ) à lheure et d croissants en retard CQFD. i+1 i ii+1 ii+1 i i+1 ii+1 ii+1i+1 i+1ii k+11 n k i