Anda di halaman 1dari 10

Ada –

Sujets des Travaux Dirigés


UV Algorithmique 2
INSA première année

Campagne 2009–2010 Didier L E B OTLAN


contact.lebotlan@insa-toulouse.fr
Mode d’emploi

Déroulement des séances


◦ Vous travaillez par équipes de quatre étudiants.

Sur le travail demandé


◦ Pour résoudre le problème posé, vous pouvez avoir besoin d’utiliser des concepts qui n’ont pas
encore été vus en cours. C’est un choix pédagogique : feuilletez le polycopié de cours.
◦ Pendant la séance, vous pouvez poser des questions de compréhension à l’enseignant, mais il ne
résoudra pas le problème à votre place.
◦ Aucun corrigé officiel ne sera fourni concernant les sujets de TD. Par contre, votre encadrant se fera
une joie d’examiner et de commenter ce que vous aurez produit. N’hésitez pas à le solliciter lorsque
vous ne comprenez pas un point précis.

2
TD – Problème 1
Contexte
Lors d’une discussion à la cantine de votre entreprise, vous avez évoqué avec votre équipe de travail
le paradoxe des anniversaires1 , puis le paradoxe du paradoxe des anniversaires2 . Malheureusement
pour vous, le Directeur du département Recherche et Développement vous a entendu, et comme il
a toujours de bonnes idées, il a décidé, malgré vos protestations, que votre équipe serait désormais
responsable du calcul probabiliste, suscitant aussitôt l’admiration de vos collègues.

Le paradoxe des anniversaires


Dans une assemblée suffisamment grande (>40 personnes), il y a
presque toujours deux personnes nées le même jour de l’année.
On note p(n) la probabilité que deux personnes soient nées le même
jour de l’année dans une assemblée de n personnes.
1
p(1) = 0 p(2) = p(25) ≈ 57% p(30) ≈ 70%
365
p(35) ≈ 81% p(40) ≈ 89% p(50) ≈ 97% p(100) ≈ 99, 99997%
(Vous trouverez la formule tout seuls plus tard)
Mission
La première tâche ne tarde pas à venir : afin de mettre au point une simulation de percolation, vous
devez calculer des probabilités de présence liées au mouvement brownien à une dimension :
◦ Considérons 2n + 1 cases, en ligne, numérotées de 1 à 2n + 1.
1 2 3 n n+1 n+2 2n+1
... ...
◦ Au départ (à t = 0), la case n + 1 contient une particule. Les autres cases sont vides.
◦ Si la particule se trouve dans la case i à l’instant t, elle a une probabilité 31 de se retrouver dans la
case i − 1, i, ou i + 1 à l’instant t + 1, sauf aux bords (i = 1 et i = 2n + 1) où elle ne peut pas sortir
(sur le bord, la particule a une probabilité 23 de rester en place).
◦ Ainsi la particule avance à gauche ou à droite, ou reste en place, de manière aléatoire.
◦ Ce mouvement aléatoire sur une ligne est appelé mouvement brownien à une dimension.

Vous devez écrire une procédure Proba qui reçoit deux arguments : n (la ligne contient 2n+1 cases)
et t temps de mesure, et affiche la probabilité de présence de la particule dans chaque case à l’instant t.

Un cabinet d’audit externe, grassement rémunéré, vous propose la ligne de conduite suivante :
1. Calculer à la main p(i, t) pour t = 1, 2, 3, 4 et une valeur de n suffisamment grande.
2. Trouver la formule de récurrence permettant de calculer p(i, t + 1) en fonction des p(_, t). Le
cabinet vous fournit les conditions initiales : p(i, 0) = 0 pour i 6= n + 1 et p(n + 1, 0) = 1.
3. Écrire le programme demandé

Le paradoxe du paradoxe des anniversaires


Si on expérimente trop souvent le paradoxe des anniversaires, on tombe sur un cas
incroyable où il ne marche pas (sauf en amphi ou il marche tout le temps).
1
qui n’en est pas un, comme tous les paradoxes.
2
qui n’en est pas un non plus.
3
Pour ceux qui veulent tester
Si vous essayez en salle de TP, multipliez la valeur finale par 3t pour obtenir des valeurs entières. Avec
n = 2 et t = 4, les valeurs sont :
14 17 19 17 14

