Page 1 sur 1

Simulation de population

Publié : lun. 23/sept./2013 16:52
par Thyphoon
Bonjour,

je profite d'être bloqué chez moi pendant une semaine, pour jouer avec la dernière version de Purebasic.
Ce langage est vraiment de mieux en mieux. :D

J'ai un projet qui traîne depuis quelques années dans mes cartons.
il s'agit de créer une simulation de population pour créer des soirées enquêtes.

L'idée est de partir d'un lieu totalement vierge, genre une île. de faire venir a une certaine date un certain nombre de personne... que ces personnes evoluent, se marient, aient des enfants qui eux aussi évoluent, se marient ont des enfants etc... et que de tant a autre je puisse rajouter l'arrivé de nouvelle personne. etc, etc....

L'idée est peu a peu de poussé le vis, que l'algo intègre le choix d'un travaille, des amis, des maladies, des accidents, Des lieu d'habitations, des déménagements etc...

voici un tout debut de code qui ne gère qu'une première génération ... qu'en pensez vous ? si vous avez des suggestions pour organiser mieux le code je suis preneur.

Code : Tout sélectionner

Structure populate
  currentDate.i
  ageMin.l
  ageMax.l
EndStructure


Structure person
  mother.i
  father.i
  origine.s
  birthday.i
  deathday.i
  sex.b
  firstname.s
  name.s
  birthName.s
  married.i
  weddingday.i
  nbChildren.l
EndStructure


Global Dim person.person(0)
InitNetwork()

