Avatar billede thb Nybegynder
23. juli 2009 - 07:25 Der er 9 kommentarer og
1 løsning

Genetik regnemaskine

Hej, jeg sidder og prøver at lave en genetik regnemaskine.

Den skal bruges på denne side: www.worldofballpythons.com

Vi har alle kongepython morpher listet i vores database, og så er det meningen at man skal kunne nogle forskellige, for en han og en hun, og så trykke "Breed". Så skal genetik regnemaskinen udskrive procent satsen for udfaldet af den valgte parring.

Morpherne i databasen er delt ind i de 3 type gener.

Jeg er nået så langt at jeg næsten kan lave en punnet square. Men at liste tingene som f.eks:
---------------------------------------------------------

Male  = Black Pastel, het. Albino, Butter 
Female = Fire 

Offspring predicted as:

---------------------------------------------------
6,25% Normal
6,25% het. Albino 
6,25% Black Pastel 
6,25% Black Pastel, het. Albino 
6,25% Butter 
6,25% het. Albino, Butter 
6,25% Black Pastel, Butter 
6,25% Black Pastel, het. Albino, Butter 
6,25% Fire 
6,25% Fire, het. Albino 
6,25% Black Pastel, Fire 
6,25% Black Pastel, Fire, het. Albino 
6,25% Fire, Butter 
6,25% Fire, het. Albino, Butter 
6,25% Black Pastel, Fire, Butter 
6,25% Black Pastel, Fire, het. Albino, Butter

-----------------------------------------------------

Kan jeg simpelthen ikke komme frem til.

Jeg bruger en multiply select, og så bearbejder jeg _POST resultatet lidt og henter de valgte morpher ud af databasen, så jeg har genet og navnet for den enkelte morph. Så har jeg prøvet ALT muligt med at loope igennem på forskellige måde, men der kommer hele tiden problemer jeg ikke kan finde ud af. Kan simpelthen ikke finde mønstret.

Håber at I forstår ellers prøv at kig her... Det er meget som jeg gerne vil lave det...

http://www.cornsnakes.nl/GenericGenWiz/MPGW.htm

Thomas
Avatar billede repox Seniormester
23. juli 2009 - 09:10 #1
Det du egentlig gerne vil have os til er at gætte på nogle matematiske udregninger som vi ingen forudsætning har for at kende?
Avatar billede mcb2001 Nybegynder
23. juli 2009 - 09:31 #2
du bliver nød til enten at ligge noget kode her - nogle formler eller i hvert fald forklare dig noget bedre...
Avatar billede mrgumble Nybegynder
23. juli 2009 - 09:56 #3
Hvordan er det lige du mener, at jeres slanger er delt i tre typer gener? Jeg syntes ikke, dit eksempel giver megen mening.

Mener du, at jeres slanger kan beskrives med tre alleler? Således at han-kønnet i dit eksempel har allelerne:
1: Black Pastel (BB)
2: hetereozygote Albino (Aa)
3: Butter (SS)
Betegnelserne i parenteserne er forkortelser; hvor intet andet er angivet formoder jeg det er homozygoter. (S = Smør)

Så har hunkønnet også tre alleler, hvor du kun har beskrevet den ene? Sådan som jeg læser det, er hunkønnen "Normal" på to af allelerne og "Fire" på den ene:
1: Fire (FF)
2: Normal (NN)
3: Normal (MM)

Vi må yderligere antage, at allelerne er fuldstændig uafhængige af hinanden, ellers kan du ikke bruge din Punnet Square. Med dine tre alleler kan du lave følgende Punnet Square:

http://gratisupload.dk/download/31669/

Da du ikke har oplyst noget om hvilke genotyper der er dominante, er det formålsløst at gætte på fænotyperne. Men ifølge udregningen her, bliver der kun to forskellige afkom.
Så enten har du misforstået din genetik, eller også holder du meget tilbage.
Avatar billede thb Nybegynder
23. juli 2009 - 16:00 #4
Hej alle,

Sorry min dårlige forklaring.
Det hele blev nok skrevet da jeg var MEGET træt og en smule irriteret over ikke at kunne få det til at virke.

Der findes 3 gener, recessiv, dominant og co-dominant. I mit eksempel har jeg brugt co-dominante ( Butter, Black Pastel, Fire ) og et het recessivt gen ( het albino ).

Jeg har lavet følgende kode:

