ADN Project

_images/images.jpeg

Un biologiste réalise des expériences sur la modification d’ADN de colonies bactériennes. Ces colonies bactériennes sont cultivées dans un ensemble de 40 boîtes de Petri.

En modifiant leur ADN, le biologiste parvient à programmer les cultures de sorte à ce que la densité de chaque culture évolue en fonction des densités des culture voisines.

La densité de population d’une culture est mesurée sur une échelle entière de 0 à 3, la plus forte des densités étant associée à la valeur 3. La programmation de l’ADN est représentée par un tableau de 10 entiers nommée dnaProg, chaque entier représentant une densité de population.

L’évolution des cultures, d’une génération à la suivante se fait comme suit :

  • Pour chaque culture bactérienne repérée, on calcule la somme sDens des densités des cultures voisines et de celle de la culture concernée (soit au total 3 densités). La génération suivante de cette culture bactérienne aura une densité de population donnée par la valeur dnaProg[sDens].

  • Pour les cultures qui n’ont qu’une voisine, c’est à dire la première et la dernière, on ne somme que deux densités.

Avec ce principe d’évolution, il y a évidemment des programmes ADN qui conduisent à l’extinction de toutes les cultures ([0000000000] par exemple) alors que d’autres provoquent leur explosion démographique ([3333333333] par exemple)

Ce qui intéresse le biologiste est de simuler le comportement des populations soumises à des programmes dits intermédiaires et c’est l’objet du programme à concevoir ici.

Cahier des charges

  • Le programme doit demander à l’utilisateur d’entrer la programme ADN, sous forme d’une chaîne de 10 caractères dont on supposera qu’elle est correcte, c’est à dire ne contenant que des caractères “0”, “1”, “2” ou “3”.

  • Le programme doit également demander à l’utilisateur d’entrer le nombre de générations pour lesquelles il veut effectuer la simulation.

  • Le programme doit ensuite faire la simulation et afficher le résultat de chaque génération sous forme de ligne de 40 caractères représentant chacun une colonie avec la symbolique suivante :

    • une densité 0 est représentée par un espace (” “)

    • une densité 1 est représentée par un “.”

    • une densité 2 est représentée par un “x”

    • une densité 3 est représentée par un “W”

Ces caractères sont regroupés dans un tableau de caractères nommé T_SYMS.

  • Les colonies bactériennes ont toutes une densité de 0 à l’état initial, sauf la colonie n°20 qui a une densité de 1 (la première colonie porte le n°1).

  • La méthode main(), incomplète, est donnée ci-dessous

Classe Adn et méthode main()
        public class Adn {
                final static Scanner input = new Scanner(System.in);
                final static int NPOP = 10;
                final static int NDISHES = 40;

                // déclaration du tableau des symboles T_SYMS
                ...

                public static void main(String[] args) {

                        // current and next states
                        int[] tCurstates = initDishes(NDISHES);
                        int[] tNextStates = new int[NDISHES];

                        System.out.println("Enter the DNA program string below ");
                        int[] dnaProg = getDnaProgram(input.nextLine());

                        System.out.println("How many generations to compute ?");
                        final int NGEN = Integer.parseInt(input.next());

                        System.out.println("Evolution for DNA programm "+" "+Arrays.toString(dnaProg));
                        afficheState("0\t", tCurstates, T_SYMS);

                        // calcul et affichage des états des générations
                        ...

                }
Exemple d’exécution
        $ java Adn
        Enter the DNA program string below
        0120133230
        How many generations to compute ?
        20
        Evolution for DNA programm  [0, 1, 2, 0, 1, 3, 3, 2, 3, 0]
        0        : [                                         .                                       ]
        1        : [                                       . . .                                     ]
        2        : [                                     . x   x .                                   ]
        3        : [                                   .     .     .                                 ]
        4        : [                                 . . . . . . . . .                               ]
        5        : [                               . x               x .                             ]
        6        : [                             .     x           x     .                           ]
        7        : [                           . . . x x x       x x x . . .                         ]
        8        : [                         . x   . W W . x   x . W W .   x .                       ]
        9        : [                       .       . x x W   .   W x x .       .                     ]
        10       : [                     . . .   .   W x W . . . W x W   .   . . .                   ]
        11       : [                   . x   x x . . W W W W   W W W W . . x x   x .                 ]
        12       : [                 .     . . W . W x     W W W     x W . W . .     .               ]
        13       : [               . . . . x W W x W W x   W   W   x W W x W W x . . . .             ]
        14       : [             . x     . W W W W W W W W   W   W W W W W W W W .     x .           ]
        15       : [           .     x . . x             W W   W W             x . . x     .         ]
        16       : [         . . . x   . .   x           W W W W W           x   . .   x . . .       ]
        17       : [       . x   .     x x   x x         W       W         x x   x x     .   x .     ]
        18       : [     .       . . x . . . . . x                       x . . . . . x . .       .   ]
        19       : [   . . .   . x . . .       .   x                   x   .       . . . x .   . . . ]
        20       : [ . x   x x   . .   x .   . .   x x               x x   . .   . x   . .   x x   x ]

Travail demandé

  1. Écrire la déclaration/initialisation de T_SYMS qui devrait figurer en ligne 7 du listing de la classe Adn.

  2. Donner la définition de la fonction public static void afficheState(String s, int[] tab, char[] tSyms)

Où le paramètre

  • s est une chaîne qui est affichée en début de ligne et permet, par exemple d’imprimer le numéro de génération comme on peut le voir dans l’exemple d’exécution.

  • tab est le tableau contenant les densités bactériennes.

  • tSyms est le tableau des symboles à imprimer pour chaque valeur de densité.

  1. Donner la définition de la fonction public static int[] initDishes(int n)

Où le paramètre

  • n est le nombre de boîtes de cultures bactériennes à modéliser.

Cette fonction est utilisée à la ligne 12 du listing de la classe Adn et permet de générer le tableau tCurStates qui contient les densités des colonies bactériennes à la génération actuelle.

  1. Écrire la fonction public static int[] getDnaProgram(String s) qui prend en paramètre la chaine de caractère représentant le programme ADN (entrée par l’utilisateur) et qui retourne le tableau d’entier correspondant. On supposera que la chaine s est correcte.

  2. Écrire la séquence de code permettant de calculer et d’afficher l’évolution des densités bactériennes pour le nombre de générations demandé par l’utilisateur. Ce bout de code serait situé à partir de la ligne 25 du listing de la classe Adn.

  3. Écrire le code de la fonction public static int[] computeNextGen(int[] tCur, int[] prog)

Note

La fonction public static int[] computeNextGen(int[] tCur, int[] prog)

prend en paramètres :

  • tCur, le tableau des densité actuelles

  • prog, le tableau représentant le programme ADN.

Elle renvoie le tableau des densité de la prochaine génération de bactéries.