Aug 22, 2026 AI copy

Evolution that refuses to be greedy

Write the obvious genetic algorithm and you get a greedy one. Rank the population, keep the top half, breed them, repeat. It converges quickly and it converges narrowly: within a few generations everything alive is a variation on whatever was winning early, and the parts of the search space that were merely promising are gone.

Usually that is described as a tuning problem — raise the mutation rate, lower the selection pressure. I think it is a structural one. A hard cutoff is a claim that you already know which individuals are worth keeping, made at exactly the moment you know least.

So the strategy I keep coming back to has no cutoff anywhere in it.

One death per birth

The cull runs on every evaluation, and it is sized so that on average it removes about one individual — the one just added. Each member's death probability is:

death = (size / target) ^ cull_pressure / target  ×  (badness / mean_badness)

badness is normalized fitness inverted: 1 for the worst member, 0 for the best. Dividing it by the pool's mean badness is the part that makes the whole thing sit still. An average individual gets badness / mean_badness = 1, so its death probability is exactly 1/target — across a pool of target members that is one expected death per pass, matching the one birth. The population holds at capacity instead of sawtoothing.

Death probability against badness at three selectivity settings
Fig. 1 — Everything is measured relative to the pool average, so the curves all pass through the same point: an average member always dies at the base rate, whatever the setting.

Two exponents shape it, and they are the only knobs that matter:

  • cull_pressure on size / target decides how hard crowding bites. Above

capacity the base rate climbs; below it, it falls and the population recovers.

  • selectivity on badness / mean_badness decides how sharply survival

responds to score. At 0 the cull is indiscriminate — a random death, pure drift. At 1 it is proportional. Push it up and the cull hunts the weak, which converges faster and throws away more.

Nothing is guaranteed except one copy of the best solution found so far, which is protected from the pass so progress cannot be lost to a bad roll.

Novelty, and the other way to get it

The score being tested is not raw fitness. Two strategies build it differently, and they disagree about what "different" means.

Soft culling blends fitness with novelty — how far a genome sits from its nearest neighbours, measured by proximity-weighted sampling rather than an exact k-nearest cut, so the measure fluctuates and a rare lineage always keeps some chance of scoring novel. A weight decides the mix.

Resource sharing has no novelty term at all. Instead it divides each member's fitness by how crowded its neighbourhood is: a clump splits one niche's resource more ways, so the clump stops paying. The population settles into a per-niche carrying capacity.

The second is the one I keep underestimating. It never measures diversity, and it protects it better.

What I got wrong on the way here

Three of these were mine, not the algorithm's, and each one produced a plausible demo that was quietly lying.

A greedy baseline that never turned over. My first generational GA let children join the parent pool mid-generation, so the population never actually replaced itself. It held 12 of 12 sectors and beat soft culling outright — not because greedy is good at this, but because a GA that never turns over never drifts, and one that never drifts never collapses. The bug flattered it.

Culling in bursts instead of every step. Running the cull on a fixed interval rather than once per birth drove the pool to a third of its target and pinned it there. That starved ratio then forced the exploration term to its ceiling, so the strategy spent most of its budget on random restarts — the demo looked like diversity while actually being random search with extra steps.

Random restarts at all. They are in the reference implementation and they are defensible, but they let a population teleport across the space, which is not the thing being demonstrated. With them removed, everything you see is descended from the seed knot, and the spread along the ring is genuinely earned.

What it costs

Diversity is not free. On a problem with one right answer, soft culling is slower than a greedy GA, because it spends evaluations on individuals that a greedy algorithm would have correctly discarded. On XOR it converges later than the greedy baseline — though it does reliably escape the deceptive plateau at 0.875 that traps greedy runs, which is the same property from the other side.

The trade is straightforward once it is stated plainly: you pay evaluations for the ability to keep looking. Whether that is worth it depends entirely on whether the first good answer you found is the one you wanted.

All writing