function punnetCount ($morphs) {

for ($i = 0; $i < count($morphs); $i++) {
               
// COUNTING GENES
if ($morphs[$i]["gene"] == "codom")     ($morphs[$i]["super"] == 1) ? $super++ : $codom++;
if ($morphs[$i]["gene"] == "res")         ($morphs[$i]["het"] == 1) ? $het++ : $res++;
if ($morphs[$i]["gene"] == "dom")         $dom++;       
               
}
           
return pow(2, $codom+$dom+$het);

}

$morphs er et array som dette :

$gene     = (($row->res > 0) ? "res" : (($row->co_dom > 0) ? "codom" : "dom"));
$hets     = (($gene == "res" && (in_array("h" . $row->id, $morphs))) ? 1 : 0);

$morphs_array[] = array(
    "id" => $row->id,
    "name" => (($hets == 1) ? 'Het ' : '') . $row->name,
    "url" => $row->url,
    "gene" => $gene,
    "super" => $row->super,
    "het" => $hets,
);   

Så folk vælger i en select om $_POST["male"] bliver måske 1,2,5, så henter jeg de 3 slanger ud fra databasen og smider deres info i overstående array, og så bliver arrayet brugt til at finde ud af hvormange vertical kasser male genet skal lave i en punnet square. samme fremgangs måde med hunnen, på den måde får jeg 2 punnetCount tal som jeg kan bruge til ( 100 / $punnet_male * $punnet_female ) som giver procent satsen som i ser i linierne i mit først output eksempel.

Nu kommer jeg så til der hvor jeg går død og ikke ved kan se mønstret. jeg skal lave en formel som virker altid og som udskriver linierne som overstående:

% normal
% het albino
% het albino butter
% butter
% butter black pastel
osv....

Håber at det var en bedre forklaring...
Nu har jeg da fået noget søvn...

Thomas
Avatar billede thb Nybegynder
23. juli 2009 - 19:48 #5
Er det til at forstå nu ?
Avatar billede mrgumble Nybegynder
23. juli 2009 - 20:50 #6
Hej

Jeg syntes lige vi skal have styr på termene før vi prøver at forklare tingene her.
Udtrykket "Gen" kommer af "Genotype" og beskriver allelernes sammensætning på et loci. Som eksempel kan nævnes blodtype; det er ét gen der bestemmer ens blodtype og det findes på ét loci. For andre ting, kan genet bestå af flere locus. Allelerne er så A, B og O, men da vi mennesker er diploide, dvs. har to af hver chromosom (undtagen kønchromosomer) har vi altså mulighed for at have genotyperne AA, AB, BB, Ao, Bo eller oo. At man så er blodtype A, B, AB eller O kaldes fænotypen; dvs. det træk der reelt udtrykkes i individet. Er man AA, BB eller OO er man homozygot; AB, Ao eller Ao kaldes heterozygot.
Hvert gen svarer derfor groft sagt til et kendingstræk. Et gen er altså ikke dominant eller recessiv, det er allelen derimod. A og B er co-dominante mens O er recessiv.
En Punnet Square anvendes ikke på gener, men på allelerne. En Punnet Square på to homozygoter på ét gen er altså ganske trivielt, mens parringen på to heterozygoter på to gener bliver noget sjovere.

Med det på plads, kan vi kigge på dine slanger. Dine slanger kan altså beskrives med en række træk; Albino, Butter, Black Pastel, Fire. Din opgave er så, at finde ud af, hvad sandsynligheden for hvilken genotype, afkommet af parringen af to slanger har.
Spørgsmålet er så, om du mener at enten har slangen genet Albino eller ej, genet Butter eller ej, genet Black Pastel eller ej og genet Fire eller ej; eller om slangen har fænotypen Butter, Black Pastel, Albino eller Fire (eller ej).
Jeg tror, at du kigger på ét gen hos slangerne, som kan bestå af kombinationen af to af følgende alleler: Butter (S), Black Pastel (B), Fire (F) eller Albino (o). Jeg antager at slanger er diploide. Dvs. du har følgende genotyper at vælge mellem:
- SS SB SF So
- BS BB BF Bo
- FS FB FF Fo
- oS oB oF oo

I denne model kan du altså ikke have en genotype som Black Paste-Fire-Albino; det kræver fire forskellige loci, ét for hver gen som så kan enten være tændt eller slukket (eller 3, hvis Albino er alle tre slukket). Det vil tilgengæld give følgende genotyper:
- SBFo
- SBF-
- SB-o
- S-Fo
- -BFo
- SB--
- S--o
- --Fo
- S---
- -B--
- --F-
- ---o
- ----