Suite de l’histoire
Lors de la démonstration de votre programme avec n = 5 000 et t = 20 000, votre chef a trouvé que le
temps de réponse était un peu long et il s’inquiète de savoir si votre algorithme tiendra la route pour
les applications ayant besoin de valeurs de t au delà du million.
Il vous demande donc d’évaluer deux grandeurs de votre programme en fonction de n et t, supposés
assez grands (les approximations raisonnables sont les bienvenues) :
1. la taille mémoire nécessaire
2. le temps de calcul
Quelques pistes sommaires :

Calcul de la taille mémoire


◦ Un entier occupe 4 octets en mémoire, un nombre réel 8 octets.
◦ Un tableau de n réels occupe n fois 8 octets.

Calcul du temps d’exécution


◦ L’ordinateur du chef tourne à 1GHz, il ne peut donc pas aller plus vite que 1 milliard
d’opérations par seconde. En réalité c’est plutôt 10 fois moins.
◦ Une opération est, par exemple, un calcul simple (une addition, une multiplication, etc.) ou une
affectation de variable.

Théorème des crêpes (1)


Si on mélange une quantité arbitraire d’oeufs, farine, et lait (en proportions raisonnables),
avec un peu de beurre, on obtient une pâte à crêpes tout à fait honorable.

Théorème des crêpes (2)


La première crêpe est presque toujours ratée.

4
TD – Problème 2

28 juillet 2012, Londres


Ce matin a eu lieu la première épreuve de natation des jeux olympiques de Londres.
À cause d’un dysfonctionnement logiciel, le chronométrage officiel s’est arrêté en pleine course, au
moment où le nageur en tête a effectué son premier demi-tour (l’incident n’est pas passé inaperçu).
De plus, il a fallu attendre 25 minutes pour réussir à départager trois nageurs arrivés en même temps,
en procédant au visionnage de l’épreuve au ralenti.

Dès midi, les organisateurs des J.O. ont lancé un appel d’offre pour réécrire intégralement le logiciel de
chronométrage des épreuves de natation. Le délai est de 18 heures, car il faut être prêt pour l’épreuve
du 400 mètres nage libre ayant lieu demain.
En vacances avec quelques collègues de l’INSA, vous décidez de répondre à cet appel d’offre pour
occuper constructivement votre après-midi et encaisser au passage les 15 000 £.

Cahier des charges

Objectifs Écrire un programme qui demande le nom des nageurs, chronomètre chaque nageur, dé-
tecte les faux départs, compte les aller-retours jusqu’à 400 mètres, et affiche les noms des nageurs
dans l’ordre d’arrivée, avec leur numéro d’arrivée.
Une piscine olympique fait 50 mètres de long. Elle peut avoir un nombre quelconque de couloirs
utilisés (en général 8). Pour spécifier le nombre de couloirs, il suffira de modifier une seule ligne de
votre programme.

Capteurs Les capteurs envoient des signaux qui sont immédiatement enregistrés puis peuvent être
récupérés par la fonction Attend_Signal (voir dans l’acteur Capteurs ci-dessous).
◦ Lorsque le nageur de la ligne numéro i quitte son plot de départ, le capteur situé dans le plot envoie
un signal de type Un_Evenement, dans lequel Emetteur = Capteur_Depart, Num = i, et Date = la date
de l’évènement en secondes.
◦ De même, lorsque le nageur de la ligne numéro i touche l’un des bords du bassin, les capteurs
optiques envoient un signal. Les plots de départ sont sur le côté Nord. Le capteur étant très sensible,
plusieurs signaux peuvent être envoyés d’affilée pour un seul toucher du nageur.
◦ Le signal de départ est signalé par le capteur Capteur_Feu.

Conseils techniques
◦ Commencez par faire un algorigramme sur papier !
◦ Un type record ne peut contenir que des chaînes (String) de taille fixée, ce qui s’écrit String (1..12)
pour une chaîne de 12 caractères.
Vous pourrez utiliser la fonction Normalise (X, N) de GAda.Text_IO, qui prend une chaîne X et renvoie
une chaîne de taille N en la tronquant ou en la complétant avec des espaces.

5
◦ Pour arrêter le programme au milieu d’un bloc, vous pouvez utiliser l’instruction raise Program_Error ;

Mission complémentaire
Pour chaque nageur, repérer son meilleur temps de parcours de 50m (sur une longueur de piscine).
À la fin de l’épreuve, lorsque tous sont arrivés, afficher un classement des nageurs les plus rapides sur
50m.

capteurs.ads

Cet acteur permet d’attendre un signal provenant des capteurs.

package Capteurs is
Énumération des différentes sortes de capteurs
| Capteur_Depart : capteur situé sur le plot de départ
| Capteur_Nord : capteur situé à l’extrémité Nord du bassin
| Capteur_Sud : capteur situé à l’extrémité Sud du bassin
| Capteur_Feu : signal émis au moment du départ
type Un_Capteur is (Capteur_Depart, Capteur_Nord, Capteur_Sud, Capteur_Feu) ;
Un évènement est un signal émis par un capteur
Numero est le numéro de couloir du capteur (pour les capteurs Depart, Nord, Sud)
Date est la date de l’évènement, en secondes depuis minuit.
type Un_Evenement is record
Emetteur : Un_Capteur ;
Num : Integer ;
Date : Float ;
end record ;
Attend jusqu’à ce qu’un évènement se déclenche
et renvoie l’évènement qui s’est produit.
Les évènements arrivent forcément dans l’ordre chronologique.
function Attend_Signal return Un_Evenement ;
end Capteurs ;

6
TD – Problème 3

Contexte : Bioinformatique
Voici un extrait d’un génome humain (chromosome 18, position 53 464 656) :
. . .A T G A G T A C A G A A A G A G A C T C A G A A A C G A C A T T T G A C G A G G A T T C T C A G C C T A A T G A C G A A G T G G T T C C C T A C A G T G A T G A T G A A A C A
GAAGATGAACTTGATGACCAGGGGTCTGCTGTTGAACCAGAACAAAACCGAGTCAACAGGGAAGCAGAGGAGAACCGGGAGCCATTC
AGAAAAGGTAACCACATGAAGTCCCGGTGACTAGGTCGCTTATAAATCCTCATGTGGGTCATGGCCACACGTGCCAAAGATGATCGGT
CTATTTTGCGTGGTCTAGGAGAGAATCTTCTCTGATCTCTTCTTAGGATGCGACTGACAGAATGGTGGATGGGCTTGGACAAGTACCC
ATTGTCCTTAGTAAGAAGGGCTGGGAGAGCATATCTGACAAGTTCTGCAGAGAAAATACATTAAGGTCTTTGTTAGTGTGTGTATATAT
A T A T A T A T A T A T A T A T A T A T A T A T A T A T A T A T A T A T A T A T A T A T A T A T A T A ...

Pour information, le gène ci-dessus (dont vous ne voyez qu’un court extrait) est l’ “ATPase, Class I, type
8B, member 1”. Il code une enzyme lié au cycle de l’ATP.
À chaque triplet de bases (p. ex. “ATT”) est associé un acide aminé (ici “Ile”, c.-à-d. Isoleucine).
Ala GCT, GCC, GCA, GCG Lys AAA, AAG
Arg CGT, CGC, CGA, CGG, AGA, AGG Met ATG
Asn AAT, AAC Phe TTT, TTC
Asp GAT, GAC Pro CCT, CCC, CCA, CCG
Cys TGT, TGC Sec TGA
Gln CAA, CAG Ser TCT, TCC, TCA, TCG, AGT, AGC
Glu GAA, GAG Thr ACT, ACC, ACA, ACG
Gly GGT, GGC, GGA, GGG Trp TGG
His CAT, CAC Tyr TAT, TAC
Ile ATT, ATC, ATA Val GTT, GTC, GTA, GTG
Leu TTA, TTG, CTT, CTC, CTA, CTG
Note : ce tableau n’est pas totalement universel : il existe des petites variantes de codage dans les mitochondries
et chez certaines espèces de bactéries, algues, etc. .

