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).