[R] Simulation naissances

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
ultimateheadcenter
Niveau 2
Niveau 2
Messages : 21
Enregistré le : sam. 30 juil. 2016 15:35
Status : Hors ligne

[R] Simulation naissances

#1

Message par ultimateheadcenter »

Bonjour à tous, aujourd'hui je suis confronté à un problème et j'arrive pas à savoir d'où sa vient, en gros, le script commence avec un homme et une femme, qui s'accouplent ce qui fait des enfants, qui peuvent ensuite s'accoupler etc.

Je n'arrive pas à calculer le nombre d'enfants correctement : ou en tous cas, je n'arrive pas à le limiter

solution trouvée il suffisait de rajouté & ";" dans le string replace pour fonctionner avec le @extented
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_AU3Check_Stop_OnWarning=y
#AutoIt3Wrapper_Run_Tidy=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <String.au3>

Global $BDD = @ScriptDir & "\" & "BDD.ini"
Global $BDD_ADN = @ScriptDir & "\" & "ADN.txt"
Global $TOTAL_MATRICULE
Global $TOTAL_SEXE_HOMME
Global $TOTAL_SEXE_FEMME
Global $SAVE_MATRICULE
Global $MAX_ENFANTS = 3
_READ()

For $i = 1 To 30
   _ACCOUPLEMENT()
   Sleep(100)
Next


Func _ACCOUPLEMENT()
   Local $HOMME
   Local $FEMME
   Local $MATRICULE = IniReadSectionNames($BDD)
   For $i = 1 To $MATRICULE[0]
      $read = IniRead($BDD, $MATRICULE[$i], "SEXE", "error")
      $read2 = IniRead($BDD, $MATRICULE[$i], "Nombre d'enfants", "error")
      If $read = "HOMME" And $read2 = "error" Or $read2 < $MAX_ENFANTS Then $HOMME &= $MATRICULE[$i] & ";"
      If $read = "FEMME" And $read2 = "error" Or $read2 < $MAX_ENFANTS Then $FEMME &= $MATRICULE[$i] & ";"
      If $HOMME = "" And $FEMME = "" Then
         MsgBox(0, @ScriptName, "SIMULATION TERMINEE")
         Return 0
      EndIf
   Next
   Local $explodeHOMME = _StringExplode($HOMME, ";")
   Local $explodeFEMME = _StringExplode($FEMME, ";")
   Local $randomHOMME = Random(1, UBound($explodeHOMME) - 1, 1)
   Local $randomFEMME = Random(1, UBound($explodeFEMME) - 1, 1)

   $HOMME = $explodeHOMME[$randomHOMME]
   $FEMME = $explodeFEMME[$randomFEMME]
   _Generation($HOMME, $FEMME)
