JeuWeb - Crée ton jeu par navigateur
Conception d'un code génétique virtuel - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Gameplay, gamedesign (https://jeuweb.org/forumdisplay.php?fid=48)
+--- Sujet : Conception d'un code génétique virtuel (/showthread.php?tid=5693)



Conception d'un code génétique virtuel - madmax52 - 15-09-2011

Bonjour à tous, je suis en train de chercher comment crée mon système de code génétique pour mon futur jeu. Je tiens la base il me semble, mais je ne sais pas si je me trompe pas quelques part.... J'ai un doute... Le principe est basé sur des variables qui correspondront à une adresse de couche d'image. Les différentes couches constituera l'apparence du perso ici le poisson.

A la place d'encombré le forum, Je vous laisse l'adresse de la page concerné.


Si vous avez des idées ou une réflexion, n’hésiter pas la critique est toujours positive pour moi. Je ne savais pas bien ou poster alors si un admin veut déplacer le sujet, pas de soucis.


RE: Conception d'un code génétique virtuel - Ter Rowan - 15-09-2011

ca peut le faire, ton explication n'est pas très claire cependant, et il m'a fallu réfléchir à ce que tu voulais exprimer pour bien tout suivre (en fait comme tu ne signales pas dans les "gênes" si ca vient du père ou de la mère c'est un peu compliqué) Par contre le modèle est très simple et ne rend pas l'aspect "transmission génétique"

pour moi ton système se résume à :

un liste de caractéristiques par individu (tous les individus ont toutes les caractéristiques, mais avec des valeurs différentes)

une liste de valeurs possibles par caractéristiques (soit une liste de couleur, soit pour le sexe, 'M' et 'F')

et pour " l'héritier "la valeur d'une caractéristique est tirée aléatoirement parmi la valeur du père et de la mère, avec une petite chance de réaliser un deuxième tirage aléatoire parmi la liste des valeurs possibles pour la caractéristique (ce qui simulerait la mutation)


tu peux aller un peu plus loin pour être plus "génétique"

chaque individu possède trois valeurs de caractéristiques :

Celle de son père
Celle de sa mère
Celle qui est perçue (affiché à l'écran)

Pour calculer la caractéristique perçue tu peux :
soit définir une priorité stricte entre les valeurs (genre blond + brun = brun) soit donner des poids et calculer des probabilités : genre blond (3) + brun (17) ==> 15% de chance d'obtenir un blond, 85% d'obtenir un brun


lors de la reproduction de deux individus, pour chaque caractéristique, pour chacun des deux individus, tu tires au hasard entre la caractéristique de son père et de sa mère ce qui donnera la contribution de l'individu au matériel

exemple :

carpe 1 (masculin) :
couleur du père rouge
couleur de la mère bleu
couleur perçue bleu
taille du père petit
taille de la mère grand
taille perçue grand

carpe 2 (féminin) :
couleur du père rouge
couleur de la mère jaune
couleur perçue jaune
taille du père grand
taille de la mère grand
taille perçue grand

tu reproduis carpe 1 et carpe 2

alors carpe issue de 1+2
couleur du père 1 (hasard entre rouge et bleu ==>) rouge
couleur de la mère 2 (hasard entre rouge et jaune ==>) rouge
==> calcul entre rouge et rouge ==> couleur perçue de 1+2 rouge
taille du père 1 (hasard entre petit et petit ==>) petit
taille de la mère 2 (hasard entre grand et grand ==>) grand
==> calcul entre petit et grand ==> grand ?

et voilà, grâce à la génétique tu arrives à générer une grande carpe rouge alors que les deux parents sont l'un bleu et l'autre jaune

ce qui est statistiquement possible (25%)

bien sûr je suis dans les cas de transmission génétique "simple" (pour l'homme c'est plus compliqué ^^ )


RE: Conception d'un code génétique virtuel - madmax52 - 15-09-2011

Tu as bien compris les grandes lignes. C'est assez dur à expliqué en faite, surtout quand tu as 13 facteurs.

Justement j'ai mis les facteurs génération et évolution pour avoir un deux facteurs nouveau.

Génération reprendra un facteur des anciennes génération.
Évolution lui donne tire aux hasard un nouveau facteur dans 5% des cas.

Le but est justement de perturbé le code. Je pense que mon système est plus simple pour le même résultat si j'ai bien compris.


RE: Conception d'un code génétique virtuel - niahoo - 15-09-2011

Pour simplifier l'algorythme je reprendrais un modèle réel simplifié (une seule paire de chromosomes avec tous les gènes)

(je ne fais que résumer ce qui a été dit d'une façon plus claire à mon sens)
Petit rappel pour ceux qui suivent et qui ne connaitraient pas : chaque parent donne au hasard un seul de ses deux chromosomes.
Donc, pour chaque carpe je stockerais deux chromosomes, un tiré au sort de chaque parent. et ensuite je stockerais également le résultat de cette combinaison comme résultat, en choisissant aléatoirement quand on a un allèle récéssif des deux parents.

Blond + brun c'est toujours brun car on a des allèles récessifs et des dominants, pour d'autres gènes c'est plus compliqué mais je pense que tu peux réaliser un modèle, il doit y avoir de la doc là dessus sur internet.
Pour le sexe je n'y connais rien mais chez les humains il me semble que la femme a deux chromosomes Y et l'homme 1X et 1Y

Donc la détermination du sexe se fait aléatoirement en fonction du chromosome passé par le mâle.


RE: Conception d'un code génétique virtuel - niahoo - 15-09-2011

Voici un prototype simplifié, sans gérer le sexe (qu'on peut choisir simplement grâce à du rand(1,2) en php - sauf si c'est comme les poules chez qui la température de couvaison détermine le sexe – à vérifier Smile) ; sans gérer l'évolution non plus, que j'aurais mise en surcouche une fois mon algo fini.

Je l'ai fait en php mais c'est 100 fois plus marrant en erlang !
<?php

class genome_koi {

const recessive = 1;
const dominant = 2;

/* schéma des données,
* on peut le modéliser dans une base de données facilement
*/
static public function genes () {
return array(
'CF' => array(
'name' => 'Couleur de fond',
'alleles' => array(
// nom => type, valeur, chance contre un autre du même type
'CF1' => array(self::recessive, 'red', 50),
'CF2' => array(self::recessive, 'white', 50),
'CF3' => array(self::dominant, 'black', 100),
'CF4' => array(self::dominant, 'gold', 0)

),
'evolution_chances_percent' => 2,
'evolution_directions' => array(
'CF3' => 'CF2',
'CF1' => 'CF4'
)
),
'CP' => array(
'name' => 'Couleur principale',
'alleles' => array(
// nom => type, valeur, chance contre un autre du même type
'CP1' => array(self::recessive, 'red', 50),
'CP2' => array(self::recessive, 'white', 50),
'CP3' => array(self::dominant, 'black', 100)
)
),
'T1V' => array(
'name' => 'Tache 1 visible',
'alleles' => array(
// nom => type, valeur, chance contre un autre du même type
'T1Vt' => array(self::recessive, true, 100),
'T1Vf' => array(self::dominant, false, 100)
)
),
'T1C' => array(
'name' => 'Tache 1 couleur',
'alleles' => array(
// nom => type, valeur, chance contre un autre du même type
'T1C1' => array(self::recessive, 'red', 50),
'T1C2' => array(self::recessive, 'white', 50),
'T1C3' => array(self::dominant, 'black', 100)
)
)
);

}

static function create_child($c1, $c2) { // chromosome 1, chromosome 2
/* Ici on va déterminer un enfant grâce aux deux
* chromosomes
*/
$genes = self::genes();
$genes_names = array_keys(self::genes());
$child_genes = array();
foreach ($genes_names as $name) {
list($type1, $value1, $chances1) = $genes[$name]['alleles'][$c1[$name]];
list($type2, $value2, $chances2) = $genes[$name]['alleles'][$c2[$name]];
if ($type1 > $type2) // chromosome 1 a un allele dominant, c2 récessif
$child_genes[$name] = $c1[$name];
elseif ($type2 > $type1) // l'inverse
$child_genes[$name] = $c2[$name];
else { // if type 1 == type 2
/* ici on en tire un au hasard en fonction de leurs chances */
$child_genes[$name] = ${'c'.self::random_allele($chances1, $chances2)}[$name];
}
}
return $child_genes;
}

static function random_allele($chances1, $chances2) {
$chances2 += $chances1;
$r = rand(1,$chances2);
return ($r > $chances1) ? 2 : 1;
}


}

function chromosome_exemple_1() {
return array(
'CF' => 'CF1',
'CP' => 'CP2',
'T1V' => 'T1Vt',
'T1C' => 'T1C3'
);

}

function chromosome_exemple_2() {
return array(
'CF' => 'CF2',
'CP' => 'CP3',
'T1V' => 'T1Vf',
'T1C' => 'T1C1'
);

}
var_dump(genome_koi::create_child(chromosome_exemple_1(),chromosome_exemple_2()));


Le modèle de données est bien sur discutable, on pourrait bosser sur des int au lieu de strings, mais là c'est plus lisible