Projekt Evoluce English version

Historie

Na počátku devadesátých let bylo objektové programování ještě mladé – na mainframe vládl Cobol, na unixu C a PC byly v plenkách. V té době jsme už nějaký čas usilovně hledali způsob, jak programování zefektivnit – hlavním programovacím jazykem pro nás tehdy byl Cobol, který jako jazyk 3. generace nebyl pro vytváření dobře strukturovaných programů zrovna vhodný.

Objektově orientované paradigma tedy u nás padlo na úrodnou půdu. Začátky ale nebyly snadné. První překladač C++ jsem si musel sám napsat v C, abych si mohl teoretické principy vyzkoušet prakticky, nejtěžší byla ale změna způsobu myšlení. Dodnes si pamatuji, jak jsme před sebou měli seznam základních pravidel OOP a každý kousek kódu jsme podle nich prověřovali.

Po čase jsem ale začal OOP i školit – a právě do té doby se datují počátky projektu „Evoluce“. Pro účely školení jsem navrhl jednoduchý program, na kterém jsem demonstroval dědičnost tříd a rozdělení kódu na třídy. Program se jmenoval „Řasy“, „Améby“, nebo „Červi“ a pokud se ho žákům podařilo dokončit, zobrazoval život v Petriho misce. Statické „Řasy“ se postupně vyvíjely ve vícebuněčné pomalé „Améby“ a ty zase v rychlé dravé „Červy“. Důraz byl tehdy samozřejmě kladen na dědičnost ve smyslu OOP – ze základní třídy „Řasa“ byla odvozena podtřída „Ameba“, z té zase podtřída „Červ“.

Jako školní příklad byl program velmi úspěšný, protože přes svou jednoduchost obsahoval všechny důležité součásti – kromě tříd pro živé tvory zde byla třída „Příroda“ pro správu prostředí a řízení „koloběhu života“ i pomocné technické třídy pro zobrazování grafiky a zpracování vstupů (ovládání z klávesnice).

V průběhu dalších let se základ programu neměnil – pouze se zdokonalovalo vývojové prostředí, jak se postupně přecházelo z MS DOS na Windows, z MFC na .NET. Časem také ustupovala do pozadí jeho OOP motivace – daleko důležitější bylo ovládnutí nových programovacích nástrojů (grafických knihoven).

