Flaws in auto-evo system

Yep, this is correct. Here’s the code for how AI mutations work:

1 Like

I think Rathalos has the good idea on how it should work. It’s a much bigger leap to create an endosymbiote (like a mitochondrion or chloroplast) than to get more. So, yeah, apply that to the player and to the auto-evo.

1 Like

I think life belonging to different scales shouldn’t interact with each other. If you are a microscopic plankton and a whale engulfs some water that happens to contain you, then it would be a random game over. There is no defense mechanism against that. Similarly, a whale can’t see the plancton that it eats.

When you get to a large size, the smaller microbes should start to look like a “food cloud” that contains glucose, phosphate and ammonia in the right amounts. And when you are small, cells that are too large shouldn’t appear on the screen. There should be niches for small microbes and niches for large microbes. If predator is too succesful and threatening your extinction, becoming smaller or larger should be a strategy that can be pursued.

If competition for the other niches is too harsh, the game may force you to a local maxima niche that you can’t exit. And then you may go exctinct anyway if that niche becomes obsolete. But the players species has the highest probability of not falling to such a trap. Especially if the player knows about biology or played the game before. For example, when the first signs of oxygen appear, the player can add as much oxygen resistance as he can to survive the anaerobe exctinction. I don’t think there is anything to turn off. In the ideal case, auto evo should declare a species exctinct regardless of whether it is a player or not. Fitness shouldn’t be measured in a way that favors the player unless something is turned of, or favor different metrics for the player and other species.

3 Likes

I agree, so the question would be how to implement this in the current auto-evo system. After skimming the code that hh linked, I see 2 places in the code where there would be possible solutions for how to implement this.

Line 280
if (random.Next(0.0f, 1.0f) < Constants.MUTATION_NEW_ORGANELLE_CHANCE)
                {
                    AddNewOrganelle(mutatedOrganelles, GetRandomOrganelle(isBacteria, lawkOnly), workMemory1,
                        workMemory2);
                }
                else
                {
                    // Duplicate an existing organelle, but only if there are any organelles where that is legal
                    var organellesThatCanBeDuplicated =
                        parentOrganelles.Organelles.Where(o => !o.Definition.Unique).ToList();
                    if (organellesThatCanBeDuplicated.Any())
                    {
                        AddNewOrganelle(mutatedOrganelles,
                            organellesThatCanBeDuplicated.Random(random).Definition, workMemory1, workMemory2);
                    }
                    else
                    {
                        AddNewOrganelle(mutatedOrganelles, GetRandomOrganelle(isBacteria, lawkOnly), workMemory1,
                            workMemory2);
                    }
                }

Over on line 280, it appears there is a chance for a new organelle, after a chance to see if there will be a mutation. I don’t know what this chance is, but if it fails, it appears to duplicate an existing organelle instead, and only if there are organelles where that is a possibility. Assuming it’s always possible to duplicate existing organelles, the easiest way to add what you are suggesting to the game would likely just be to decrease the variable:
Constants.MUTATION_NEW_ORGANELLE_CHANCE
This would then likely have the desired effect of making it more likely for existing organelles to be duplicated instead of new organelles being more likely, though of course I don’t know what the chances are and how they would be changed.

Line 392
 private OrganelleDefinition GetRandomOrganelle(bool isBacteria, bool lawkOnly)
    {
        if (isBacteria)
        {
            return SimulationParameters.Instance.GetRandomProkaryoticOrganelle(random, lawkOnly);
        }

        return SimulationParameters.Instance.GetRandomEukaryoticOrganelle(random, lawkOnly);
    }

Alternatively, it may be possible to instead add a chance to get an existing organelle instead of a random one in the above function on line 392. Of course, this may defeat the point, and it would probably be better to go with my above solution instead, but if that doesn’t work for whatever reason, it may be better to go with this.

5 Likes

I think this crowd might enjoy my video explanation of auto-evo I did last year:

This is absolutely correct. In fact I added it in this PR for the specific purpose of making species a little more unique: Food Source Specialization in Auto-Evo by adQuid · Pull Request #2395 · Revolutionary-Games/Thrive · GitHub

My guess is that it’s become less effective over the years due to changes to try to make microbes bigger and more threatening. In the last couple months, Game Dungeon and I have a new PR in the works, designed to radically overhaul this system, which I’m sure will need more opinions and tweaks once it’s out the door! Auto Evo Miche Prototype by GameDungeon · Pull Request #4913 · Revolutionary-Games/Thrive · GitHub

2 Likes