Bonjour à tous,
Je débute sous windev, avec la version Express. Ma base de Donées est en HyperFile Classic ( en gros , c'est un SGBD // SQL )
Mon objectif est de développer un petit soft pour gérer les différents moutons (ou autres bestioles) entre voisins, l'idée maitresse étant de maitriser la consanguinité et la sélection de caractère.
Tout se passe relativement bien, mais je coince sur l'algorithme de calcul de consanguinité...
J'ai trouvé l'algorithme ICI. Mes maths sont un peu loin mais je comprends à peu près. Reste à le traduire en langage WD. Ma base de donnée est en HyperFileSQL Classic, la table d'enregistrement T des individus est de la forme Clé ID - Nom - Clé ID du père - Clé ID de la mère, ces deux dernières clés étant vides si inconnues.
Le principe de l'algorithme est de construire d'abord l'arbre d'ascendance d'un individu, en remplaçant les parents successifs par un 0 si mâle et un 1 si femelle. On obtient alors un tableau d'ascendance avec des "mots" binaires représentant les "chemins". Si un ancêtre a plus de un mot, c'est un ancêtre commun aux parents direct d'où consanguinité.
Pour simplifier le calcul, je pense à rajouter une colonne à T contenant un tableau, construit au fur et à mesure de l'entrée de nouveaux moutons, dont l’élément de base serait {Clé père, chemin mot binaire},{clé mère, chemin mot binaire}, chaque chemin s'ajoutant en préfixe à celui des parents successifs. La première génération étant "orpheline", les tableaux correspondants seront vides.
Exemple avec E, fils de D(0) et C(1); C fille de A(0) et B(1)
Initialement, on aurait
Clé 1 - A - ¤ - ¤ - {¤,¤}
Clé 2 - B - ¤ - ¤ - {¤,¤}
Puis à la naissance de C et à l'achat de D,
Clé 3 - C - 1 - 2 - {1,0}{2,1}
Clé 4 - D - ¤ - ¤ - {¤,¤}
Puis à la naissance de E
Clé 5 - E - 4 - 3 - {4,0}{3,1}{1,10}{2,11} (10 et 11 sont les chemins allant de E à A et B)
Si F né de E et B, on aura
Clé 6 - F - 5 - 2 - {5,0}{4,00}{3,01}{1,010}{2,011}{2,1}
Ce qui donne visuellement comme tableau d'ascendance pour F, avec B ancêtre commun:
A 010 B 011,0 C 01 D 00 E 0 F
Premier problème: comment coder le rajout du nouveau chemin en préfixe lors de la naissance
Deuxième problème: il faut éviter les doublons, c'est à dire que lorsqu'un individu parent a déjà été relevé dans l'ascendance, il ne faut pas continuer à rajouter le nouveau chemin aux ancêtre de cet individu sinon, tous les ancêtres de cet individu vont être augmentés alors que le calcul de la consanguinité doit s’arrêter à cet individu.
Bref, si vous avez une piste, je suis preneur.
Ceci est pour la création de l'ascendance. Il restera ensuite à extraire les ancêtres communs puis à calculer la consanguinité. L'algorithme complet, avec un arbre plus fourni et des explications surement moins obscures, est dans le doc en lien plus haut.
Merci pour l'aide!
Partager