EndFunc   ;==>_ACCOUPLEMENT
Func _Generation($ADNM, $ADNF, $SEXE = Random(0, 1, 1))
   Local $RETURN
   If $ADNF = "" Or $ADNM = "" Then Return 0
   #Region MATRICULE
   $SAVE_MATRICULE = $TOTAL_MATRICULE
   $TOTAL_MATRICULE = $TOTAL_MATRICULE + 1
   $RETURN &= @CRLF & "MATRICULE=" & $TOTAL_MATRICULE & @CRLF
   #EndRegion MATRICULE
   #Region ADN
   $RETURN &= "Père=" & $ADNM & @CRLF
   $RETURN &= "Mère=" & $ADNF & @CRLF
   FileWrite($BDD_ADN, $ADNM & "+" & $ADNF & "=" & $TOTAL_MATRICULE & "|")
   IniWrite($BDD, $TOTAL_MATRICULE, "PERE", $ADNM)
   IniWrite($BDD, $TOTAL_MATRICULE, "MERE", $ADNF)
   $read = IniRead($BDD, $ADNM, "ENFANTS", "0")
   If $read = "0" Then
      IniWrite($BDD, $ADNM, "Enfants", $TOTAL_MATRICULE)
      IniWrite($BDD, $ADNM, "Nombre d'enfants", "1")
   Else
      IniWrite($BDD, $ADNM, "Enfants", $read & ";" & $TOTAL_MATRICULE)
      StringReplace($read & ";" & $TOTAL_MATRICULE & ";", ";", "")
      Local $NbEnfants = @extended
      IniWrite($BDD, $ADNM, "Nombre d'enfants", $NbEnfants)
   EndIf
   $read = IniRead($BDD, $ADNF, "ENFANTS", "0")
   If $read = "0" Then
      IniWrite($BDD, $ADNF, "Enfants", $TOTAL_MATRICULE)
      IniWrite($BDD, $ADNF, "Nombre d'enfants", "1")
   Else
      IniWrite($BDD, $ADNF, "Enfants", $read & ";" & $TOTAL_MATRICULE)
      StringReplace($read & ";" & $TOTAL_MATRICULE & ";", ";", "")
      Local $NbEnfants = @extended
      IniWrite($BDD, $ADNF, "Nombre d'enfants", $NbEnfants)
   EndIf
   #EndRegion ADN
   #Region SEXE
   Switch $SEXE
      Case 0
         $RETURN &= "SEXE=" & "HOMME" & @CRLF
         $TOTAL_SEXE_HOMME = $TOTAL_SEXE_HOMME + 1
         IniWrite($BDD, $TOTAL_MATRICULE, "SEXE", "HOMME")
      Case 1
         $RETURN &= "SEXE=" & "FEMME" & @CRLF
         $TOTAL_SEXE_FEMME = $TOTAL_SEXE_FEMME + 1
         IniWrite($BDD, $TOTAL_MATRICULE, "SEXE", "FEMME")
   EndSwitch
;~    _Statistiques()
   #EndRegion SEXE
   ;RETURN
   ConsoleWrite($RETURN & @CRLF)
EndFunc   ;==>_Generation
Func _Statistiques()
   $READ_ADN = FileRead($BDD_ADN)
   StringReplace($READ_ADN, "|", "")
   Local $NAISSANCES = @extended
   ConsoleWrite("TOTAL DE NAISSANCES=" & $NAISSANCES & @CRLF)
   ConsoleWrite("POPULATION ACTUELLE=" & $TOTAL_MATRICULE & @CRLF)
   ConsoleWrite("HOMMES=" & $TOTAL_SEXE_HOMME & @CRLF)
   ConsoleWrite("FEMMES=" & $TOTAL_SEXE_FEMME & @CRLF)
EndFunc   ;==>_Statistiques
Func _READ()
   Local $MATRICULE = IniReadSectionNames($BDD)
   If Not @error Then
      For $i = 1 To $MATRICULE[0]
         $TOTAL_MATRICULE = $i
         $read = IniRead($BDD, $MATRICULE[$i], "SEXE", "error")
         If $read = "HOMME" Then $TOTAL_SEXE_HOMME = $TOTAL_SEXE_HOMME + 1
         If $read = "FEMME" Then $TOTAL_SEXE_FEMME = $TOTAL_SEXE_FEMME + 1

      Next
   Else
      $TOTAL_MATRICULE = 10
      $TOTAL_SEXE_FEMME = 5
      $TOTAL_SEXE_HOMME = 5
      IniWrite($BDD, "1", "SEXE", "HOMME")
      IniWrite($BDD, "2", "SEXE", "FEMME")
      IniWrite($BDD, "3", "SEXE", "HOMME")
      IniWrite($BDD, "4", "SEXE", "FEMME")
      IniWrite($BDD, "5", "SEXE", "HOMME")
      IniWrite($BDD, "6", "SEXE", "FEMME")
      IniWrite($BDD, "7", "SEXE", "HOMME")
      IniWrite($BDD, "8", "SEXE", "FEMME")
      IniWrite($BDD, "9", "SEXE", "HOMME")
      IniWrite($BDD, "10", "SEXE", "FEMME")
   EndIf
EndFunc   ;==>_READ
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2282
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R]Simulation naissances

#2

Message par jchd »

On présente plutôt ce problème avec des lapins, car la cosanguinité chez l'homme n'est pas sans conséquences morales et génétiques.
Voilà comment je le formulais, lors d'anciennes formations :
Ce petit exercice vous est proposé en cette morne saison, en avant-goût de vacances idyliques au soleil.

