I Accidentally Wrote A 😹Cat-Genetics 🧬 Algorithm While Following My Python Beginner Course
Instructions unclear printing kittens instead...

Search for a command to run...
Instructions unclear printing kittens instead...

This is so cool! This is a way more interesting exploration of classes
In this series I will write about my progress making a program that has a realistic cat genetics algorithm
But also running into more problems
I have been thinking about writing something down for a long time and didn't do it because I had so many thoughts about it and felt like I lacked a structure to this article but with the recent discussion about content moderation and what is appropri...

Python is a well-known and flexible programming language. It is used in many different fields, including data science, web development, and automation. Python is well-known for its ease of use and simplicity. It has a clear and concise syntax, making...

SvelteKit is a framework for building web applications of all dimensions, with a solid development experience and flexible filesystem-based routing. It compiles your components into a vanilla JavaScript that is highly optimised. So the question of wh...

It's time to be realistic about how long it can take to become good

Meet our latest project, we built the ARK Utils app using Svelte, and we learned how to combine experience, creativity and data to a useful product

Okay, hear me out. It was an accident. You probably remember how I told you to find meaningful exercises to you and I decided to learn Objects and Classes with cats instead of customer databases. So about that, it might have escalated.
As a background - I did work with cat genetics in the past. I educated people, made classes, and was a mentor to some when it came to that specific topic, and even later when I was not in that field anymore, it would stay one of my biggest interests and I could read news and studies about new mutations and new breeding developments about new colors for hours.
When I did my Objects and Classes exercise, I wondered if I could make them interact with each other. I did have Lists, Tuples, and For-Loops in my lessons before, so I knew a certain degree of interactivity was possible. I thought "Wouldn't it be fun if I had 2 cats with certain genetic traits and then I just reshuffle those into a new cat. That would be a fun exercise, right?"
I looked at how I could combine those, but I was really unsure what to look for because all in all, I am really just a beginner in this field. I JUST learned about the existence of Classes. I was a little frustrated because I was stuck and couldn't go forward. One thing I usually do then is trying to work on something else and then later come back with a fresh mind.
So instead of worrying about how to recombine the parents, I wrote a list of which traits I want the parents to have that can be inherited by the kittens. And while I was writing them down I felt bad cause my initial plan was, that each parent had one trait and the kitten would pick one of them. But this is genetically incorrect because recessive and dominant traits exist and depending on how they recombine on the kitten, certain traits show or don't. On top parents could be homozygous or heterozygous which in fact would again have an influence on the kitten. Oh no.
Each trait contains two parts. One comes from mom, one from dad. Some traits need to come from both parents to be seen (recessive) but some just need to come from one parent and as long as they are there, they will show (dominant). If an animal is homozygous it means both traits it has, are the same. It does not "hide" a recessive side. If an animal is heterozygous it means that it either has only one dominant side that makes a trait show or it has a recessive side that's inactive unless it's recombined with another of its kind on its offspring.
A simple example would be the long fur on a cat. It's recessive and that means if you mate a long-haired cat with a short-haired, all kittens would be short-haired but would have saved the information of the longhaired parent in their DNA. If you mate those with each other, you would get long- and short-haired cats because there is a chance of those hidden and inactive sides recombining.
Photo by The Lucky Neko on Unsplash
And then there are colors! Cat colors are basically kind of a Boolean. There are only 2 base cat colors. Black and Orange (red) and are saved on the X-Chromosome. Since girls have two, they can have black and red, and male cats have only one and therefore they can only have one of them at the same time.
HOW SHOULD I MAKE A CODE FOR THAT, WHAT?
I already learned that no matter how complicated the rules are, you can put them into code. It just may take a bit. If nature can follow these rules, then I can write them down. So I wrote down some pseudo code that would wrap up everything I wanted to implement.
Shorthair > Longhair
Black = Orange
Striped > Solid
F = XX, M =XY
Xb = black X-chromosome
Xr = red X-chromosome
Striped + XbXr = Torbie
Xb+Xr = Tortie
Tortie, Torbie = Female
This ruleset would not really define how traits are inherited but make it easier for me to take a cat with traits and print out it looks.
After my first evening, I came up with this.

I made a Class and defined its traits and then "created" example cats myself as I did with the previous exercise.

Following my defined rules, the code then gave me this.

Interpreting the traits of a cat and putting them out, following a ruleset is one thing. Making a simulation that would combine two cats and then realistically reshuffle genes to create new ones, was something completely different.
The next day I decided that I had to kind of start over. Especially to have the red-black problem solved. With the help of coldino who was mentoring me through the whole process, we first created a code that was similar to the kitten code before. One cat has two genetic sides from mother and father. We randomize which code a kitten will get by setting it up like this. For simplicity reasons, we treated gender as another kind of trait.
def mate(mother: Cat, father: Cat):
agouti_pair = inherit_gene((mother.mother.agouti, mother.father.agouti),
(father.mother.agouti, father.father.agouti))
longfur_pair = inherit_gene((mother.mother.long_fur, mother.father.long_fur),
(father.mother.long_fur, father.father.long_fur))
red_pair = inherit_gene((mother.mother.red, mother.father.red),
(father.mother.red, father.father.red))
sex = pick_random((Sex.X, Sex.Y))
That would then create a kitten with the randomized code that the initial function could readout and interpret.
The big magic happened when this code
for i in range(4):
kitten = mate(cat_a, cat_b)
print(kitten.phenotype)
gave us this output
['male', 'striped', 'red', 'shorthair']
['female', 'striped', 'red', 'shorthair']
['female', 'tortie', 'shorthair']
['female', 'striped', 'black', 'shorthair']
The program understood! I probably printed another 40 cats just to see if it was right. I changed the genetics of the parent-cats over and over again. It still worked and I was amazed.
I clearly surpassed my initial goal to understand how Classes and Objects work. But even better - I was hooked to push this program further - supporting more genes and having a visual output. Now I have to go back to my beginner's course, to progress with my red-line content. But this success got me so excited, that I want to learn more to do even better things.
Photo by The Lucky Neko on Unsplash