Mission
En utilisant l’acteur Genome (ci-après), écrire un programme qui remplit le cahier des charges suivant :
◦ Votre programme lit deux fichiers "chromosome" et "proteine". Le premier contient la séquence ADN
d’un chromosome, le second contient une séquence d’acides aminés.
◦ Votre programme cherche dans le chromosome une séquence qui code la protéine indiquée.
◦ S’il la trouve, il affiche sa position, sinon un message indique qu’il ne l’a pas trouvée.
◦ Quand vous avez terminé, évaluez le temps d’exécution de votre programme en considérant le pire
cas et le cas moyen (à vous de faire les estimations raisonnables). La taille du chromosome 18 est de
77 millions de paire de bases. La protéine que l’on cherche est l’ “Amiloride-sensitive cation channel
1, neuronal” ; elle contient 512 acides aminés (cette protéine est un canal à ions sodium présent
dans les neurones qui permet de créer un courant électrique).

Marche à suivre
La difficulté principale est de déterminer comment décomposer ce problème en tâches simples. Une
fois la décomposition faite, les algorithmes à écrire sont petits.
+ Première étape : écrire une fonction qui prend en argument trois bases et qui renvoie un acide
aminé. (Écrivez seulement le code pour deux acides aminés, la suite sera semblable).
+ Pour vous aider à démarrer, cherchez à la main la séquence Glu–Thr dans l’extrait de génome
ci-dessus.
7
genome.ads

Cet acteur permet de lire des fichiers contenant un génome


ou contenant une séquence d’acides aminés.

package Genome is
Une base ADN et une séquence ADN
type Une_Base is (A, C, G, T) ;
type Une_Sequence_ADN is array ( Integer range <>) of Une_Base ;
Un acide aminé et une séquence d’AA
type Un_AA is (Ala , Lys, Arg, Met, Asn, Phe, Asp, Pro, Cys, Sec,
Gln, Ser, Glu, Thr , Gly , Trp , His , Tyr , Ile , Val , Leu) ;
type Une_Sequence_AA is array ( Integer range <>) of Un_AA ;
Lit un fichier d’ADN et renvoie son contenu (le tableau commence à 1)
function Lire_ADN (Nom_Fichier : String ) return Une_Sequence_ADN ;
Lit un fichier d’acide aminés et renvoie son contenu (le tableau commence à 1)
function Lire_AA (Nom_Fichier : String ) return Une_Sequence_AA ;
end Genome ;

Remarque technique
Dans un sous-programme, il est possible d’ajouter use Genome ; avant le begin pour ne pas avoir à
ajouter le nom de l’acteur devant les valeurs énumérées. Il est alors possible d’écrire A au lieu de
Genome.A (de type Une_Base).