Un couple de jeunes lapins adultes est introduit sur une île paradisiaque, qui ne compte aucun prédateur du lapin. Pour simplifier, nous admettrons les règles suivantes :

A. Chaque couple de lapins matures se reproduit chaque mois et donne un couple de lapereaux.
B. Les lapereaux sont sexuellement matures au bout d’un mois.
C. Les lapereaux naissent en parts égales entre mâles et femelles.
D. Aucun lapin ne meurt avant l’âge de 6 ans.
E. La cosanguinité ne joue aucun rôle dans ce problème.

Le but de l’exercice est de trouver le plus vite possible le nombre exact de lapins de tous âges peuplant l’île au troisième anniversaire de l’introduction de l’espèce. Préférence sera donnée à une solution élégante.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
ultimateheadcenter
Niveau 2
Niveau 2
Messages : 21
Enregistré le : sam. 30 juil. 2016 15:35
Status : Hors ligne

Re: [R]Simulation naissances

#3

Message par ultimateheadcenter »

Sa m'a pas effleuré l'esprit mais maintenant que tu me l'as fais remarqué effectivement je trouve ça choquant lol !
Je vais transformé tout ça pour fonctionner avec des lapins ! haha ^^
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2282
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R]Simulation naissances

#4

Message par jchd »

Bonne résolution. Au passage tu pourras résoudre ma version.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [R] Simulation naissances

#5

Message par mikell »

2^18 ?
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2282
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R] Simulation naissances

#6

Message par jchd »

rabbits.sol.pdf
Solution
(28.54 Kio) Téléchargé 119 fois
C'était dans le cadre de formation à Excel, donc mention de cette chose.
Il me reste un paquet de trucs comme ça, plus ou moins marrants et parfois intéressants. Après, Excel n'est qu'un prétexte pour faire fonctionner le système nerveux central.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: [R] Simulation naissances

#7

Message par mdanielm »

Je demande à voir ton jeu, voilà le mien:
; U(n) = nb de couples à la FIN du n-ième mois
;
; U(1) = 1     A
; U(2) = 2     A J
; U(3) = 3     AA J
; U(4) = 5     AAA JJ
; U(5) = 8     AAAAA JJJ
; ...les adultes donnent autant de jeunes et les jeunes précédents s'ajoutent aux adultes
; U(n) = U(n-1)+U(n-2)

Global $n=36
ConsoleWrite("Par itér =" & 2*U($n) & " lapins" & @crlf) ; 48 315 634

func U($n)
   Local $a=1, $b=2
   for $i=3 to $n
      $b+=$a
      $a=$b-$a
   Next
   return $b
EndFunc

func V($n)
   Return ($n<2 ? 1 : ($n<3 ? 2 : V($n-1)+V($n-2)))
EndFunc
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2282
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R] Simulation naissances

#8

Message par jchd »

Les lapins introduits sont bien précisés adultes et ne vont certainement pas attendre un mois pour s'accoupler, l'abstinence n'étant pas le point fort du lapin. A la fin du premier mois il y a donc un couple d'adultes et un couple de jeunes. U(0) = 1 et U(1) = 2

C'est le piège de la condition initiale, qui marche à 95%.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: [R] Simulation naissances

#9

Message par mdanielm »

C'est bien comme ça que j'ai compris le problème.
S'ils baisent à la descente d'avion, les lapereaux ne naitrons que le mois suivant.
U(0) n'est pas défini pour moi.
Par exemple, supposons qu'ils débarquent le 1er janvier et qu'ils se mettent à l'œuvre immédiatement, à la fin du 1er mois U(1)=1 couple et au 1er février, on aura la 1ere naissance donc à la fin du mois de février U(2)=2 couples.

Ecris le script qui conduit à ton résultat.
..si tu as le temps!
Daniel
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2282
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R] Simulation naissances

#10

Message par jchd »

Ce n'est pas une question d'implémentation, mais de logique. Au bout de 30 jours, les petits sont nés, ce qui fait bien deux couples pour U(1), l'un adulte, l'autre nouveau-né.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Répondre