Procedure newName(z,firstnameOnly=#False)
  url$="http://www.behindthename.com/random/random.php?number=2"
  If person(z)\sex=0
    url$=url$+"&gender=m"
  Else
    url$=url$+"&gender=m"
  EndIf
  url$=url$+"&surname=&all=no"
  Select LCase(person(z)\origine)
    Case "English"
      url$=url$+"&usage_eng=1"
    Case  "African"
      url$=url$+"&usage_afr=1"
    Case "French"
      url$=url$+"usage_fre=1"
    Case "Chinese"
      url$=url$+"usage_chi=1"
    Default 
      url$=url$+"&usage_afr=1"
  EndSelect
  FileName$=GetTemporaryDirectory()+"tmp.txt"
  ReceiveHTTPFile(url$, FileName$)
  
  code$=""
  If ReadFile(0, GetTemporaryDirectory()+"tmp.txt")  
    While Eof(0) = 0           ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File') 
      code$=code$+ReadString(0)      ; Affiche ligne par ligne le contenu du fichier
    Wend
    CloseFile(0)
  EndIf
  
  s.l=FindString(code$,"Your random name is:",0)
  s.l=FindString(code$,"<a href=",s)
  Repeat
    s=s+1
  Until Mid(code$,s,1)=">"
  e=s
  Repeat
    e=e+1
  Until Mid(code$,e,1)="<"
  person(z)\firstname=Mid(code$,s+1,e-s-1)
  If firstnameOnly=#False
    s=e
    s.l=FindString(code$,"<a href=",s)
    Repeat
      s=s+1
    Until Mid(code$,s,1)=">"
    e=s
    Repeat
      e=e+1
    Until Mid(code$,e,1)="<"
    person(z)\name=Mid(code$,s+1,e-s-1)
  EndIf
EndProcedure

Procedure addperson(birthday.i,deathday.i,father.i=-1,mother.i=-1)
  ;We add a new person in array
  size=ArraySize(person())+1
  ReDim person.person(size)
  n=size-1
  person(n)\father=father
  person(n)\mother=mother
  If mother=-1
    person(n)\birthday=birthday
  Else
    person(n)\birthday=person(mother)\weddingday
  EndIf
  person(n)\deathday=deathday
  person(n)\sex=Random(1) ; 0 = Male and 1 = Femmel 
  person(n)\married=-1
  If mother>-1
    NewName(n,#True)
    If father>-1
      person(n)\name=person(father)\name
    Else
      person(n)\name=person(mother)\name
    EndIf
  Else
    NewName(n,#False)
    
  EndIf
  Debug Str(n)+" "+person(n)\firstname+" "+person(n)\name
EndProcedure

Procedure Live(number.l,*populate.populate)
  fromPerson=ArraySize(person())
  toPerson=fromperson+number
  For z=0 To toPerson
    age.l=Random(*populate\ageMax,*populate\ageMin)
    birthday.i=*populate\currentDate-age
    deathday.i=birthday+Random(70,age)
    addperson(birthday,deathday)
    
  Next
  
  For z=0 To toPerson
    sex.b=person(z)\sex
    If person(z)\married=-1 And person(z)\sex=0
      For w=0 To toPerson
        If person(w)\married=-1 And person(w)\sex=1 And                                                          ;If a man and not married
           person(w)\birthday>=person(z)\birthday-5 And person(w)\birthday<=person(z)\birthday And              ;if man and woman have the same age (5 year)
           ((person(w)\mother<>person(z)\mother And person(w)\father<>person(z)\father) Or person(z)\mother=-1) ;must 
          
          weddingday=person(w)\birthday+Random(45,16)
          If person(w)\deathday>weddingday And person(z)\deathday>weddingday
            person(n)\weddingday=weddingday
            person(z)\married=w
            person(w)\married=z
            Debug Str(person(z)\married)+" with "+Str(person(w)\married)
            person(w)\birthName=person(w)\name
            person(w)\name=person(z)\name
            nbChildren=Random(5,0)
            year=0
            Debug "child from "+person(z)\firstname+" "+person(z)\name+" and "+person(w)\firstname+" "+person(w)\name
            For child=1 To nbChildren
              year=year+1
              birthday=person(w)\weddingday+year
              addperson(birthday,birthday+Random(80),z,w)
            Next
          EndIf
          Break
        EndIf
      Next
    EndIf
   Next
EndProcedure

;Une première arrivée de personne
populate.populate
populate\currentDate=1750
populate\ageMin=13
populate\ageMax=50

live(20,@populate)


Re: Simulation de population

Publié : lun. 23/sept./2013 17:01
par graph100
c'est rigolo !

ce qui serai super c'est que tu conçoives bien tout ton système de manière à pouvoir créer une sorte de représentation graphique ensuite.

Re: Simulation de population

Publié : lun. 23/sept./2013 18:15
par Thyphoon
graph100 a écrit :c'est rigolo !

ce qui serai super c'est que tu conçoives bien tout ton système de manière à pouvoir créer une sorte de représentation graphique ensuite.
Le but est d'avoir une jolie interface pour éditer chaque profile, et effectivement afficher des arbres généalogiques, etc... Mais aussi editer des registres d'eglise, de mairie, des emplacements dans des cimetières etc.... tout ce qu'on peut imaginer. Ce qui permettra d'être consulter durant des soirées enquêtes ... :)

Re: Simulation de population

Publié : lun. 23/sept./2013 19:21
par G-Rom
je partirais plutôt avec se type de système :

Code : Tout sélectionner

#CPLBATOR = #BADF00D
#GOD      = #CPLBATOR

Structure person
  *mother.person
  *father.person
  List *brother.person()
  List *sister.person()
  
  ; ...
EndStructure


FirstMale.person
FirstFemale.person

FirstMale\mother = #GOD
FirstMale\father = #GOD

FirstFemale\mother = #GOD
FirstFemale\father = #GOD
Bien sur , y en a que 2 , tu peu partir sur une liste ou plusieurs listes ( différente race ? ) de population.
L'avantage, tu peu faire des arbres généalogique !
Prévois aussi le mariage du même sexe :D

Re: Simulation de population

Publié : lun. 23/sept./2013 22:21
par Ar-S
il s'agit de créer une simulation de population pour créer des soirées enquêtes.
Excellent ça.
Un gros taf en perspective.

Re: Simulation de population

Publié : mar. 24/sept./2013 10:48
par Thyphoon
G-Rom a écrit :je partirais plutôt avec se type de système :
Merci c'est une très bonne idée...mais est ce que ça ne va pas être genant si je veux utiliser une base donnée sqlite plus tard ?
Je vais faire des tests
G-Rom a écrit : tu peu partir sur une liste ou plusieurs listes ( différente race ? ) de population.
L'avantage, tu peu faire des arbres généalogique !
J'ai déjà un scénario d'une île desserte qui a été peuplé par des personnes d'origine Africaines suite au naufrage d'un bateau négrier en 1752, et qui 50 ans plus tard a été redécouvert par les anglais qui sont venu aussi s'y installer...
G-Rom a écrit :Prévois aussi le mariage du même sexe :D
Je vais essayer de prévoir un maximum de possibilité ^_^ ! Ausi les accouchements sur X, les orphelinats, etc...
Ar-S a écrit : Excellent ça.
Un gros taf en perspective.
Effectivement c'est un gros boulot, c'est pour ça que pour l'instant je reflechis a la meilleur façon de m'organisé pour qu'apres l'intégration de tout les paramètres soit le plus simple ..:P

Re: Simulation de population

Publié : mar. 24/sept./2013 11:05
par Ar-S
Quitte à bien pensé le truc, tu devrais en amont créer des "univers". Avant même homme/femme.
Sachant que pour des soirées enquêtes, on peut partir sur de la SF, du contemporain, une époque passée etc...
Selon le thème, tu retrouveras des points communs mais d'autres inédits dans tes fiches de persos.
Une des premières soirée enquête que j'ai découvert était purement SF : En effet, Dieu avait été assassiné et plusieurs personnages "fantastiques" entraient en jeu. Des anges, des anges déchus, des extraterrestres etc.. !

Re: Simulation de population

Publié : mar. 24/sept./2013 11:15
par Thyphoon
Ar-S a écrit :Quitte à bien pensé le truc, tu devrais en amont créer des "univers". Avant même homme/femme.
Sachant que pour des soirées enquêtes, on peut partir sur de la SF, du contemporain, une époque passée etc...
Selon le thème, tu retrouveras des points communs mais d'autres inédits dans tes fiches de persos.
Une des premières soirée enquête que j'ai découvert était purement SF : En effet, Dieu avait été assassiné et plusieurs personnages "fantastiques" entraient en jeu. Des anges, des anges déchus, des extraterrestres etc.. !
C'est pas bête du tout je vais étudier ça! la soirée enquête que tu as fait je crois la connaitre elle s’appelle "Dieu est mort" je crois :)

Re: Simulation de population

Publié : mar. 24/sept./2013 11:46
par Backup
heu !.. c'est quoi une soirée enquete ?? 8O

Re: Simulation de population

Publié : mar. 24/sept./2013 12:00
par falsam
Dobro a écrit :heu !.. c'est quoi une soirée enquete ?? 8O
Il n'y a pas que moi qui suis fatigué : http://fr.wikipedia.org/wiki/Soir%C3%A9e_enqu%C3%AAte

Re: Simulation de population

Publié : mar. 24/sept./2013 12:30
par Backup
ha mais , je ne connais pas du tout !! 8O
on ne peut pas tout savoir hein ... :mrgreen: (meme MOA ! :lol:)

Re: Simulation de population

Publié : sam. 28/sept./2013 14:11
par Thyphoon
Dobro a écrit :ha mais , je ne connais pas du tout !! 8O
on ne peut pas tout savoir hein ... :mrgreen: (meme MOA ! :lol:)
Salut Dobro !
si tu connais pas il faut essayer au moins une fois c'est très sympa !! :)


Bientôt une nouvelle version du code ! :D