Aller au contenu

Projet Les marmottes đŸč⚓

Crédits

Cette activitĂ© est adaptĂ©e du jeu "Les marmottes ont le sommeil lĂ©ger" de Marie Duflot Kremer, maĂźtre de confĂ©rences chez UniversitĂ© de Lorraine, LORIA & Inria Nancy Grand Est et d’une activitĂ© de l’IREM de Grenoble

Crédit de mise en forme : Rodrigo SCHWENCKE

1. Les marmottes ont le sommeil lĂ©ger đŸč⚓

les marmottes

Principe du Jeu⚓

Un groupe de marmottes au sommeil lĂ©ger (cĂ d qui se rĂ©veillent lorsque d'autres marmottes leur passent Ă  cĂŽtĂ©, durant leur hibernation), moyennement satisfaites de leur terrier actuel, dĂ©cide de concevoir un nouveau terrier, et de le creuser avant l’hiver.

  • Chaque marmotte doit dormir dans une Salle (de sommeil) de son terrier
  • Chaque marmotte se rĂ©veille un certain nombre prĂ©cis de fois (connu Ă  l'avance) durant son hibernation en hiver
  • Le but de jeu Ă©tant de gĂȘner/rĂ©veiller le moins possible les autres marmottes durant leur hibernation, car elles ont chacune le Sommeil LĂ©ger.

RĂšgles de Construction du Terrier⚓

Plus précisément, on déduit des rÚgles du jeu précédentes, que la contruction du terrier doit suivre les \(3\) rÚgles suivantes :

  1. RĂšgle de StabilitĂ© du Terrier : A partir de l'entrĂ©e, ou Ă  partir de l'extrĂȘmitĂ© d'un couloir (appelĂ© un embranchement/noeud), on peut au maximum creuser deux couloirs, sinon la structure risque de s'effondrer.
  2. RÚgle Individuelle de Sommeil Léger 1 : Pas de marmottes aux embranchements/noeuds.
    Autrement dit, les Salles de Sommeil des marmottes sont forcément situées au fin fond d'une galerie.
    En effet, si la salle de sommeil était sur un noeud (ou encore pire, au milieu d'un couloir) alors elle se ferait marcher dessus par d'autres marmottes habitant plus loin dans le terrier, et cela la réveillerait : elle a le sommeil léger. Les marmottes dorment donc uniquement au fond d'une galerie qui ne donne sur rien d'autre que sa salle.
  3. RÚgle Globale de Sommeil Léger 2 : Minimisation du bruit total des déplacements
    MĂȘme le simple dĂ©placement des marmottes qui se rĂ©veillent, Ă  cause du bruit lointain de leurs petites pattes, gĂ©nĂšre des vibrations qui dĂ©rangent le groupe pendant leur sommeil : elles ont vraiment le sommeil lĂ©ger !! Du coup, comme on sait combien de fois chacune va se rĂ©veiller et sortir (et revenir) du terrier pendant l'hiver, l'objectif sera que la somme des dĂ©placements de toutes les marmottes soit la plus petite possible.. Par souci de simplicitĂ© (et parce que cela change pas le rĂ©sultat), on pourra ne compter que les sorties du terrier, inutile de compter les retours dans le terrier.

En Pratique : Comment compter les déplacements des marmottes ?

Voici deux exemples de comptage des déplacements des marmottes :

  • Une marmotte dormant Ă  \(4\) couloirs de l’entrĂ©e, et se rĂ©veillant \(5\) fois dans l’hiver va parcourir \(4\times 5=20\) couloirs aller (il faudrait aussi compter les \(20\) retours, mais pour simplifier on ne va compter que les allers).
  • une marmotte qui se rĂ©veille \(6\) fois, et situĂ©e Ă  \(3\) couloirs de la sortie, devra parcourir \(6 \times 3 = 18\) couloirs aller (il faudrait aussi compter les \(18\) retours, mais pour avoir des chiffres moins gros on ne va compter que les allers). Si on la mettait Ă  \(1\) couloir de la sortie, elle ne parcourrait plus que \(6 \times 1 = 6\) couloirs.

A vous de jouer đŸč

A l'aide du matériel distribué en classe, déterminer quel est le meilleur terrier pour ces marmottes.

Le meilleur terrier

Pour trouver le meilleur terrier, il y a une méthode infaillible, qui ne demande pas trop de calculs :

  • on choisit les deux (ou deux parmi les) marmottes qui se lĂšvent le moins souvent, et on les relie par un morceau de terrier. Sur le coude on note le nombre de fois que ce morceau est empruntĂ© (donc la somme des valeurs des deux marmottes, par exemple 2 + 3 = 5)
  • on recommence exactement la mĂȘme chose, mais les deux marmottes reliĂ©es Ă  l’étape prĂ©cĂ©dente comptent maintenant pour une seule marmotte qui se rĂ©veillerait 5 fois
  • on continue, jusqu’à ce que toutes les marmottes soient reliĂ©es en un seul terrier.
  • et comme on a notĂ© des chiffres sur les coudes de terriers au fur et Ă  mesure on a juste Ă  faire la somme de ces chiffres pour compter le nombre de dĂ©placements

2. Algorithme de compression de Huffman⚓

Et quel est le lien avec l'informatique ?

L'algorithmme que nous venons d'appliquer pour trouver les meilleurs terriers, est utilisé dans le domaine de la compression de texte.

Le but de la compression de texte est ... de réduire le poids du texte. Les textes sont codés en binaire la plupart du temps.

Le code ASCII

Le but de la compression est de trouver un codage du texte, en binaire parce que dans un ordinateur tout est stockĂ© en binaire, qui soit le plus court possible, et qui soit facile Ă  coder et dĂ©coder. En gĂ©nĂ©ral pour reprĂ©senter un texte non compressĂ©, on utilise le code ASCII ou l’une de ses extensions. Mais mĂȘme rien qu’en ASCII on a 8 chiffres binaires (8 bits) pour stocker un caractĂšre. Si ce n’est pas grave que le code du "w" ou du "k" soient longs en français, par contre le "e" qui apparaĂźt plus souvent on aimerait bien que son code soit plus court, et c’est prĂ©cisĂ©ment ce que fait le codage de Huffman : donner Ă  chaque lettre un code binaire tel que si on met bout Ă  bout le code de toutes les lettre du texte, on a une version codĂ©e la plus courte possible

↩ Retourner les terriers !

La structure que l’on obtient est celle d’un arbre, avec la racine en haut, les couloirs qui se nomment des branches, et les extrĂ©mitĂ©s des branches appelĂ©es feuilles. Et dans cet arbre une marmotte correspond Ă  une lettre, et son nombre de rĂ©veils au nombre de fois que la lettre apparaĂźt dans un texte.

😕 Essayons d'y voir plus clair

Les textes à envoyer via un canal de communication sont (la plupart du temps) codés en binaire.

Essayons avec BARBARA RASE BASILE LE BARBIER

On obtient la fréquence d'apparition de chaque lettre :

Lettre Fréquence
A 6
B 5
R 5
espace 4
E 4
S 2
I 2
L 2
  1. Ecrire sur chaque feuille une lettre en commençant par assembler les lettres avec la fréquence d'apparition la plus faible. On additionne sur la racine la somme des fréquences.
  2. On poursuit la construction de l'arbre en appliquer les contraintes vues avec les marmottes.
  3. Ajouter sur chaque branche de gauche un \(0\) et sur chaque branche de droite un \(1\)

Sur notre structure de terrier on peut facilement lire le code de chaque lettre : on part de la racine du terrier et on lit le bit Ă©crit sur chaque couloir que l’on emprunte. Par exemple si pour aller de l’entrĂ©e Ă  la lettre A on prend Ă  gauche puis Ă  droite puis Ă  droite, le code de A est 011

Codage Préfixe

Texte de Marie Duflot Kremer

Imaginez que je donne le code 0 Ă  la lettre E, 01 Ă  la lettre S et 10 Ă  la lettre T.

Pour coder ce n’est pas difficile : ETES donne 0 puis 10 puis 0 puis 01 soit 010001.

Par contre pour dĂ©coder c’est franchement plus difficile. Si je lis 10010001 je sais que ça commence par un T, et puis il me reste 010001 que je peux dĂ©coder en ETES ou SEES. Sur cet exemple je sais que TETES est un mot et TSEES pas, mais sur un long texte je vais au mieux perdre Ă©normĂ©ment de temps, au pire avoir plusieurs possibilitĂ©s et ne pas savoir comment dĂ©coder.

Le problĂšme est que 0 est Ă  la fois le code de E et le dĂ©but du code de S, donc si je vois un 0 je ne sais pas si je peux dĂ©coder E tout de suite ou prendre le prochain bit et les dĂ©coder ensemble. Si au contraire on impose un codage prĂ©fixe, on interdit que le code d’une lettre soit le dĂ©but du code d’une autre. Du coup on va commencer Ă  la racine, suivre les branches en fonction des 0 et 1 dans le texte compressĂ©, et dĂšs qu’on arrive sur une lettre on la note (comme on ne peut pas continuer plus loin car la branche s’arrĂȘte lĂ , on est sĂ»r d’avoir lu le code de cette lettre) et on repart de la racine en continuant Ă  lire les chiffres binaires. Le dĂ©codage/dĂ©compression se fait donc trĂšs rapidement et sans hĂ©sitation.

Et les codes qui ne sont pas prĂ©fixes, on peut les jeter ? Non, pas tous. Si on regarde le code Morse par exemple, on a le E (un point) qui est prĂ©fixe du I (deux points). La diffĂ©rence c’est qu’en Morse on fait une lĂ©gĂšre pause entre deux lettres qui permet de savoir quand une lettre s’arrĂȘte et ainsi diffĂ©rencier un double e d’un i. En informatique tous les 0 et les 1 sont rangĂ©s les uns Ă  la suite des autres, sans pause, et c’est pour cela qu’on a besoin d’un codage prĂ©fixe.

đŸ”„ Challenge đŸ”„

  1. Mettez vous par binĂŽme.
  2. Choisissez un mot ou une phrase de 15 caractĂšres max
  3. Compresser votre phrase

  4. Fournissez Ă  votre binĂŽme le code binaire obtenu, ainsi que l'arbre de compression.

đŸ”„ Qui est le plus rapide Ă  dĂ©compresser ?

Résumé Le codage de Huffman

Il a Ă©tĂ© prouvĂ© que l’algorithme vu avec les marmottes est l’algorithme optimal pour le codage de symboles uniques, c’est-Ă -dire qu’on ne peut pas faire plus court que ce codage. Cet algorithme a Ă©tĂ© inventĂ© par l’informaticien amĂ©ricain David Albert Huffman, et publiĂ© en 1952.

Étant optimal il est utilisĂ© dans de trĂšs nombreuses application de compression de donnĂ©es, comme le cĂ©lĂšbre format zip (ou rar). En fait il constitue souvent la derniĂšre Ă©tape de la compression (on effectue d’abord une premiĂšre compression qui dĂ©pend de la nature des donnĂ©es (son, image, texte, vidĂ©o
) puis on stocke les donnĂ©es compressĂ©es avec l’algorithme d’Huffman).

Le but de cette deuxiĂšme partie est d’écrire un programme capable d’effectuer la compression et la dĂ©compression d’un texte avec l’algorithme de Huffman et d’estimer son efficacitĂ©.

La compression d’un texte avec l’algorithme de Huffman se fait en quatre Ă©tapes :

  1. Analyse du texte et détermination des fréquences des différents symboles constituant le texte
  2. CrĂ©ation de l’arbre binaire de codage en suivant l’algorithme vu avec les marmottes
  3. CrĂ©ation d’un dictionnaire de codage associant Ă  chaque symbole son code binaire dans l’arbre
  4. Encodage du texte, caractĂšre par caractĂšre en utilisant le dictionnaire de codage