Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » Simulateur d'écosystème
Positon Hors ligne Rédacteur Points: 2396 Défis: 57 Message

Simulateur d'écosystème

Posté le 07/05/2014 21:54

J'expose ici un projet sur lequel je m'arrache les cheveux planche depuis plusieurs semaines déjà : un add-in capable de simuler un écosystème, sous forme des sprites simples pour avoir une vue globale. 8)
Le panel d'éléments est très succinct, il y aura des petites plantes, des arbres, des herbivores et des carnivores. Il seront capables d'interagir entre eux en se courant après, en se bouffant et en se reproduisant.

La particularité de ce simulateur résidera dans l'introduction de l'évolution. Par exemple, si une population importante d'herbivores devient trop résistante, alors vous pourrez peut-être observer que certains carnivores arrivent à manger en adoptant un comportement charognard (et ce de façon indirecte, c'est-à-dire que le programme sera prévu pour que des mutations apparaissent, mais le fait que ces mutations se répandent si elles sont favorables ne sera dû qu'aux lois de la sélection naturelle).
Bon, j'espère que je ne vous ai pas déjà paumé, de toute façon les explications précédentes sont plus de l'ordre du détail technique (heureusement parce que sinon je n'aurai pas beaucoup de téléchargements ).

Bien sûr, pour que cet add-in reste ludique, l'utilisateur pourra agir à sa guise sur l'écosystème (je ne sais pas encore comment). Au final, ce ne sera pas vraiment un jeu mais plutôt une espèce de "bac à sable".


Pour l'anecdote, l'idée m'est venue en lisant un article de Science & vie sur la définition de la vie, qui abordait des éléments (chimiques, informatiques, physiques...) troublants, car très semblables à des formes de vie. Et ce qui a attiré mon attention est un programme (dont le nom m'échappe) d'un chercheur (dont le nom m'échappe aussi ) qui affichait des formes très simples, mais capables d'évoluer et de se parasiter entre elles.
Bref, ça m'avait plutôt fasciné, notamment le fait que le programme aboutit à des résultats non prévus car découlant du développement de l'I.A., et ça m'a donnait envie de faire pareil.
L'idée a germé et a aboutit à ce projet d’écosystème



Voilà, j'aurai préféré vous exposer ce projet plus tard car j'aurais bien aimé que vous ayez une démo digne de ce nom, mais il se trouve que je planche sur les I.A. et que j'ai actuellement un problème tenace que je ne parvient pas à résoudre moi-même
cf premier post



Lephenixnoir En ligne Administrateur Points: 24699 Défis: 170 Message

Citer : Posté le 08/05/2014 11:07 | #


Et surtout, je ne vois pas pourquoi tu ne réorganises pas ta boucle de traitement pour que l'element mort soit détruit avant le tour suivant.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Positon Hors ligne Rédacteur Points: 2396 Défis: 57 Message

Citer : Posté le 08/05/2014 11:10 | #


Parce qu'un animal mort reste utile en tant que bidoche avant de disparaître
Lephenixnoir En ligne Administrateur Points: 24699 Défis: 170 Message

Citer : Posté le 08/05/2014 11:11 | #


Oui, enfin inexistant, inutile, tu m'as compris !
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Positon Hors ligne Rédacteur Points: 2396 Défis: 57 Message

Citer : Posté le 08/05/2014 11:19 | #


Si tu parles des êtres inexistants, ils sont bel et biens supprimés un tour après leur disparition (le temps que la boucle gère chacun des prédateurs).
En considérant que par un "tour", tu désignes une itération de la boucle principale, n'est-ce pas ?
Lephenixnoir En ligne Administrateur Points: 24699 Défis: 170 Message

Citer : Posté le 08/05/2014 11:21 | #


Oui. Il faudrait les supprimer avant de passer à l'itération suivante, ce serait bien plus propre.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Positon Hors ligne Rédacteur Points: 2396 Défis: 57 Message

Citer : Posté le 08/05/2014 11:34 | #


Mais non, justement
Si je les supprime, les prédateurs pointeront sur rien du tout.
Lephenixnoir En ligne Administrateur Points: 24699 Défis: 170 Message

Citer : Posté le 08/05/2014 11:35 | #


Justement, il faut réorganiser la boucle pour modifier la cible des prédateurs avant de supprimer l'élément.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Positon Hors ligne Rédacteur Points: 2396 Défis: 57 Message

