Atari ST - 1989
Evolution

- Genre
- Miscellaneous
- Year
- 1989
- Language
- Compiled FORTH
- Publisher
- [no publisher]
- Controls
- Mouse
- Distributor
- —
- Players
- 1
- Developer
- PD Palvelu
- Resolution
- High
- Licensed from
- —
- Programmer(s)
- Pesch, Heinrich
- Country

- Graphic Artist(s)
- —
- Software
- English
- Game design
- —
- Box/Instructions
- English / Finnish
- Musician(s)
- —
- License
- PD / Freeware / Shareware
- Sound FX
- —
- Serial
- —
- Cover Artist(s)
- —
- ST Type
- ST / 0.5MB
- MIDI
- —
- Version
- —
- Dump
- Download
- Number of Disks
- 1 / Single Sided
- Dump format
- MSA
- Protection
- —
INSTRUCTIONS
Evolutio-ohjelman synty
11.5.89 Scientific American-lehti saapuu.
Luen ekaksi "Computer Recreation" artikkelin. Juttu esittää
ohjelmaa, jossa "kirput" syövät pikku "baktereita" ja kehittyvät
mutaatioiden kautta tehokkaammin liikkuviksi.
Kun kirppu on syönyt kyllikseen se saa luvan jakautua.
Syntyvät kaksi kirppua, ja niiden geenit muuttuvat samalla yhdessä
kohdassa. Vitsi on siinä, että satunnaisesti liikkuvien olioiden
satunnaisesti muuttuvan perimä-aineksen kautta kehittyvät lajikkeita,
jotka liikkuvat olosuhteisiin nähden tehokkaammin, löytävät enemmän
rehua ja lisääntyvät yhä nopeammin.
Ohjelma on askel Richard Dawkinsin viittoittamalla tiellä kohti
tietokonesimulaatiota, joka kuvaa elämän kehitystä maapallossa.
12.5.89 Otan lehden mukaan töihin ja kirjoitan muistiin joitakin
suunnitelmia. Laitan ylös, minkälaisia muuttujia ja taulukkoita
tarvitaan ja yritän miettiä joitakin rutiineja.
Artikkelissa oli esitetty monimutkainen tapa liikuttaa kirput
todennäköisyyden mukaan. Kirpuilla on kuusi geeniä, joiden nimet
ovat ETEEN OIKEALLE JYRKÄSTI-OIKEALLE VASEMMALLE JYRKÄSTI-VASEMMALLE
sekä TAAKSE.
Muutaation kautta ne joko vahvistuvat tai heikkenevät, jolloin kirppu
alkaa suosia liikkeissään tiettyjä suuntia toisten suuntien kustannuksella.
Geenien arvo voi olla positiivinen tai negatiivinen kokonaisluku.
Laskentakaavaan sisältyy sekä potenssilaskua että reaalikukuja.
Yritän välttää näitä ja päätän kokeilla ainakin aluksi sellaisia
geenia, jotka ovat kaikki positiivisia. Pienempi kuin nolla ei geeni
voi olla. Geeni-arvojen summa on sitten raja-arvo, jota tarvitaan
satunnaisfunktion kanssa.
Illalla koneella: Forth-editorissa ensimmäiset screenit, jossa
muuttujat ja datapuskurit ynnä sanat, joilla saadaan alkutilanne
kuvaruudulle. VDI-rutiineista päätän käyttää MARK-funktiota, jolla tehdään
pisteitä sekä plus-merkkejä. Kirjoitusmuoto XOR, jolloin voi kirjoittaa
merkkejä päälläkkäin aikaisempia tuhoamatta.
On tarkoin mietittävä, missä formaatissa aion käyttää eri lukuja, riittääkö
jossain tapauksessa tavu, vai tarvitaanko sana tai tupla.
13.5.89 Yöllä tuli maistettua vähän kuohuviiniä, ja päänsärky näyttää
väistämättömältä. Aspiriini auttaa.
Ohjelmoimaan: mietin jonkun aikaa, voisinko käyttää kaikille kirppuille
yhteisen puskurin, jonka ensimmäinen sana olisi kirppujen lukumäärä,
sen jälkeen x1, y1, x2, y2 ... Silloin VDI-MARK voisi kirjoittaa
merkit yhdellä kutsulla. Päätän kuitenkin valmistaa yhden, kolmen sanan
"marks"-puskurin, jonka eka sana on 1 ja johon nostetaan x- ja y-koordinaa-
tit yksitellen. Silloin voin antaa eri kirppuille eri värit.
Myöhemmin osoittautuu menetelmä oikeaksi: kirppujen koordinaatit
pitää säilyttää pitkinä sanoina (kahdeksan tavua = x ja y).
Silloin voi ilmaista myös negatiivisia arvoja, kun kirppu liikkuu
rajan yli.
Esimerkiksi liikkeellä syntyy x-arvo -2. Lisätään siihen 320 ja
lasketaan modula 320, josta syntyy 318. Silloin kirppu ilmestyy
oikealla reunalla.
Taulukoissa säilytetään koordinaatit sopivasti matalaa resoluutiota
varten, ja muille resoluutioille muutetaan ne sopivaksi käyttämällä
muuttujia xres ja yres. Oikeastaan olisi vältettävä käyttämästä
XBIOSin GETREZiä, koska se ei tunnista suurempaa resoluutiota kuin
640*400 pistettä. Esim. BIGSCREENiä varten olisi säilytettävä
ohjelman käynnistyksen yhteydessä suoritetun OPEN WORKSTATION-funktion
antama resoluutio-arvot. En osaa sitä vielä, joten tämä ohjelma ei
tule olemaan yhteensopiva BIGSCREENin kanssa.
Koko jupakasta syntyy kuitenkin pieni sekaannus rutiineissa.
Kun pääsen kokeilemaan kirppujen liikkumista, huomaan, että merkkien
poisto ja siirtäminen ei oikein luonnistu. XOR-muodossahan pitäisi
onnistua merkin poisto kirjoittamalla se uudestaan samalle paikalle,
mutta jostain syystä ensimmäiset merkit jäävät paikalle.
Onnistun kiertämään ongelmaa, mutta vasta illalla löydän syyn.
Forth on koneläheinen kieli, mikä tarkoittaa, että käytetään paljon
funktioita, jotka suoraan käyvät muistin kimppuun.
X-y-koordinaateja varten on varattu puskuri, jonka tilavuus on 800 tavua.
Olen päättänyt rajoittaa kirppujen maksimin sataan, ja 8 tavua tarvitaan
jokaista kohden.
Kun käsittelee ensimmäistä kirppua, on sen numero =0.
Numero on kerrottava 8:lla, jotta saadaan luku, johon lisätään puskurin
alkuosoite. Siten saadaan se muistiosoite, jossa kirpun X-arvo makaa.
Lisäämällä edelleen 4 saadaan Y-arvon paikkaa.
Sekaannus aiheutti se, että joissain rutiineissa olin käyttänyt
8:n tilalla 4:a. Fuzzy logic kuten aina!
Illalla saan ohjelman siihen pisteeseen, että kirput liikkuvat iloisesti,
syövät rehupisteitä ja niiden ruokavarasto joko kasvaa tai vähenee.
Kun varasto loppuu, kirppu kuolee eli häipyy kuvaruudusta ja muistista.
Välillä oli ratkaistava, miten estetään kirppujen liian nopea nälkäkuolema.
Pitää olla alussa paljon rehua, vaikka 8000 pistettä, ja syödessään
kirppu saa 80 pistettä per rehulöytyä. Turha liike vie 2 pistettä.
Syöttyä pistettä kohti piirretään jonnekin uusi.
Näin onnistuu suunnilleen ohjelman tarkoitus: kirput saavat tilaisuuden
lisääntyä.
Itse lisääntymisprosessi ja mutaatiot jäävät äitienpäivän ratkaistavaksi.
14.05.89 Tass syntyi univajausta lisää, mutta jo puoli kymmeneltä taas
ohjelman kimppuun.
Ensin pitää kuolleen kirpun jäännökset pyyhkiä pois puskureista, siis
kuolleen kohdalla siirretään puskurin loppu tietyn määrän
tavuja eteen.
Sen jälkeen se lisääntyminen! Raja-arvoksi otan 1500 pistettä, jos kirppu
on syönyt enemmän se jaetaan. COPY-GENE kopioi ensin geenit tyhjälle
paikalle, jonka osoittaa muuttuja LASTBUG.
MODIFY-sana muuttaa sekä uuden että vanhan kirpun geenejä yhdessä kohdassa.
Sitten kirjoitetaan uudelle tulokkaalle muut tiedot eri puskureihin ja
korotetaan LASTBUG-muuttuja yhdellä.
Koeajalla tulee kaksi pommia. Jäten seuraavalla kerralla DIVIDE?-sanan
kääntämättä, joka ohjaa koko lisääntymisprosessin. Kirput liikkuvat
iloisesti, kaikki hyvin. Tiedän että muu ohjelma on kunnossa.
Nyt on löydettävä kohta, jossa tehdään jotain kiellettyä.
Ensin huomaan, että MODIFY-rutiinin pinokäsittely oli virheellinen,
mutta korjauksen jälkeenkin tulee pommeja!
Lopuksi löytyy aiheuttaja: tietenkin kirjoitusvirhe. Kun olisi pitänyt
inkremoida LASTBUG näin:
1 lastbug +!
siinä luki 1 lastbug @ +!
Eli @ lukee LASTBUG-muuttujan arvon, joka voi olla 0-99.
Lastbug-muuttuja sijaitsee muistipaikassa noin 300000.
Jos käyttää +! -funktiota muistin alkuosoitteilla, joka on kielletty
USER-modessa, ei tarvitse ihmetellä, jos kone kaatuu.
Nyt kaikki näyttää aluksi hyvältä. ASCII 7 merkki sanoo pling!
joka kerta kun kirppu jakautuu. Mutta miksi jossain häviää pisteet
vaikkei kirppuja näy?
Näkymättömät kirput ovat tietysti ne uudet, vastasyntyneet.
Synnytyksen jälkeen pitää kerran kirjoittaa plus-merkki, muuten
kirppu on vain hyvin lyhyen ajan näkyvissä, silloin kun sitä tarkastellaan
silmukassa, joka liikuttaa kirput.
Edelleen kirput kuolevat jossain vaiheessa sukupuuttoon.
Viime iltana ohjelma jäi siinä vaiheessa, kun kuolleet kirput jäivät
"makaamaan" kuvaruudussa. Ja vielä elossa olevat tietysti kanibalisoivat
niiden pikselit. Musta piste on musta piste. En tiedä pitääkö tämä
jättää näin, todellisessa luonnossahan kävisi samoin, kaikki ruoka
kelpaa jollekin oliolle.
Entäs jos ohjelman ajon aikana kehittyisi sellainen laji, joka
seuraisi muita kavereita ja söisi ne?
WATOR-ohjelmassa (saalis ja peto) oli peto ohjelmoitu katsomaan ensin
kaikkiin suuntiin ja liikkumaan vain sinne missä on ruokaa. Sen
seurauksena pedot lisääntyivät rajusti kunnes saalis käy vähiin, jonka
jälkeen suurin osa pedoista menehtyi. Saaliin lisääntyminen oli
riippumatta saaliin lukumäärästä.
Mutta kun EVOLUTIOssa pidetään saaliin lukumäärä vakiona, voisi
ehkä antaa kirppuille silmät eli kyky havaita ruokaa läheisyydessä.
Pitää kokeilla kun ensin saadaan kaikki toimimaan.
Iltapäivällä ohjelma toimii jotenkuten, mutta jotain edelleen vaivaa.
Luen kirjaa, nukun, laitan ruokaa. Sitten tv:stä hieno Lolita-elokuva.
Uutisten jälkeen asiat ovat mielessä kypsyneet.
Otan MOVEBUG-silmukasta lisääntymisrutiini pois ja teen sille oman
silmukan. Siis ensin liikutaan kaikki kirput uusiin paikkoihin,
sen jälkeen katsotaan, ketkä ovat jakautumisvaiheessa.
Tämä auttaa. Kun silmukan keskellä muutettiin puskureita menivät eri
parametrit sekaisin.
Mutta alussa, asettaessaan rehupisteet, tapahtuu vielä kummia.
Kun tarkkoin katsoo näkee että välillä pisteitä häviää!
Siksi ruoka ei tahtonut koskaan riittää.
Virhe oli vaikea löytää. Kun asetetaan uusi piste, suoritetaan ensin
silmukka, jossa arvotaan satunnaislukuja koordinaateiksi ja katsotaan,
onko siinä paikassa jo ennestään piste (vdi get-pixel).
Mutta siinä unohtui resoluutiokertoimet xres ja yres.
Kun korjaan tämän riittää jo paljon vähemmin rehua, koska mitään ei
enää kirjoiteta yli.
Nyt kirput lisääntyvät niin nopeasti, että tulee taas pommeja!
Koska puskurit riittävät vain sadalle kirppuille menee lopuksi raja
rikki ja data kirjoitetan ohjelmakoodin yli, josta prosessori ei
pidä.
Yksinkertainen if - endif - lause korjaa asian.
Ohjelma yksinkertaisessa muodossa on sitten valmis, mutta evoluutiosta
ei ole vielä merkkiäkään.
Rehun määrän säätö, ja ennen kaikkea pitää estää että kirput syövät
toisiaan, mikä sotkee olosuhteet. On luultavasti käytettävä toinen,
näkymätön ruutu, josta kirput etsivät rehut, jolloin kirppuja esittävät
merkit eivät häiritse.
Ja on tehtävä mahdolliseksi, että välillä voi hiirellä valita
yksittäisä kirppuja ja tarkistaa niiden geeni-tietoja.
15.05.89 On vain puolisen tuntia aikaa. Kokeilen toisen kuvaruudun
käyttöä. XBIOSin funktio SETSCREEN siirtää kuvaruudun RAM-muistin
paikasta toiseen. Tässä vaihdetaan vain looginen kuvaruutu silloin kun
halutaan tietää onko tietyssä paikassa rehu-pikseli vai ei.
Ja resoluutioksi annetaan -1, mikä tarkoittaa ettei resoluutiota muuteta.
Jos antaa positiivisen arvon XBIOS suorittaa kuvaruudun pyyhkäisyn,
mikä tässä ei ole tarkoituksenmukaista.
Minulla on sanat HINTEN ja VORNE, joita on sijoitettava eri silmukkoihin
järkevästi. Sekaannusta syntyy tietysti, mutta on pakko lopettaa.
16.05.89 Työn jälkeen heti jatkoon. Muutaman koeajon jälkeen kuvaruudun
vaihdot täsmäävät, ja rehupikselit sijoitetaan oikein molemmille ruuduille.
Olen päivällä miettinyt, miten voisin helposti toteuttaa yksittäisen
kirpun esittelyn.
On kuusi geeniä ja kuusi liikkumissuuntaa. Eripitoisia nuoleja
geeniarvon mukaan. Mutta siihenhän voisi käyttää VDI-PIE-funktiota!
0-geenille sektori 200-400, 1-geenille 800-1000 ...
Se on ainakin nopea. Tulostus kolmannelle kuvaruudulle.
Ja silmukkaan tarkistus, onko vasen hiirikorva alhaalla. Hiirikursori
esiin, odotus kunnes hiirikorva on vapaa. Sitten vertaillaan, mikä
kirppu oli kursorin läheisyydessä. Tämän numeron löydettyä
piirretään geenitähti ja odotetaan, kunnes käyttäjä painaa oikeaa
hiirikorvaa.
Samalla korjataan joitakin pieniä bugeja, jonka jälkeen ohjelma
on jo hyvässä mallissa.
Tarvitaan seuraavaksi ohjaus- ja säätö-rutiineja, ja olisi päästävä
olosuhteisiin joissa todella evoluutio voi tapahtua.
Käyttäjän on voitava määrätä rehun määrää sekä kirppujen lähtögeenit
sekä ohjelman uudelleenkäynnistys ja lähtö desktopiin.
17.05.89 Katson vanhoista ohjelmistani mallia miten valikon ja muuttujien
editoinnin voi toteuttaa. Forth ST:n GEM-kirjastoja käyttäen asia käy
nopeasti. Laatikon sisälle lyhyitä selityksiä sekä radio-nappuloita
hiirellä laukaistaviksi. Editointi-laatikon arvojen lukemiseksi eli
lukujen muuttamiseksi merkkijonoista kokonaisluvuiksi pitää kyhätä
pikku rutiini ja testata se. Suunnittelen laatikot heti kaikille
resoluutioille sopiviksi, siksi ne ovat mustavalkomonitorissa
vasemassa ylänurkassa. Pääasia on toimivuus.
18.05.89 Pienen päänvaivan aiheuttaa valikkonappuloiden värivaihdos.
GEM kääntää hiiren klikkaaman nappulan mustaksi eli käänteiseksi.
Siksi se pysyykin eli jos klikkaan vaikka EDIT-nappulaa se on edelleen
käänteinen kun sama valikko tulee uudestaan esille. Seuraan
konekielimonitorilla mitä tapahtuu ja löydän ne kohdat, jossa bitit
kääntyvät. Lopussa, kiitos, seisoo! kuten Lyyli asian ilmaisee.
Siirrän valikko-koodit muuhun ohjelmaan. Tästä lähtien on ladattava
mukaan myös GEM-kirjastot = 24 screeniä.
Ohjelma koekäytössä. Kaikki näyttää hyvältä. Ei voi olla totta!
Jäten kirput pyörimään ja lähden Taskumatille yhdelle kaljalle.
Kun palaan ovat kirput kuolleet, bakteerit ovat kaikki keskittyneet
ruudun vasempaan ylempään neljännekseen ja kone ei reagoi enää mihinkään.
Pois päältä ja nukkumaan.
19.05.89 Katson ohjelman koodia ja havaitsen tärkeitä epäkohtia.
Uudet bakteerit tulevat vain mv-monitorin kuvaruudun neljännekseen,
koska xres- ja yres-muuttujat jäivät pois jostain. Virheitä löytyy nyt
oikein paljon. Lopetan kannibalismin, kuolleet kirput häipyvät kuvasta.
Kuolleitten poisto muistista siirretään omaan silmukkaan.
Ensin liikutetaan kaikki kirput, sitten katsotaan, kuka niistä syö,
ketkä kuolevat. Kuolleet merkataan ylös. Sitten poistetaan kuolleet
kijoista. Ja katsotaan, painoko joku hiirinappuloita. Sitten taas
liikutetaan...
: move-once move-each
look-for-births
look-for-deaths
look-at-mouse ;
Jokaisessa oma silmukka, nyt ohjelman on koodin osalta siisti. Ei saa
yrittää mahtumaan liikaa yhteen sanaan.
Alussa hylkäsin reaalilukujen käytön. Nyt on mietittävä uudestaan
geenien vaikutus liikkumiseen.
Jokaisen kirpun geenin arvo on ohjelman alussa 4. Summaksi tulee 24.
Saadaan satunnaisluku väliltä 0 ja 23. Sitten katsotaan, mihin
viipaleeseen tämä luku osuu. Esimerkiksi jos luku on 0-3 niin liikkutaan
eteen eli muutos on 0. 4-7 tarkoittaa oikeaan eli muutos = 1.
Jokaisella geenilla on kuudesosan todennäköisyys tulla vuoroon.
Seuraavassa sukupolvessa geenijakautuma voi olla 445444 tai vaikka
434444. Summaksi tulee silloin 25 tai 23. Tämä on aika pieni muutos
eikä vaikuta juuri ollenkaan liikkumiskäyttäytymiseen.
Jospa muutan asian niin että käytän geenien neliöitä?
Kun silloin geeni muuttuu 4:stä 5:ksi muutos on laskennallisesti
16:sta 25:ksi. Jolloin mutaation vaikutus korostuu.
Nyt päästään vähitellen kokeilemaan ohjelmaa, samoin kuin ajantarve
kasvaa. Ehkä on odotettava tuntikausia kunnes parametrien vaikutukset
näkyvät.
Seuraava kuukausilehti olisi saatava kuntoon.
21.05.89 Yön aikana kirput saivat hyppiä vapaasti. Aamulla niitä on
sata kappaletta ja pistemäärät jopa 22000:luokkaa!
Tämä ei toimi. On saatava välillä aikaan ruoan puute, jota huonoimmin
sopeutuneet kirput ehtisivät menehtyä. Tähän saakka on aina asetettu
uusi bakteeri kun jossain yksi tuli syöty pois. Nyt käy niin, että
joka MOVE-ONCE-syklin päätteeksi asetetaan yksi uusi bakteeri, katsomatta
kuinka monta on syöty pois. Siinä toivossa että hillitön kirppujen
lisääntyminen loppuisi paikallisen ruokapulan vuoksi.
Se toimii! Join yhden tuopin kapakassa ja sen aikana on kirppujen liikku-
miskäyttäytyminen silmiinpistävästi muuttunut. Liikkuvat pitkiä jaksoja
yhteen suuntaan, lisääntyvät välillä nopeasti, kuolevat sitten lähes
sukupuuttoon jne. Ja kaikissa on ETEEN-geeni kasvanut huomattavasti.
22.05.-24.05.89 Teen sporaadisesti työtä ohjelman parantamiseksi.
Kun tiedän että se toimii kiinnostus alkaa laantua. Kirjoitan vielä
rutiinin INFO.TXT-tiedoston lataamiseksi ja näyttämiseksi, mikä osoittautuu
helpoksi. Kun kirput kuolevat sukupuuttoon ohjelma pysäytetään hälytys-
laatikon kera. Ohjelma alkaa olla valmis. Evoluutio tapahtuu, mikäli
valitaan sopivat olosuhteet. En aio paljastaa mitkä ne ovat, mutta
optimi löytynee oletusarvojen läheltä.
Lopuksi vielä mahdollisuus listata kaikki geenit taulukon muodossa,
aina 20 kirppua kerrallaan.
Onkohan Scientific American-lehden esitetty PC-ohjelma yhtä helppo-
käyttöinen? Hinnaksi ilmoitettiin 39.95 taalaa.
Atari=Ammattimainen ja TApaRIkollisuus! (Helsingin Sanomat 28.05.89)