8
9
GATCTCTGATCAAAGCTAAAGGTAATCATGAAGGCTACAATTCTGTGCATCGCTTTCCTTATTGCTGTTGTCGCCTCCGAGAGGTGTAC
ATTCTTCCACCACGAGTGTTCCGGTACCACCTGCTCTGATGGAGCCCCTCACTGTGTGTTGGGAACCTGCAGATGCACGCAAAACACC
GGAAAAGCTTGTACCACCGCCTCTGATTGCACAGAGCACTGCGCCCTCTTCGGAGATCAGCACTGTGTTGACGGTTTCTGTCATTGCC
CATTTGACAGCGTCCTTCCTGGCGTAGGAAAATAAATATCTTAATAAACAATGACACAACGTTGTCATAATATGGGAAACTCGGTGCCA
TGTATCATTGTGGAACCGTTTCAGATAGACGAGAAGACCCCTGTTCCCTCATCTTCGATGCCATTTTTTATGGGAACAAGAACGAGGTT
CAGCAGTTGATTTCTGGCGGAGTGGACAAGAATGTCGTCACGCATCGTCATGTGCGCTGGGATAGCGCGAGTGCGCTTGGCGCTGCC
GCCTACGAAGGTCACATGGACATAGTGCGTTATCTGATTGACATCGGGACATCAGTGAATTTCTCCGACCCCTGTCAAAGACGGACGC
CTCTACACTGGGCCTGCCTTGGCAACCAGTATCAGGCGGCCGCTTACCTCATCAAACACGGTGCTGACGTCAACCACAGGGATTTGG
AGCAGACGACACCCATACTTCGCGCTGCCTTAGGAAGAAATATAGACTTAGTGAAATGTTTGATTGAAAACGGTGCTGATGTTCGACAT
ATTGATATTCTTGGTTGCTCTGTTCTCCATTACGCTTGTGTTCATGGCGACAAGAAACTGATAAATACTGTCATCCGAGCAGGGTGTAT
TTCTAACAATGTCGCTGTGATAGGGAAAGCCACGCCTTTACAAACGCTATCCAAAAAGAACGACCGCGAAAACGTGTCACAGCTACTG
GCAGCCGGGTACAACCTAGAAAACGACCAGAACTGGGTCAACTCTTTATCTCCTCCAATCACGTGCTCTAACCCTACGCTGGAATATG
TGGTTCGATTTGCCAAAACTCGACCCTTAAGCTTGAAAGGACTCTGCAGGAAAACGATAAGGAACGAAATGAGAGGAGTGAAAGTGGA
ACAGATGTTAAACAACTTTCCTTGTCCAGCATTAATTCGGCAGTATCTAATACTGGATCATCTGTGATATTGTTCAGACACAACGTTGTC
ATAATATGGGAAACTCGGTGCCATGTATCATTGTGGAACCGTTTCAGATAGACGAGAAGACCCCTGTTCCCTCATCTTCGATGCCATTT
TTTATGGGAACAAGAACGAGGTTCAGCAGTTGATTTCTGGCGGAGTGGACAAGAATGTCGTCACGCATCGTCATGTGCGCTGGGATAG
CGCGAGTGCGCTTGGCGCTGCCGCCTACGAAGGTCACATGGACATAGTGCGTTATCTGATTGACATCGGGACATCAGTGAATTTCTCC
GACCCCTGTCAAAGACGGACGCCTCTACACTGGGCCTGCCTTGGCAACCAGTATCAGGCGGCCGCTTACCTCATCAAACACGGTGCT
GACGTCAACCACAGGGATTTGGAGCAGACGACACCCATACTTCGCGCTGCCTTAGGAAGAAATATAGACTTAGTGAAATGTTTGATTG
AAAACGGTGCTGATGTTCGACATATTGATATTCTTGGTTGCTCTGTTCTCCATTACGCTTGTGTTCATGGCGACAAGAAACTGATAAAT
ACTGTCATCCGAGCAGGGTGTATTTCTAACAATGTCGCTGTGATAGGGAAAGCCACGCCTTTACAAACGCTATCCAAAAAGAACGACC
GCGAAAACGTGTCACAGCTACTGGCAGCCGGGTACAACCTAGAAAACGACCAGAACTGGGTCAACTCTTTATCTCCTCCAATCACGTG
CTCTAACCCTACGCTGGAATATGTGGTTCGATTTGCCAAAACTCGACCCTTAAGCTTGAAAGGACTCTGCAGGAAAACGATAAGGAAC
GAAATGAGAGGAGTGAAAGTGGAACAGATGTTAAACAACTTTCCTTGTCCAGCATTAATTCGGCAGTATCTAATACTGGATCATCTGTG
ATATTGTTCAGAGTGACAGGAAAAGGAGCAATATAAAAGATGAAGCATGCTGGATTATTTGCCGTTTCCATCTCTGTATTGGTGATGTT
CACCCTTGTCCACGAAGGACTTTCAGCCACTACCACAACAACAACACCAAGTGGAGGTGGTGGAGGTGGTGGAGGTGGTGGGATACG
GAAAAATGAAAAAGAATGACGGATAAACGTACGCGTAGCATTACCTACCTGGGACTTCTATTTATTTTCTTAACGAAGCTTCCTGTGTT
GGCGTCTTCTACAGCATGTATCACTTCAAGAGAAACCGCAGAAATAGTGACAGAATGTCCCCAAACACAATTGGCATGGGAAGAAGCA
GCGGTAAAGAAAAATTGTGAAAGGACGCAAAACCCCTGTTCTTCTTTTGTTTATCACTGTGTAATGAATACATGGAAAAATCAGACTAT
TGAAGTGTGTGCCCCGAAACAGATGATTCTCGGAAAAAACTGTGCAGAATATAATTTTCTTGGAGCCAAAGTCCAACGCAATTCTAAAG
TGAAATGCAGCAAATGTCCTATTGTGTATAATTCAACTGACGCTTTTAAATATCAAGAATGCTACAGAAGTGTTATCCCTACAGCTAATC
CTGATAACACAACTTATCAATTACGTATTTCATTTGTTGAGACAACAAGCAGAACGACAAATTCATCTACACCTCATGATAAACCCGAAT
ATTTAGTTCAAAATCAAGTTTTGGACGACAAGAAAAACAAATCTTATAAACATATATATTTTGGAGGATTTTGTGTGGTATGATGGTCAC
CCTATTAATGGCCGCCTCCATGATATTGTAAACATTTAAAAAATGCCAGCAGAAAATATGACTGATAAAAAAGACAAGAAGAAAGAAGA
GGTGCCCCCGCCCCCCACTAAAGGGGTCTACATCTTCCCGAATGGAGACAAATATGACGGAGAATACCAGCATGGCAGTGACGGATC
ACTGGAGCGGAACGGTTATGGTGTCCATACCACGACGGAAGGGGCCGTGTATGAAGGCGAGTGGAAGGGGGACAAAATGAACGGCA
GGGGAAAATTAGCCCACCCCTCAGGCGCCCTGTACGAGGGAGAGTTTGTCAATAATCAGTTCCACGGCCAGGGAAAATACACATGGA
AGAACAACTCTTTTTACGAAGGACAGTTCAAAGAAAATAAGATGGAGGGTACGGGCCAGTTCACCGACACGGAGGGACAGATGTGGAC
GGGGACATTCCGATACAAGGCGGCGCCAGGACTGAGATTTGAACTCAAGATGAATTAATGCTAAGCTGCTTACGTTCTGTATGAAAAG
TTTCATCAATCGGACCCATCCACGTCATCTGCACATCGCTCTGGTGGTGTGATTCATTGTGTTAGCAAATGTTGAATGAATGTGTGTGT
AATTGTTAAACATAATAAAAATACACTGTACATTTTACTGAACAAAAAAAGAGAAAGAGCAAGTAAGTAGGCATTATAGGAGCACCTAGT
TAGGAAACAGAAGGAGGGGAGCATCATGACTTGGGCTAGGATCTCGCTGTTGGTTTTGTGTGTGGTGGTGGCTGTTAATGCATCCCCA
GTGTCTAACCAGTGCCCGGATGAGGACGACTTCATGTGTATGTCCGACGGTCAGTCTGCCTGCTTCCCGAACAACTGGAAATGTGACG
GTGAACCCGACTGTGACGGCAACGTCGATGAGCATGGCTGTCCCCCAGTTACCTGTGAAGCCGACGAGTTCTCATGCGACAATACCT
GTATCCCTGCAACATTCGTCTGTGATGGTGATTACGATTGCTATGACAACAAAGATGAGGCCATGTGTCCTGCTGTGTGGGTGAAGCC
AGATTCCAAAGAAAACACGCGAGAGCGCCGCCTAGTGCCTGGCATAATGTCTCCGCCCCTTCCTGTGTTCCTTCATCATCTGATATCT
CATTTCGTCATTAAGAACTTCCATTCACTCTGTGATATGTTTTGAGATTGTAATATTTTTTTGTTGTTTAGTAAAAAAGGGTGTTCTATTG
TAATGTTACATATAGACTGATTTATCTGCAGTCTATACAAATAAATAACAAAATGATGACAAA

(Extrait authentique du génome d’une huître, GenBank)

Version du 26 janvier 2010.

Anda mungkin juga menyukai