Citer : Posté le 08/05/2014 12:12 | #


Mais c'est le cas
Pour que ce soit clair, voici comment ça se déroule, dans l'ordre :
Lorsque l'être disparaît, son état prend pour valeur INEXISTANT
En conséquence, les prédateurs initialisent leur cible à NULL lorsque vient leur tour
Lorsque la boucle revient à l'être, il est supprimé
Lephenixnoir En ligne Administrateur Points: 24699 Défis: 170 Message

Citer : Posté le 08/05/2014 12:14 | #


Oui, mais il faut que tout ça se passe durant la même itération, ce qui n'est pas le cas.
En clair à la fin de chaque itération, il ne devrait plus y avoir le moindre élément à la valeur INEXISTANT.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Positon Hors ligne Rédacteur Points: 2396 Défis: 57 Message

Citer : Posté le 08/05/2014 12:19 | #


J'aimerais bien, mais je ne peux pas
Si la boucle principale est passée par un prédateur avant de s'occuper de la cible, il faudra bien effectuer une itération supplémentaire. Et d'ailleurs, où est le problème dans la méthode actuelle ?
Lephenixnoir En ligne Administrateur Points: 24699 Défis: 170 Message

Citer : Posté le 08/05/2014 12:21 | #


Le problème, c'est que l'on a d'un itération sur l'autre des éléments à moitié existants.
D'ailleurs, il me semble que ton problème vient bien de ces histoires de prédateurs, non ? D'où l'intérêt de simplifier le code.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Alex_1186 Hors ligne Membre Points: 1215 Défis: 46 Message

Citer : Posté le 08/05/2014 15:17 | #


Je n'ai pas lu les commentaires, mais ton projet est hyper intéressant!
C'est une sorte d'automate cellulaire en fait? (cf Le jeu de la vie...)

En tout cas je suis ça de près!
Projets que je soutiens
Projets que je soutiens
Robscape 2 de Ray
Les tests vidéo de Marmotti
Mes projets
Mes projets
Une dizaine de projets top secrets...

Timeless Remix Airwolf
"And the dream will never die..."
Lephenixnoir En ligne Administrateur Points: 24699 Défis: 170 Message

Citer : Posté le 08/05/2014 15:27 | #


Le jeu de la vie, ça doit être très simple à faire, non ?
Et très intéressant également car du même ordre que ce simulateur d'écosystème, quoique bien plus abstrait.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Dark storm En ligne Labélisateur Points: 11641 Défis: 176 Message

Citer : Posté le 08/05/2014 16:51 | #


Le jeu de la vie a été un de mes premiers programmes, donc oui, c'est simple à faire
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Positon Hors ligne Rédacteur Points: 2396 Défis: 57 Message

Citer : Posté le 08/05/2014 16:56 | #


@Alex_1186 : Non, ça n'a rien à voir avec le jeu de la vie, regarde l'anecdote que j'ai mis dans le post principal

Sinon, si je reviens au programme :
Lephenixnoir a écrit :
Le problème, c'est que l'on a d'un itération sur l'autre des éléments à moitié existants.

Et alors ? Chaque être a une durée de vie de plusieurs milliers d'itérations, plus le temps de décomposition. Où est le problème si je décide d'en ajouter une seule pendant laquelle l'âme de l'animal flotte dans le monde des mortels ?
Moi je trouve ça négligeable...
Lephenixnoir En ligne Administrateur Points: 24699 Défis: 170 Message

Citer : Posté le 08/05/2014 17:07 | #


Tu trouves peut-être ça négligeable, mais des demis-êtres flottants qui sont pointés par d'autres demis-êtres flottants à la fin du tour, ça peut créer des bugs.
C'est ce que j'essaie de t'expliquer : lorsque tu cherches à débugger, souvent c'est une histoire de réorganisation du code, et au final les erreurs soit disparaissent, soit sont plus visibles, car le code en est toujours amélioré.

Après c'est la solution que je te propose, libre à toi si tu le souhaites de chercher cette erreur autrement.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Alex_1186 Hors ligne Membre Points: 1215 Défis: 46 Message

Citer : Posté le 08/05/2014 17:08 | #


Bah justement ça me fait grandement penser au Jeu de la vie!
Projets que je soutiens
Projets que je soutiens
Robscape 2 de Ray
Les tests vidéo de Marmotti
Mes projets
Mes projets
Une dizaine de projets top secrets...

