{ "cells": [ { "cell_type": "markdown", "metadata": { "toc": "true" }, "source": [ "# Table of Contents\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Texte d'oral de modélisation - Agrégation Option Informatique\n", "## Préparation à l'agrégation - ENS de Rennes, 2016-17\n", "- *Date* : 22 mai 2017\n", "- *Auteur* : [Lilian Besson](https://GitHub.com/Naereen/notebooks/)\n", "- *Texte*: Annale 2010, [\"Tissus cellulaires\" (public2010-D2)](http://agreg.org/Textes/public2010-D2.pdf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## À propos de ce document\n", "- Ceci est une *proposition* de correction, partielle et probablement non-optimale, pour la partie implémentation d'un [texte d'annale de l'agrégation de mathématiques, option informatique](http://Agreg.org/Textes/).\n", "- Ce document est un [notebook Jupyter](https://www.Jupyter.org/), et [est open-source sous Licence MIT sur GitHub](https://github.com/Naereen/notebooks/tree/master/agreg/), comme les autres solutions de textes de modélisation que [j](https://GitHub.com/Naereen)'ai écrite cette année.\n", "- L'implémentation sera faite en OCaml, version 4+ :" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The OCaml toplevel, version 4.04.2\n" ] }, { "data": { "text/plain": [ "- : int = 0\n" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Sys.command \"ocaml -version\";;" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----\n", "## Question de programmation\n", "La question de programmation pour ce texte était donnée au tout début, et occupe toute la page 2 :\n", "\n", "### Modélisation\n", "> \n", "> On veut simuler un phénomène de contamination. L’état d’une cellule est représenté par un\n", "> entier compris entre $0$ et $K$ ($K \\geq 1$ est un paramètre fixé).\n", "> \n", "> Une cellule est normalement saine, non contaminée, dans l’état $0$ et reste dans cet état tant qu’elle n’est pas infectée.\n", "> Tous les autres états représentent différents stades d’infection.\n", "> Une cellule infectée commence dans l’état $1$ et à chaque itération passe dans l’état suivant (c.-à-d. $2$ puis $3$ puis...).\n", "> Quand elle atteint l’état $K$, elle a remporté sa lutte contre l’infection et retourne à l’état $0$, saine et non infectée à l’itération suivante.\n", "> \n", "> Une cellule infectée n’est pas tout de suite contagieuse (c.-à-d. capable d’infecter ses voisines).\n", "> Une cellule devient infectieuse à partir du stade $I$ ($I \\leq K$, $I$ est un autre paramètre fixé) et le reste jusqu’à sa guérison (retour à l’état $0$).\n", "> Durant cette période, elle peut contaminer chacune de ses deux voisines (les plus proches à droite et à gauche).\n", "> Si celles-ci ne sont pas déjà infectées, elles le deviennent automatiquement, au stade $1$; si elles sont déjà infectées, elles le restent.\n", "> \n", "> Les cellules ne bougent pas et on les suppose rangées les unes à côté des autres sur une ligne.\n", "> Elles sont toutes mises à jour en même temps, de manière synchrone.\n", "> Pour simplifier, on suppose que les première et dernière cellules restent toujours dans le même état $0$.\n", "> \n", "> ![Figure 1 : tissu cellulaire en ligne, K=5 et I=2](images/tissu_cellulaire_fig1.png)\n", "> \n", "> Tout ceci est schématisé sur la Fig. 1 où l’on voit en haut une configuration et en bas la configuration suivante.\n", "> Chaque cellule est mise à jour en fonction de ses deux plus proches voisines, sauf pour les cellules des deux extrémités dont l’état ne change pas.\n", "> Après la configuration $(0, 0, 3, 0, 0, 1, 5 ,\\dots, 0 )$, le système passe donc à la configuration $(0, 1, 4, 1, 0, 2, 0 ,\\dots, 0 )$ pour $K = 5$ et $I = 2$.\n", "> Dans cette illustration, l’état de la troisième cellule (3) est en gras pour\n", "> indiquer pour quelles cellules il intervient durant la mise à jour.\n", "\n", "### Exercice\n", "> Écrire un programme permettant d’afficher la progression de la contamination sur une vingtaine d’itérations, par exemple pour les valeurs ($K = 5$ et $I = 2$) en partant d’une seule cellule infectée sur une ligne d’une vingtaine de cellules saines.\n", "\n", "> Préciser la complexité en temps et en espace de la simulation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "----\n", "## Solution\n", "\n", "On va essayer d'être rapide et de faire simple, aussi $K=5$ et $I=2$ seront **fixés** et constants dans tout le code suivant." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Les constantes $K$ et $I$ de la simulation sont fixées :\n", "\n", "- $K = 5$ fixe le nombre d'états différents dans lequel peut être une cellule,\n", "- $I = 2$ fixe le seuil à partir duquel une cellule devient contagieuse" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "val k : int = 5\n" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "val i : int = 2\n" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "- : unit = ()\n" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "let k = 5;;\n", "\n", "let i = 2;;\n", "\n", "assert (i <= k);;" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Pour une cellule" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "L'état d'une cellule est un entier :" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "type etatcellule = int\n" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type etatcellule = int;;" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Voici quelques fonctions \"triviales\" pour traduire les propriétés décrites par le texte :" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "val est_saine : etatcellule -> bool =