K předposlednímu velkému technickému skoku došlo na jaře roku 2012, kdy jsem na žádost svého syna implementoval XNA verzi, která měla sloužit jako exponát na jedné z jeho „bio“ akcí (http://bio.mimo.cz/amebio/). V prvním plánu tehdy stála především audiovizuální stránka věci (červi se naučili vydávat zvuky přes MIDI rozhraní), ale lidi, kteří s programem tehdy přišli do styku, zaujal samotný princip „života v počítači“.

V té době jsem se rozhodl odstranit letitý princip „pseudovývoje“, kdy objekty z nižší třídy dají občas vznik objektu z vyšší třídy (například z řasy vznikne améba). Místo toho existuje jen jedna třída, jejíž vývoj spočívá v náhodné mutaci parametrů (DNA).

Vzhledem k předpokládanému určení - obrazovka s běžícím programem visela v lese několik dní, měl program příležitost běžet dlouhé hodiny – to mnohonásobně překračovalo jakoukoliv předchozí zkušenost. Ukázalo se, že po několika hodinách se vývoj občas obrátil naprosto nečekaným směrem, dokonce se dá říct, že v podstatě nebylo možné z hodnot počátečních parametrů odhadnout, jak „civilizace“ skončí.

To obrátilo naši pozornost od vizuální stránky k samotnému principu - jak je možné, že relativně velmi jednoduchý algoritmus dává pokaždé jiné výsledky? I když jsme nastavili počáteční hodnotu pseudonáhodného generátoru na stejnou hodnotu, probíhal po několika desítkách minut vývoj jinak.

Odpověď nabízí matematická teorie. Program představuje systém se silně nelineární vícenásobnou zpětnou vazbou – chování takových systémů popisuje teorie chaosu. Stručně řečeno – velmi malá změna počátečních podmínek se v čase může projevit velkou změnou chování systému (viz. např. http://cires.colorado.edu/~doug/extinct/fd1.pdf nebo jakýkoliv odkaz k pojmům „feedback and chaos theory“).

Chování programu navíc neovlivňují jen počáteční podmínky (parametry přírody a DNA „pramatky“). Vzdálenost, kterou tvorové urazí za jednotku času, závisí na momentálním vytížení CPU počítače, program navíc považuje rychlost počítače za jeden z parametrů prostředí - když FPS klesne pod nastavenou mez, omezí se produkce nových tvorů.

Současný stav

XNA verzi programu dokázal spustit jen velmi omezený okruh nadšenců. Z toho důvodu jsem program převedl na platformu HTML5/javascript - pro mne to byla vítaná příležitost procvičit si tuto technologii. V důsledku samozřejmě klesl výkon, protože interpretovaný javascript se nemůže měřit s herním enginem, na druhou stranu je nyní možné aplikaci spustit v jakémkoliv moderním prohlížeči a to na PC, tabletu i mobilu. (V zásadě - jednotlivé verze prohlížečů se samozřejmě liší, problémy mohou mít zejména mobilní verze).

Samotnou evoluci můžete spustit odkazem: www.neurodot.com/Evolution/evol.htm?key=spa_default_set
Pozor, buďte trpěliví - život začíná velmi nesměle !

Jako klíč se uvádí identifikace souboru parametrů, který chcete použít (viz dále).
V běžícím programu si můžete zobrazit výpis nejdůležitějších hodnot - vytáhnete je myší nebo prstem z horního okraje.

Jak si zahrát na boha

I když běžící program připomíná poklidný život v akvariu a pohled na něj je stejně uklidňující, ta hlavní zábava spočívá v hraní s počátečními parametry.

Například mým osobním cílem je nalezení takové kombinace, při které život začne na co nejelementárnější úrovni (jednobuněční, pomalí tvorové), a teprve náhodné mutace DNA a přírodní výběr časem vytvoří další přírodní druhy, až po vícečlánkové rychlé dravce - takovou množinu parametrů představuje spa_default_set použitý v ukázce.

Není to tak snadné, jak se zdá – když dané podmínky neumožňují udržitelný život, tak populace vymře a život začne znovu od první buňky s originální DNA. Mimochodem při prvních pokusech si nastavte nenulovou počáteční hodnotu pseudonáhodného generátoru (seed), aby opakovaný vývoj probíhal alespoň přibližně stejně. (Úplně stejného průběhu zejména po delším čase ale nedosáhnete).

Můžete také začít na nějaké vyšší úrovni - například už od začátku nastavit větší rychlost a vícebuněčné tvory (viz. spa_test1)

K editaci parametrů slouží program: www.neurodot.com/Evolution/evolutionEdit.htm

Vyžaduje jednoduchou registraci, tj. volbu loginu a hesla – to z toho důvodu, abychom si navzájem nepřemazávali svoje soubory. Email zadávat nemusíte, ale je to užitečné při ztrátě hesla.

Parametrické soubory a obrázky (sprites) se dělí na soukromé a zveřejněné. Soukromé vidíte jen vy sami, ty zveřejněné vidí i ostatní a mohou si je zkopírovat. Opravovat můžete jen svoje soubory.

Editační program je (doufám) docela intuitivní, tak zatím postrádá help.

Pro testování vašeho setu parametrů můžete program spustit přímo z editoru (tlačítko Test vpravo nahoře na stránce s parametry).

Popis parametrů - příroda

Sun

Pozice (x,y) a teplota slunce. Všechna energie pochází se slunce. Množství energie, kterou tvor přijímá, závisí na teplotě slunce a klesá se čtvercem vzdálenosti.

Schopnost sluneční energii využít závisí na DNA parametru „Chlorophyll“.

Seed

Počáteční hodnota pseudonáhodného generátoru. Při nulové hodnotě se použije náhodná počáteční hodnota (odvodí se z aktuálního času).

Min_FPS

Minimální požadovaný počet snímků za sekundu. Pokud počet zobrazovaných snímků klesne pod tuto hranici, tj. pokud aktuální výkon stroje neodpovídá velikosti populace, omezí se porodnost.

Render_type

Způsob zobrazení jedné buňky. Je možné použít hodnoty:

“circle“ - barevný kroužek
„fill“ - vystínované kolečko
„sprite“ - zadaný obrázek

Hodnota „circle“ je vhodná pro testování – ukazuje „lovící“ tvory žlutou barvou.

Sprite_key

Klíč obrázku, který se má použít jako sprite. Klíč je odvozen od jména majitele a názvu obrázku (viz. editaci obrázků).

Z jednoho obrázku vygeneruje program různé barevné varianty. Přebarvují se pouze šedivé barvy – ostatní zůstanou beze změny.

Min_age

Ovlivňuje mutaci DNA parametru „Max_age“, který omezuje dobu života tvora. Při mutacích je zajištěno, že nová DNA hodnota nebude menší, než tato globální hranice.

Když tvorové umírají příliš mladí, nemají čas vytvořit dostatek potomků a jejich DNA větev tak zanikne.

Max_age

Ovlivňuje mutaci DNA parametru „Max_age“, který omezuje dobu života tvora. Při mutacích je zajištěno, že nová DNA hodnota nebude větší, než tato globální hranice.

Když jsou tvorové příliš dlouhověcí, dochází k malé obměně populace a tím i k omezení příležitosti vzniku tvorů s mutovanou DNA.

Min_speed

Ovlivňuje mutaci DNA parametru „Base_speed“, který určuje normální rychlost tvora (rychlost se určuje v pixelech za sekundu). Při mutacích je zajištěno, že nová DNA hodnota nebude menší, než tato globální hranice.

Když jsou tvorové příliš pomalí, nic neuloví a vizuálně je to nuda.

Max_speed

Ovlivňuje mutaci DNA parametru „Base_speed“, který určuje normální rychlost tvora (rychlost se určuje v pixelech za sekundu). Při mutacích je zajištěno, že nová DNA hodnota nebude větší, než tato globální hranice.

Když jsou tvorové příliš rychlí, je jejich pohyb nepřirozený.

Ovula_size

Ovlivňuje mutaci DNA parametru „Ovula_size“, který určuje velikost tvora v okamžiku zrození. Při mutacích je zajištěno, že nová DNA hodnota nebude menší, než tato globální hranice.

Maximální velikost tvorů se nenastavuje – je určena velikostí sprite.

Visibility

Maximální vzdálenost, na kterou tvorové vidí svou kořist.

Když tuto vzdálenost nastavíte větší, než je uhlopříčka obrazovky, mají tvorové po delším čase tendenci pohybovat se po diagonále (je to směr, kde je nejvíc potenciální kořisti a v důsledku toho pak i lovců).

Mut._rate

Určuje jak často dochází k mutacím, když se kopíruje nějaký gen DNA. Např. 0.1 znamená, že při každém desátém kopírování dojde k mutaci.

Mut._extent

Určuje jak moc velká mutace je (když už k ní dojde).

Např. 0.1 znamená, že se zkopírovaný gen bude lišit maximálně o +/- 10 procent.

Element_A
Element_B
Element_C

Množství zásob prvků A,B,C v přírodě.

Omezené zásoby slouží jako regulace - když tvor nenajde potřebné množství prvků, nemůže se narodit. Po smrti tvor zetlí (jeho prvky se vrátí přírodě).

Popis parametrů – DNA prvního tvora

Všechny parametry mohou při kopírování DNA podléhat náhodným mutacím. Četnost a rozsah mutací jsou ovlivňovány příslušnými parametry přírody.

Pro některé parametry je navíc zajišťován povolený rozsah (spíš z technických důvodů).

Ovula_size

Velikost právě narozeného tvora.

Nesmí být menší, než příslušný parametr přírody a větší, než velikost sprite.

Max_size

Maximální velikost, které může tvor dosáhnout. (Jde o velikost jedné buňky).

Nesmí být menší, než příslušný parametr přírody a větší, než velikost sprite.

Adult_age

Věk dospělosti (v sekundách).
Jedná se o jednu z podmínek plodnosti.

Max_age

Maximální věk, kterého se tvor může dožít.

Nesmí být menší, než příslušný parametr přírody.
Skutečný věk dožití bývá menší, než maximum nastavené DNA – tvor může umřít hlady (dojde mu energie), nebo ho naopak něco sní.

Max_segments

Maximální délka vícebuněčných tvorů.

Max_energy

Maximální energie - po jejím dosažení přestane mít tvor hlad a přestane shánět potravu. Hodnota 0 znamená, že žere pořád.

Energie je pro tvora naprosto zásadní. Potřebuje ji k růstu, pohybu i k ovulaci. Pokud je tvor březí, dělí se o přísun energie s embryem.

Energii tvor získává ze slunce, nebo lovem.
V případě nouze může trávit zásoby (zmenší se a zvýší svou energii).

Fer._energy

Energie potřebná k ovulaci.

Plodní jsou jen dospělí a dostatečně silní tvorové, což je důležité pro přírodní výběr.

Base_energy

Základní energie - "matka" musí živit embryo, dokud nezíská tuto úroveň, pak se embryo narodí. Pokud klesne energie tvora pod tuto úroveň, zemře hlady.

Consumption

Základní spotřeba - o toto množství se energie sníží v jednom kroku růstu, násobek závislý na čase a rychlosti se spotřebuje při pohybu.

Chlorophyll

Schopnost získávat energii ze světla - touto hodnotou se násobí množství světla dopadajícího na tvora.

Base_speed

Základní rychlost.

Určuje, jak rychle tvor mění polohu. Pokud se tvor pohybuje minimálně (jen se vznáší), spotřebovává minimum energie, ale nic nechytí ...
Zadává se v pixelech za sekundu.

Grow_incr

Přírůstek růstu. O tuto hodnotu se tvor zvětší v jednom kroku, když má dost energie.

Pokud jeho energie klesne pod základní energii, tak se tvor zmenší (zhubne) a jeho energie se zase zvětší. Tvor roste jen do max_size (pak už jen "tloustne", tj. zvětšuje se mu zásoba energie, aniž by rostl).

Acceleration

Zrychlení.

Určuje, jaké zrychlení může tvor vyvinout na lovu. Zrychlením se vynásobí normální rychlost pohybu (pozor, energie se spotřebovává podle výsledné rychlosti)

Decay_decr

Určuje, jak rychle tvor zetlí poté, co umře.

Hodnota 0.01 znamená, že se bude zmenšovat po jedné setině velikosti v době smrti.
Jde jen o vizuální efekt. (Tvor, který je uloven, zmizí rychleji).

Element_A
Element_B
Element_C

Množství základních prvků, které tvor potřebuje ke svému vzniku.

Celkové množství prvků v přírodě je omezené.

Enzyme_A
Enzyme_B
Enzyme_C

Množství enzymů, které tvor potřebuje k trávení prvků.

Určuje to, jak moc je kořist jedlá - pokud má tvor aspoň pro jeden prvek obsažený v kořisti odpovídající množství enzymu, je pro něj kořist jedlá.

Enzymy se nespotřebovávají, právě tak se během života nemění množství obsažených prvků.
To, zda je jeden tvor jedlý pro druhého, se tedy mění jen mutacemi. Při jídle se z kořisti získá jen energie, její prvky se vrátí přírodě. Ze začátku je enzymů míň, než základních prvků, tj. tvorové nejsou schopni trávit jiné tvory a tudíž ani neloví (získávají energii jen ze slunce).

snapshot