Sunday, February 6, 2011

La souris de Smilla

Smilla, La fille d'un de mes collègues, devait donner dans son école un bref exposé sur sa souris.

Avec son papa, ils ont alors pensé qu'il serait amusant de compléter cet exposé avec le calcul (simplifié) de la population des souris.

Voici les hypothèses:
  • Chaque souris femelle donne, pour la première fois après 10 semaines, puis toutes les 6 semaines, naissance à 6 souriceaux (3 femelles et 3 mâles)
  • Aucune souris ne meurt (l'espérance de vie d'uns souris est d'environ 2 ans)
  • Toutes les souris ont tous des petits (c'est-à-dire toutes les femelles :-)).
  • Nous commençons avec une seule souris femelle (-> Immaculée Conception :-))
Combien de souris aurons nous après x semaines ? Essayez de calculer la population pour x=52 (c'est à dire la population après 52 semaines).

Bonne chance!



Suite...

J'ai pour ma part résolu ce problème avec un petit programme Perl :

#!/usr/bin/perl

use strict;

my $INITIAL_POPULATION = 1; # Only Females!
my $GESTATION1 = 10; # GESTATION1 has to be
my $GESTATION2 = 6; # greater than GESTATION 2
my $FORK_M = 3;
my $FORK_F = 3;
my $MAX_WEEKS = 100;

my $population = $INITIAL_POPULATION; # Initial population
my @female = (map(0, (0..$GESTATION1 - 2)), $INITIAL_POPULATION);

foreach my $week (0..$MAX_WEEKS) {
printf ("%3i -> %20s\n", $week, $population);
my $x = $female[$week % $GESTATION1];
$population += $x*($FORK_M + $FORK_F);
$female[$week % $GESTATION1] = 0;
$female[($week + $GESTATION2) % $GESTATION1] += $x;
$female[($week + $GESTATION1) % $GESTATION1] += $x*$FORK_F;
}

Ce programme utilise peu de mémoire. En plus des constantes, il à besoin d'un "array" (@female) de 9 INTEGERS, et de 3 variables INTEGER : un compteur ($population), un itérateur ($week) et une variable temporaire ($x).

3 comments:

  1. Voici à quoi doit ressembler le résultat

    > Nous commençons avec 1 souris (première génération)
    population(0) = 1
    population(1) = 1
    ...
    population(9) = 1

    > Premières naissances de la première génération
    population(10) = 7
    population(11) = 7
    ...
    population(15) = 7

    > deuxièmes naissances de la premières génération
    population(16) = 13
    ...
    population(19) = 13

    > premières naissances de la deuxième génération
    population(20) = 31
    population(21) = 31
    ...

    ReplyDelete
  2. J'ai fait une petite pause dans la préparation de mon examen de mardi. Voici ce que ça a donné :
    http://www.seuret.com/divers/souris_smilla.pdf
    C'est marrant comme petit problème :)

    ReplyDelete
  3. Merci Mathias pour ta solution. Elle est vraiment très élégante. Je pense juste qu'il y a un petit bug dans l'addition finale. Le résultat correct est "4423" et non "4223"... mais je pense qu'il s'agit simplement d'une faute de frappe.

    ReplyDelete