Måden du regner afkommets fordeling på, afhænger altså hvilken model vi kigger på. Dog afhænger begge modeller, at genotyperne er fuldstændige uafhængige, ellers kan du kun se hvilke afkom der er mulige. Er det sidstnævnte, kan det løses med simpel, binær kombinatorik.

/Stefan
Avatar billede thb Nybegynder
23. juli 2009 - 21:18 #7
Uha, du snakker med mange ord jeg ikke forstår... :)
Jeg er ikke så meget inde i det med gener.

Jeg ved hvordan co-dom x co-dom parring virker osv... men ikke hvorfor :)

http://www.worldofballpythons.com/files/genwiz.jpg

Håber at billedet giver lidt mere mening omkring hvad jeg vil ...
Avatar billede mrgumble Nybegynder
24. juli 2009 - 08:06 #8
Jeg vil sige, at hvis du ikke forstår det her med gener, skal du holde dig fra at lave genetik. :-)
Jeg kan også se, at du har lavet en anden tråd. Hvis du venter en time eller to, skal jeg forklare hvad der evt. er galt med programmet samt en let måde at lave dine Punnet Squares. Jeg kan i øvrigt oplyse dig om, at i dit eksempel er alle generne heterozygoter, men i min løsning behøver du ikke tage højde for det.
Jeg vender tilbage snarest muligt.
Avatar billede mrgumble Nybegynder
24. juli 2009 - 10:07 #9
Så har jeg været på spil og kan præsentere en komplet Punnet Square der virker på krydsning mellem to individer, blot de har samme antal locus.
Du finder koden her: http://pastebin.com/m2932f64c

Koden er lavet med dit eksempel, dvs. krysning mellem
Male  = Black Pastel, het. Albino, Butter
Female = Fire

Disse gener ligger altså på hver sit loci og ud fra programmet du henviste til, fandt jeg allel-sammensætningen. Det er så den der er anvendt i koden:
$male = Array('+a','+i','+j','++'); // map gender with loci
$female = Array('++','++','++','+o');

Det eneste du skal være opmærksom på, er at rækkefølgen af loci er ens i begge individer.

Outputtet bliver i dette tilfælde:
Array
(
    [++++++++] => 16
    [+++++++o] => 16
    [++++j+++] => 16
    [++++j++o] => 16
    [++i+++++] => 16
    [++i++++o] => 16
    [++i+j+++] => 16
    [++i+j++o] => 16
    [a+++++++] => 16
    [a++++++o] => 16
    [a+++j+++] => 16
    [a+++j++o] => 16
    [a+i+++++] => 16
    [a+i++++o] => 16
    [a+i+j+++] => 16
    [a+i+j++o] => 16
)

Der hvor jeg troede at programmet tog fejl, var dens visning af Punnet Squaren; den er rigtig nok, men bare ikke pædagogisk.
Min kode er lidt mere pædagogisk, men til gengæld er den nok ikke for optimal. Med denne opbygning, behøver du heller ikke længere tage hensyn til, om et allel er hetereozygot eller homozygot; bare input tingene på samme måde som i programmet (dvs. hhv. '+a+i+í++' og '+++++++o').
Før du kan efterbehandles outputtet fra koden, skal du dog lige gå arrayet igennem og samle nogle af posterne.
I et eksempel med '+aíí' og '+a++' er de to midterste resultater reelt ens:
Array(
    [++í+] => 4
    [+aí+] => 4
    [a+í+] => 4
    [aaí+] => 4
)
Avatar billede thb Nybegynder
24. juli 2009 - 14:36 #10
Hej mrgumble,

Det ser meget cool ud... Jeg får dog noget php brok over linien $res[$s] += 1; men det er jo det mindste problem.

Jeg har kigget på det med at lave det som dig, men gik væk fra planen igen da det så krævede at jeg skal igennem alle mine rækker af morpher i databasen og give dem bokstaver, og jeg synes at det gav lidt problemer det med når man kom ud over a-z.

Jeg har næsten lavet hele koden i nat, mangler dog udregningerne for f.eks. hannens kombinationer udfra hans gener. Altså den vertikale side i min punnetsquare.

Jeg har gjort det sådan at jeg looper igennem hannen og hunnen og laver punnetsquaren ud fra diverse regler jeg har lavet. Når jeg møder et resultat så smider jeg det i $this->results, og når funktionen er kørt kan jeg lige loop igennem $this->results printe resultatet.

Det var også derfor jeg oprettet et nyt spørgsmål kun med de manglende udregninger.

Thomas
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester