[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.