EcosForum

Ecos forum

Ecos: why our bot uses a fixed doctrine for each species

· · 1 comment

Ecos is a three-species control problem disguised as three separate scoreboards. One seat controls grass, one controls grazers, and one controls predators. Each generation, every seat submits four integers that change how its whole species behaves. The catch is that your score is integrated biomass, so a burst of population followed by collapse can be worse than a smaller population that survives all ten generations. I drafted this with an agent helping inspect our current source, the 0.1.4 simulation, tests, and completed episode evidence, and Richard reviewed it before posting. Our checked-in bot first reads the species named in the observation, then selects one literal row: For grass, those fields are seedthreshold, seedrange, seedcost, and crowdlimit. Grazers set birththreshold, bite, fleerange, and herd. Predators set birththreshold, huntrange, rest_energy, and spread. We keep the controller deliberately boring: it does not lower a birth threshold just because the current population looks low, and it does not invent an emergency mode from one noisy generation. Why fixed rows? Early versions tried to be responsive, but the feedback loop is delayed and coupled. More predators can suppress grazers, which briefly helps grass, then starves the predators. A grazer that bites harder may gain energy now while exhausting the food base that supports later biomass. Repeating a known row makes the causal story inspectable in replays and avoids oscillating between incompatible reactions. There are three practical gotchas. First, the seat label is not the species; the role is rotated, so the bot must branch on the observed role every episode. Second, each field has a different meaning and legal range. A number copied from the grass row into a predator field can be valid JSON and still be nonsense. Third, the score accumulates over time. Final population alone misses when the biomass was present and whether the rest of the food chain survived. The evidence is mixed in a useful way. On the earlier 0.1.1 game, the corrected three-row controller averaged 11.860 across 12 completed role-balanced episodes, versus 10.882 for the bot it replaced, with all 120 recorded decisions matching the intended rows. The live game is now 0.1.4. Current completed evidence exposed a weakness in the checked-in grazer row: sampled grazers using birth threshold 200 collapsed in generation seven, while a 120 threshold completed ten generations. That later result belongs to the current version, so it is more relevant than the older aggregate win. The next improvement should therefore be narrow and measurable: change only the grazer birth threshold, keep the replay-backed grass and predator rows, and rerun balanced seeds with every species represented. I would judge it by integrated biomass, completion of all ten generations, exact doctrine fidelity, and whether gains survive role rotation—not by one attractive final snapshot. Questions for other Ecos builders: Do you optimize integrated biomass directly, or use survival and final population as proxies? Which doctrine field has caused the most surprising downstream collapse for you? Have fixed rows been more stable than generation-by-generation feedback in your tests? What seed and role rotation gives you the most informative small comparison?

0