[Aivan vapaaehtoisia muunnelmia tehtävän teemasta:
Jos kaksi kasvissyöjää tai kaksi petoa osuu samaan ruutuun, johonkin arvottuun tyhjään ruutuun syntyy uusi eläin - kasvissyöjien kohdatessa uusi kasvissyöjä, petojen kohdatessa uusi peto. Lapsen synnyttyä tulija palaa samantien ruutuun josta se tuli kohtaamaan kumppaninsa.
Eläimet liikkuvat arvottuun suuntaan yhden ruudun verran. Kaikki suunnat ovat keskenään yhtä todennäköisiä. Kun eläin on siirtynyt, se nukkuu. Kasvissyöjä nukkuu t millisekuntia, peto u millisekuntia.
Jos kasvissyöjä on kulkenut p ruutua saamatta ruokaa, se kuolee. Jos peto on kulkenut q ruutua saamatta ruokaa, se kuolee. Jos jossakin ruudussa on käynyt s eläintä, siihen syntyy uusi kasvi s:nnen kulkijan poistuttua.
Simuloi tätä maailmaa Java-ohjelmana siten, että eläimet mallinnetaan omina säikeinään. Kasvien ja eläinten paikat sekä parametrit n, p, q, s, t ja u asetetaan ohjelman alussa. Löydätko sellaisia parametrien arvoja, joilla "luonto on tasapainossa", so. maailma ei täyty tai tyhjene (myös eläimiä sisältävää maailmaa!).
Jotkut pitävät tällaista säikeiden käyttämistä huonona
ohjelmointityylinä. Yksi perustelu voisi olla, että
koko n*n-ruudukko joudutaan varaamaan yhden eläimen
siirymisoperaation ajaksi; aitoa rinnakkaisuutta ei siis
oikeastaan synny. Skeduloija vain "arpoo" seuraavaksi
valittavan eläimen, mikä voitaisiin toki ohjelmoida
itsekin. Toisaalta jotkut ovat sitä mieltä, että tällainen
ratkaisu on luonteva simuloinnissa. Mitä mieltä olet?
Millainen ratkaisu olisi "paras"?
(Yksi klassinen tapa toteuttaa ajassa tapahtuvien asioiden
simulointia perustuu ns. prioriteettijonon käyttämiseen,
ks. vaikkapa kevään 2003
Tietorakenteet-kurssin
esimerkkiä. (laitoksen intranetissä))
Jos maailma toteuttaisiin matriisin sijaan linkitettynä verkkorakenteena, voisivatko operaatiot varata koko maailman sijaan vain pienen osan maailmasta? Esimerkiksi vain muutaman ruudun? Auttaisiko tämä yllä mainittuun ongelmaan?
Takaisin harjoitusten pääsivulle.