Timeless Remix Airwolf
"And the dream will never die..."
Positon Hors ligne Rédacteur Points: 2396 Défis: 57 Message

Citer : Posté le 08/05/2014 17:15 | #


Lephenixnoir a écrit :
Tu trouves peut-être ça négligeable, mais des demis-êtres flottants qui sont pointés par d'autres demis-êtres flottants à la fin du tour, ça peut créer des bugs.

Et tu ne crois pas que, plutôt que de se casser la tête à tout faire en une seule itération, quitte à complexifier l'algorithme, il serait plus simple d'initialiser le pointeur de chaque être lors de sa mort

Sinon, je pense que je vais employer les grands moyens : je vais inonder ma boucle de breakpoints pour localiser l'erreur.
C'est chiant mais je n'ai plus que ça à faire...
Lephenixnoir En ligne Administrateur Points: 24699 Défis: 170 Message

Citer : Posté le 08/05/2014 17:30 | #


Mais non !
Si tu veux éviter les problèmes de pointeurs qui surgissent lorsqu'un élément disparaît, tu t'arranges pour éviter que les éléments inexistants restent jusqu'à la fin de l'itération.
C'est-à-dire que dans ta boucle, tu fais le test qui aboutit à une inexistence avant celui qui remet les cibles à NULL. Il suffit d'échanger deux blocs, et tu es tranquille entre tes itérations.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Positon Hors ligne Rédacteur Points: 2396 Défis: 57 Message

Citer : Posté le 08/05/2014 17:41 | #


Mais...
INEXISTANT en majuscules est un etat, ça ne veut pas dire que la structure est supprimée, au contraire.

Lephenixnoir a écrit :
C'est-à-dire que dans ta boucle, tu fais le test qui aboutit à une inexistence avant celui qui remet les cibles à NULL. Il suffit d'échanger deux blocs, et tu es tranquille entre tes itérations.

Non c'est l'inverse. Et puis ça ne change rien ! Le premier concerne l'être et le second sa cible. Donc même si j'inverse les deux, il faudra forcément que la boucle s'occupe des prédateurs pour le second test.
Lephenixnoir En ligne Administrateur Points: 24699 Défis: 170 Message

Citer : Posté le 08/05/2014 18:02 | #


On ne va pas s'énerver, cela ne servira à rien.
Tu as dit que les erreurs venaient de pointeurs de cibles qui prenaient des valeurs farfelues. J'ai remarqué que les éléments dont l'état est INEXISTANT continuent d'avoir des prédateurs, et c'est d'ailleurs la raison d'être de cet état (si je ne m'abuse).
Or donc, pour pouvoir trouver la provenance des erreurs quelles qu'elles soient, il est infiniment plus facile de commencer chaque itération par une configuration complètement "stable", "valide" où aucun élément n'est à ce stade temporaire. Et ton programme ne fonctionne pas de cette manière, il effectue les opérations comme suit.
[b]Si[/b] les cibles sont nulles
    [b]Alors[/b] on modifie la valeur des pointeurs
[b]FinSi[/b]

[b]Si[/b] [i]condition[/i]
    [b]Alors[/b] l'element prend l'etat INEXISTANT
[b]FinSi[/b]

Schéma simplifié. Or ce code a un inconvénient car, à la fin de l'itération, les éléments dont l'état est INEXISTANT n'ont pas été supprimés, ce qui a des incidences sur l'itération suivante.

Je te propose de modifier ta boucle pour qu'elle fasse l'inverse.
[b]Si[/b] [i]condition[/i]
    [b]Alors[/b] l'element prend l'etat INEXISTANT
[b]FinSi[/b]

[b]Si[/b] les cibles sont nulles
    [b]Alors[/b] on modifie la valeur des pointeurs
[b]FinSi[/b]

[b]Si[/b] un element est INEXISTANT
    [b]Alors[/b] on le supprime
[b]FinSi[/b]

Ici, chaque itération est indépendante de la précédente et n'a aucune incidence sur la suivante. L'avantage de cette configuration est qu'elle simplifie largement la compréhension du programme, son édition et la recherche des erreurs.

Ce genre de simplification de la structure du programme a, de plus, tendance à résoudre d'elle-même les bugs.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 78 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd