Simulointi: Olutravintola

(TK99JR1)

 

Mika Juhani Tanninen

Jukolantie 31, 00730 Helsinki

050-3594763 / 09-3867898

 

 

 

 

 

 

 

 

 

 

 

                              Helsinki 29.4.1999

                              Tietorakenteiden harjoitustyö

                              Helsingin Yliopisto

                              Tietojenkäsittelytieteen laitos

                              Ryhmä: K99-13

                              Ohjaaja: Jaakko Kyrö


 

Simulointi: Olutravintola (TK99JR1)                             Helsinki 29.4.1999

Mika Juhani Tanninen                                                  Tietorakenteiden harjoitustyö

Jukolantie 31, 00730 Helsinki                                      Helsingin Yliopisto

050-3594763 / 09-3867898                                       Tietojenkäsittelytieteen laitos

                                                                                   Ohjaaja: Jaakko Kyrö

 

 

Simulointi: Olutravintila

 

Olutravintolassa on n tarjoilijaa ja tilaa m asiakkaalle. Olutta saa sekä hanasta (iso ja pieni tuoppi) että pullossa (0,33 ja 0,5 litraa). Lisäksi ravintolasta saa pieniä ruoka-annoksia.

 

Tarjoilijalta menee aikaa tilauksen vastaanottamiseen, tarjoiluun sekä rahastamiseen seuraavasti:

Iso tuoppi / pullo 4 aikayksikköä, pieni tuoppi / pullo 2 aikayksikköä. Lisäksi pullon hakemiseen ja avaamiseen kuluu 1 aikayksikkö. Ruoka-annoksen valmistaminen kestää 20 aikayksikköä.

 

Asiakkaita saapuu ravintolaan tasaisesti aikavälillä (1,k). Jos ravintola on täynnä, asiakas jää jonottamaan ovelle joksikin ajaksi (odotusaika tasaisesti jakautunut välille (1,w)), jonka jälkeen hän kyllästyy ja lähtee pois. Asiakkaat pääsevät sisään jonoonsaapumisjärjestyksessä.

 

Asiakkaan ravintolassa ollessaan tekemien tilausten määrä on tasaisesti jakautunut välille (1,p). Tilaukset jakautuvat seuraavasti: iso tuoppi 40%, pieni tuoppi 30%, iso pullo 20%, pieni pullo 8% ja ruoka-annos 2%. Tilausten välillä kuluu asiakkaalta aikaa (1,t) yksikköä.

 

Ohjelma simuloi olutravintolan toimintaa annetuilla parametreillä m, n, k, w, p ja t.

 

Ohjelma kerää simuloinnin aloitushetkestä lähtien sisäänpäässeitten asiakkaitten, myytyjen tuotteiden, kyllästyneiden asiakkaiden ja poistuneiden asiakkaiden määriä.

Ravintolan täyttöastetta, tarjoilijoiden työllisyysprosenttia ja jonotusaikoja tarkkaillaan simuloinnin aloitushetkestä lähtien, mutta omalla tarkkailulla tarkkailuhetken aloituskohdan pystyy määrittelemään itse.


 

Sisältö

 

1    Käyttöohje                                                                                                                1

   1.1     Ohjelman yleiskuvaus käyttäjälle                                                                    1

   1.2     Ajo- ja asennusohje                                                                                          1

   1.3     Ohjelman käyttöohje                                                                                         2

      1.3.1     Komentovalikko                                                                                           2

         1.3.1.1     Komento: Aloita simulointi alusta                                                      2

         1.3.1.2     Komento: Jatka / Pysäytä simulointi                                                  2

         1.3.1.3     Komento: Käynnistä / Lopeta oma tarkastelu                                  2

         1.3.1.4     Komento: Ohjelman lopetus                                                                2

      1.3.2     Komentovalikon arvojen muuttaminen                                                    3

         1.3.2.1     Tarjoilijoita                                                                                             3

         1.3.2.2     Asiakaspaikkoja                                                                                    3

         1.3.2.3     Asiakkaiden saapumisväli                                                                   3

         1.3.2.4     Sisäänpääsyn jonotusaika                                                                   3

         1.3.2.5     Tilauksia per asiakas                                                                             3

         1.3.2.6     Nauttimiseen kuluva aika                                                                     4

         1.3.2.7     Simuloinnin nopeus                                                                              4

      1.3.3     Simuloinnin seuranta                                                                                  4

   1.4     Virheilmoitukset ja rajoitukset                                                                          5

2    Ohjelman toiminta ja rakenne                                                                                 6

   2.1     Järjestelmän yleiskuvaus ja ratkaisutapa                                                       6

   2.2     Tärkeimmät tietorakenteet                                                                                7

      2.2.1     Linkitetyt listat ja listan alkiot                                                                    7

      2.2.2     Taulukot                                                                                                        7

      2.2.3     Muuttujat                                                                                                      8

      2.2.4     Vakiot                                                                                                            8

   2.3     Määrittely- ja kutsurakenne                                                                             9

   2.4     Ohjelman toiminta                                                                                              9

      2.4.1     Pääohjelma                                                                                                    9

      2.4.2     Aliohjelma Lisaa                                                                                          10

      2.4.3     Aliohjelma Poista                                                                                         10

      2.4.4     Aliohjelma Pituus                                                                                        10

      2.4.5     Aliohjelma TekoJononKasittely                                                                10

      2.4.6     Aliohjelma MaksuJononKasittely                                                            10

      2.4.7     Aliohjelma TilausJononKasittely                                                              10

      2.4.8     Aliohjelma JuomaJononKasittely                                                             10

      2.4.9     Aliohjelma PihaJononKasittely                                                                 10

      2.4.10   Aliohjelma AikaHarppaus                                                                          10

      2.4.11   Aliohjelma LisaaMaariin                                                                             11

      2.4.12   Aliohjelma TarkkailuPaivitys                                                                     11

      2.4.13   Aliohjelma GrafiikkaPaivitys                                                                      11

      2.4.14   Aliohjelma NappaimenKasittely                                                                11

      2.4.15   Aliohjelma KysyArvo                                                                                 11

      2.4.16   Muut Aliohjelmat                                                                                        12

   2.5     Parannusehdotuksia                                                                                          12

3    Testaus                                                                                                                      13

   3.1     Tietorakenteiden käsittelyrutiinien testaus                                                   13

   3.2     Kommunikointirutiinien testaus                                                                      14

   3.3     Tarkkailurutiinien testaus                                                                                 14

 

Liitteet   1. Tehtäväpaperi

                2. Työpäiväkirja

                3. Ohjelmalistaus

                4. Simuloinnin testaustuloste

                5. Ohjelmalevyke


1

 

1 Käyttöohje

1.1 Ohjelman yleiskuvaus käyttäjälle

 

Ohjelmalla simuloidaan olutravintolan toimintaa.

         

Simuloinnissa tuotteiden ostojakauma ja valmistusaika on kiinnitetty seuraavasti:

      Tuote:                 Tilausjakauma:     Valmistusaika:

      Iso tuoppi          40 %                       4

      Pieni tuoppi       30 %                       2

      Iso pullo             20 %                       5

      Pieni pullo          8 %                         3

      Ruoka-annos     2 %                         20 aikayksikköä

 

Kaikkea muuta ohjelmassa pystyykin muuttamaan: tarjoilijoiden ja asiakaspaikkojen määriä, asiakkaiden saapumisväliä, sisäänpääsyn suurinta jonotusaikaa, asiakkaan tilausten määrää, nauttimiseen kuluvaa aikaa ja simulointinopeutta.

 

Simuloinnin aloitushetkestä lähtien seurataan ajan kulkua, kyllästyneiden jonottajien, sisäänpäässeitten jonottajien, poistuneiden asiakkaiden ja myytyjen tuotteiden määriä.

Simuloinnin alkuhetkestä lähtien seurataan myös ravintolan täyttöastetta, tarjoilijoiden työllisyysprosenttia ja keskimääräisiä jonotusaikoja eri aikaväleiltä.

Simuloinnista piirretään myöskin graafisia käyriä, joista selviää jonojen viimeisimmät pituudet ja pituuksien vaihtelut.

         

1.2 Ajo- ja asennusohje

 

Ohjelma toimii MS-DOS käyttöympäristössä. Koneen on pystyttävä 640x480 pistetarkkuuteen    16 värillä. Suositeltavaa on myös, että koneen laskentateho yltää vähintään pentium tasoisen koneen tasolle.

 

Ohjelma tarvitsee toimiakseen ohjelman käynnistystiedoston olutsimu.exe ja grafiikkakirjaston egavga.bgi.

 

Ohjelmasta on myöskin käynnistystiedoston ja grafiikkakirjaston lisäksi ohjelmakoodi, muutoksia varten. Tiedosto on olutsimu.pas  ja siitä saa tehtyä käynnistystiedoston turbo pascalin komennolla tpc olutsimu.pas.

 


2

 

1.3 Ohjelman käyttöohje

1.3.1 Komentovalikko

 

Komentovalikossa on neljä varsinaista komentoa: "Aloita simulointi alusta", "Jatka / Pysäytä simulointi", "Käynnistä / Lopeta oma tarkastelu" ja "Ohjelman lopetus". Lopuilla komennoilla voi muuttaa simuloinnin arvoja. Arvojen muuttamisesta lisää luvussa 1.3.2.

 

Komentovalikossa liikkuminen tapahtuu nuolilla ylös ja alas. Komennon suoritukseen käytetään enteriä. Komentovalikon aktiivista komentoa ympäröi musta suorakaide ja komentovalikon oikealla puolella on pienimuotoinen ohje komennon ja näppäinten käytöstä. (Katso kuva 1.)

 

Kuva 1: Komentovalikko

 

Kun komentoa ruetaan suorittamaan komentonappi painuu sisään ja nousee ylös vasta, kun komennon suoritus on tehty. Tällä on tarkoitus varmistaa, ettei käyttäjä paina nappia uudelleen, jos komennon suoritus kestää tavallista pidempään.

 

1.3.1.1 Komento: Aloita simulointi alusta

 

Komennolla nollataan simuloinnin nykyinen tilanne ja simulointi aloitetaan alusta.

Simuloinnin pystyy aloittamaan alusta vaikka simulointi olisikin käynnissä, simulointia ei siis tarvitse pysäyttää ennen uudelleenaloitusta.

 

1.3.1.2 Komento: Jatka / Pysäytä simulointi

 

Komento joko jatkaa pysäytettyä simulointia tai pysäyttää käynnissä olevan simuloinnin.

 

1.3.1.3 Komento: Käynnistä / Lopeta oma tarkastelu

 

Komento käynnistää tai lopettaa oman tarkastelun riippuen siitä, onko oma tarkastelu komennon suoritushetkellä käynnissä vai ei. Oman simuloinnin voi käynnistää, vaikka simulointi olisikin pysäytetty, tällöin oma simulointi aloitetaan simuloinnin käynnistyessä. Omasta tarkastelusta kerrotaan lisää kohdassa 1.3.3 Simuloinnin seuranta.

 

1.3.1.4 Komento: Ohjelman lopetus

 

Komento lopettaa ohjelman suorituksen, ohjelmasta voi poistua, vaikka simulointi olisikin käynnissä.


3

 

1.3.2 Komentovalikon arvojen muuttaminen

 

Komentovalikon arvoja pystyy muuttamaan kahdella eri tavalla:

 

Sivuttaisnuolilla arvoa saa lisättyä tai vähennettyä yhdellä, nuoli vasemmalle vähentää arvoa yhdellä, nuoli             oikealle lisää yhdellä. Arvo muuttuu välittömästi ja mahdollisesti käynnissä oleva simulointi jatkuu keskeytyksettä.

 

Enterillä ohjelma siirtyy syöttötilaan, jolloin simulointi on pysähdyksissä. Syöttötilassa arvon tilalle tulee syötön odotusmerkki "_" ja ohjelma odottaa syötteeksi kokonaislukua.

Luvun syöttäminen toimii yleisten tapojen mukaisesti, enterillä uusi luku hyväksytään, backspacella pyyhitään virhelyöntejä ja escillä perutaan muutokset.

 

Pienin sallittu arvo on 1 ja surin 1000. Sivuttaisnuolissa luvun ylitykset estetään hylkäämällä komento, syöttötilassa tyhjä syöte palauttaa vanhan arvon ja yritettäessä antaa suurempaa lukua kuin 1000 muutetaan luku jo syöttövaiheessa tuhanneksi.

 

Arvoja pystyy muuttamaan kesken simuloinnin, mutta muutokset eivät välttämättä tule käyttöön heti. Tarkemmat tiedot muutosten vaikutuksista löytyvät erikseen jokaisesta valikkoarvon kohdasta.

         

1.3.2.1 Tarjoilijoita

 

Tarjoilijoiden määrää muutetaan kuten kappaleessa 1.3.2 on kerrottu.

Kesken simuloinnin tarjoilijoiden lisääminen lisää heti tarjoilijoiden määriä. Poistettaessa tarjoilijoita poistetaan mahdollisimman monta vapaista tarjoilijoista, mutta jos vapaita tarjoilijoita ei ole tarpeeksi, joudutaan poistamaan loput vasta, kun he saavat työnsä tehtyä.

 

1.3.2.2 Asiakaspaikkoja

 

Asiakaspaikkojen määrää muutetaan kuten kappaleessa 1.3.2 on kerrottu.

Kesken simuloinnin asiakaspaikkojen lisäys huomioidaan välittömästi. Poistettaessa paikkoja ylimääräisiä asiakkaita ei poisteta ravintolasta, ravintolaan vain ei päästetä uusia asiakkaita ennenkuin ravintolassa on taas vapaita paikkoja.

 

1.3.2.3 Asiakkaiden saapumisväli

 

Asiakkaiden saapumisväliä muutetaan kuten kappaleessa 1.3.2 on kerrottu.

Saapumisväli kertoo kuinka usein uusia asiakkaita saapuu jonottamaan ravintolaan.

Merkintä "1.." kertoo, että saapumisväli on tasaisesti jakautunut annetulle välille (1..x).

Kesken simuloinnin muutos huomioituu heti.

 

1.3.2.4 Sisäänpääsyn jonotusaika

 

Asiakkaiden sisäänpääsyn jonotusaika muutetaan kuten kappaleessa 1.3.2 on kerrottu.

Jonotusaika kertoo kuinka kauan asiakas jaksaa jonottaa, ennenkuin poistuu muualle.

Merkintä "1.." kertoo, että jonotusaika on tasaisesti jakautunut annetulle välille (1..x).

Kesken simuloinnin muutos huomioituu täysin vasta, kun kaikki vanhat jonottajat ovat joko poistuneet jonosta tai päässeet sisään.

 

1.3.2.5 Tilauksia per asiakas

 

Asiakkaiden tilauksien määrää muutetaan kuten kappaleessa 1.3.2 on kerrottu.

Arvo kertoo kuinka monta tilausta asiakas tekee, ennenkuin poistuu ravintolasta.

Merkintä "1.." kertoo, että jonotusaika on tasaisesti jakautunut annetulle välille (1..x).

Kesken simuloinnin muutos huomioituu täysin vasta, kun kaikki vanhat asiakkaat ovat poistuneet ravintolasta.


4

 

1.3.2.6 Nauttimiseen kuluva aika

 

Asiakkaiden nauttimiseen kuluvaa aikaa muutetaan kuten kappaleessa 1.3.2 on kerrottu.

Arvo kertoo kuinka kauan asiakkaalla kuluu aikaa, ennenkuin hän tekee uuden tilauksen.

Merkintä "1.." kertoo, että jonotusaika on tasaisesti jakautunut annetulle välille (1..x).

Kesken simuloinnin muutos huomioituu täysin vasta, kun kaikki asiakkaat ovat tilanneet uudelleen tai poistuneet ravintolasta.

 

1.3.2.7 Simuloinnin nopeus

 

Simuloinnin nopeutta ei muuteta kuten kappaleessa 1.3.2.

Nuoli vasemmalle vähentää simulointinopeutta, jos nopeus ei ole jo hitain mahdollinen.

Nuoli oikealle lisää simulointinopeutta, jos nopeus ei ole jo nopein mahdollinen.

Simulointinopeudessa on  7 eri nopeutta, simuloinnin nopeuden muutos huomioidaan välittömästi.

Nopeutetussa simuloinnissa graafisia näyttöjä pienennetään, jotta simulointi nopeutuu.

 

1.3.3 Simuloinnin seuranta

 

Simuloinnin aloitushetkestä lähtien seurataan ajan kulkua, kyllästyneiden jonottajien, sisäänpäässeitten jonottajien, poistuneiden asiakkaiden ja myytyjen tuotteiden määriä.

Katso kuva 2.

Kuva 2: Määrien seuranta

 

Simuloinnin alkuhetkestä lähtien seurataan myös ravintolan täyttöastetta, tarjoilijoiden työllisyysprosenttia ja keskimääräisiä jonotusaikoja.

Jokaisesta kohdasta tarkkaillaan viimeisintä arvoa, kymmenen ja sadan viimeisimmän arvon keskiarvoa. Kymmenen viimeisimmän keskiarvoa päivitetään aina kymmenen tapahtuman välein, ja sadan viimeisimmän keskiarvoa sadan välein. Lukujen alla olevat viivat kertovat, milloin lukuja päivitetään seuraavan kerran. (Katso kuva 3.)

 

Omalle tarkkailulle on myöskin jokaisessa tarkkailtavassa kohdassa oma sarake, jos oma tarkkailu on päällä, lasketaan siihen oman tarkkailun aloitushetkestä lähtien keskiarvoa. Jos oma tarkkailu ei ole päällä, oma tarkkailusarake on tyhjä. (Katso kuva 3.)

 

Kuva 3: Keskiarvoiset tarkkailut

 

Simuloinnista piirretään myöskin graafisia käyriä, joista selviää jonojen viimeisimmät pituudet ja pituuksien vaihtelut. Normaalinopeudella ja sitä hitaammilla simulointinopeuksilla graafinen käyrä kertoo 430 viimeisimmän aikasykäyksen jonojen pituudet. Normaalia simulointinopeutta nopeammilla simulointinopeuksilla grafiikka-aluetta pienennetään, jollon simulointi toimii nopeammin.

Jokaisen käyrän oikeassa reunassa on näkyvissä piirtoalueen suurin ja pienin arvo sekä selite, minkä jonon pituutta käyrä kuvaa. (Katso kuva 4.)


5

 

Kuva 4: Graafinen tarkkailu

 

1.4 Virheilmoitukset ja rajoitukset

 

Ohjelmassa on kolme varsinaista virheilmoitusta, joista kaksi ensimmäistä voivat tulla vain ohjelman käynnistyksen yhteydessä ja kolmas virheilmoitus kertoo ohjelmointivirheestä. Viimeisin virheilmoitus on vain informaatioluontoinen virheilmoitus, joka ei estä simuloinnin jatkamista:

 

Virheilmoitus:    Grafiikkatilan alustusvirhe: <Kääntäjän generoima grafiikkatilan alustusvirhe>

Tilanne:              Ohjelma ei saanut alustettua grafiikkatilaa, joten ohjelman suoritus päättyy.

Toimenpiteet:    Varmista, että näyttö ja näyttökortti pystyvät 640x480 pistetarkkuuteen 16 värillä.

 

Virheilmoitus:    Grafiikkavirhe: Haluttu tila 640x480

                            Nykyinen tila ___x___

Tilanne:              Ohjelma sai alustettua grafiikkatilan, mutta pistetarkkuus ei ole oikea.

Toimenpiteet:    Varmista, että näyttö ja näyttökortti pystyvät 640x480 pistetarkkuuteen 16 värillä.

 

Virheilmoitus:    Simulointivirhe, tyhjästä jonosta yritettiin poistaa alkiota

Tilanne:              Simuloinnin suorituksessa on tapahtunut virhe, jonka takia ohjelman suoritus on

                            lopetettu.

Toimenpiteet:    Jos ohjelma aiheuttaa tämän virheilmoituksen, ota yhteyttä ohjelman valmistajaan.

 

Vriheilmoitus:    YLIVUOTO

Tilanne:              Simuloinnin tarkkailumuuttujan arvo on vuotanut yli, joten arvoa ei voi enää

                            tulostaa näytölle. Varsinainen simulointi toimii ylivuodon sattuessakin normaalisti,

                            virheilmoituksen tarkoituksena on siis vain estää virheellisten tarkkailuarvojen

                            näyttäminen.

Toimenpiteet:    Ylivuodon sattuessa simulointia on suoritettu hyvin pitkään ja olisi suotavaa aloittaa

                            simulointi alusta. Jos ylivuoto tapahtui oman tarkastelun sarakkeissa, riittää pelkkä

                            oman tarkastelun uudelleenkäynnistys, jolloin tarkkailumuuttuja nollaantuu.

 

Simuloinnin rajoitukset:

 

Komentovalikon arvot on rajoitettu yhdestä tuhanteen.


6

 

2 Ohjelman toiminta ja rakenne

2.1 Järjestelmän yleiskuvaus ja ratkaisutapa

 

Ohjelman toiminnallisen ytimen muodostavat linkitetyt listat, joista käsittelyrutiineilla siirretään listojen alkioita jonosta toiseen.

 

Kuva 5 kertoo alkioiden siirrot ja siirron toteuttavat rutiinit. keltaisella alueella alkiot kuvaavat tarjoilijoita, muualla asiakkaita.

Aikaharpaus päivittää jokaisen alkion odotustietoja ja tekee uusia asiakkaita pihajonoon.

Pihajonon käsittely siirtää aasiakkaita tilausjonoon, jos ravintolassa on tilaa, tai poistaa asiakkaita jonosta, jos asiakas on ollut liian monta aikasykäystä pihajonossa (ts. kyllästynyt jonottamaan).

Tilausjonon käsittely siirtää tilausjonosta asiakkaan maksujonoon, jos huilausjonosta pystytään siirtämään tarjoilija tekojonoon, tämä kuvaa asiakkaan tekemää tilausta.

Tekojonon käsittely siirtää tarjoilijoita takaisin huilausjonoon, kun tarjoilija on odottanut jonossa tarpeeksi pitkään (ts. saanut tuotteen valmistettua).

Maksujonon käsittely siirtää asiakkaan maksujonosta juomajonoon kun asiakas on odottanut maksujonossa tarpeeksi pitkään (ts. saanut tilauksensa).

Juomajonon käsittely siirtää asiakkaan juomajonosta joko tilausjonoon tai poistaa asiakkaan, riippuen siitä, tilaako asiakas vielä. Asiakas on juomajonossa niin pitkään, kunnes tuotteen nauttimiseen kuluva aika on mennyt.

 

Käsittelyrutiinit sisältävät myös tarkkailutietojen päivityksiä.

 

Kuva 5: Jonojen käsittely


7

 

2.2 Tärkeimmät tietorakenteet

2.2.1 Linkitetyt listat ja listan alkiot

 

Linkitetyt listat pitävät sisällään alkioita, joita ohjelma siirtelee jonosta toiseen kappaleessa 2.1 kerrotulla tavalla.

Linkitettyjä listoja on viisi: PihaJono, TilausJono, MaksuJono, JuomaJono, HuilausJono ja TekoJono.

Jokainen lista koostuu samantyyppisistä alkioista. Yksittäinen alkio sisältää linkin seuraavaan alkioon ja tiedot kuinka kauan alkio on jonottanut, kuinka kauan alkio vielä jonottaa ja kuinka monta tilausta asiakas vielä tekee. Tarjoilijoiden listoissa alkioilla ei tarvitsisi olla tuota viimeistä tietokenttää, mutta listojen käsittely on huomattavasti helpompaa, jos jokainen lista koostuu samanlaisista alkioista.

 

2.2.2 Taulukot

 

Taulukoita käytetään tarkkailtavien kohtien arvojen säilyttämiseen.

 

Simuloinnin aloitushetkestä lähtien seurataan ajan kulkua, kyllästyneiden jonottajien, sisäänpäässeitten jonottajien, poistuneiden asiakkaiden ja myytyjen tuotteiden määriä. Nämä tiedot säilytetään  taulukossa "maarat[1..5]" edellä luetellussa järjestyksessä.

 

Simuloinnin alkuhetkestä lähtien seurataan myös ravintolan täyttöastetta, tarjoilijoiden työllisyysprosenttia, keskimääräisiä jonotusaikoja ulko-ovella ja tiskillä, sekä tilauksen valmistumisen keskimääräistä odotusaikaa.

Jokaisesta kohteesta tarkkaillaan viimeisintä arvoa, 10 viimeisimmän arvon keskiarvoa, 100 viimeisimmän arvon keskiarvoa ja käyttäjän valitsemasta kohdastakin lähtien voidaan laskea keskiarvoa. Viimeisintä arvoa ei tarvitse säilöä, koska se pystytään tulostamaan välittömästi. Muut tiedot säilytetään 2 -ulotteisessa taulukossa "tarkkailtavat[1..5, 1..6]". Ensimmäinen sarake kertoo seurattavan kohteen, toisen  sarakkeen perusteella taulukosta löytyvät seuraavat tiedot:

[X,1]    Viimeisimpien arvojen yhteenlaskettu arvo (10 viimeisimmän arvon laskemiseen).

[X,2]    Laskuri, joka kertoo, milloin 10 arvoa on laskettu yhteen.

[X,3]    Viimeisimpien arvojen yhteenlaskettu arvo (100 viimeisimmän arvon laskemiseen).

[X,4]    Laskuri, joka kertoo, milloin 100 arvoa on laskettu yhteen.

[X,5]    Oman tarkkailun aloittamisesta lähtien saatujen arvojen yhteenlaskettu arvo.

[X,6]    Oman tarkkailun aloittamisesta lähtien saatujen arvojen lukumäärä.

Laskureitten perusteella siis tiedetään, milloin oikea määrä lukuja on saatu, jotta uusi arvo voidaan kirjoittaa näytölle ja muuttujat voidaan nollata.

 

Simuloinnista piirretään myöskin graafisia käyriä, joista selviää jonojen viimeisimmät pituudet ja pituuksien vaihtelut. Näiden käyrien tiedot säilytetään taulukossa "tilastot[0..tilastopituus, 1..5]". Jälkimmäinen sarake kertoo, mistä käyrästä on kyse ja ensimmäisen sarakkeen 0:s arvo kertoo käyrän suurimman arvon ja loput arvot ovat käyrän uudelleenpiirtämistä varten.


8

 

2.2.3 Muuttujat

 

Muuttuja:                 Selite:

tarjoilijoita                Ravintolassa työskentelevien tarjoilijoiden määrä.

paikkoja                    Ravintolan asiakaspaikkojen määrä.

saapumisvali            Asiakkaiden saapumisväli ravintolan jonoon on tasaisesti jakautunut välille

                                   (1..saapumisvali).

odotusaika               Asiakkaiden jonotusaika ulko-ovella ennen kyllästymistä on tasaisesti

                                   jakautunut välille (1..odotusaika).

tilauksia                    Asiakkaiden tilausten määrä on tasaisesti jakautunut välille (1..tilauksia).

tilaustiheys              Tuotteen nauttimiseen kuluva aika on tasaisesti jakautunut välille

                                   (1..tilaustiheys).

uusijonottaja           Määrittelee, milloin uusi asiakas tulee ravintolan jonoon.

kyllastyneet             Laskee kyllastyneiden asiakkaiden määriä yhdellä aikavälillä.

simuloidaanko         Kertoo, onko simulointi käynnissä, vai ei.

simulointinopeus    Simulointinopeuden määräävä muuttuja.

rullauspoisto           Kertoo kuinka monta arvoa jätetään piirtämättä graafisista käyristä (määrittää

                                   simuloinnin nopeuden).

valikko                      Käyttäjävalikon aktiivinen kohta.

tilastokohta              Käytetään graafisten käyrien arvojen tallennuksessa.

 

2.2.4 Vakiot

 

Tilastopituus vakio määrittelee, kuinka suuren taulukon ohjelma varaa graafisten käyrien arvojen säilytykseen, vakio määrittelee myös sen, kuinka isot graafiset käyrät piirretään normaalilla simulointinopeudella. Arvon muuttamista ei suositella, koska käyrät eivät välttämättä piirry oikein eri arvolla.

 

Virkistysviivan_vari vakio kertoo, minkä värinen on harvaan päivitettävien lukujen alla oleva viiva, joka kertoo milloin lukuja seuraavan kerran päivitetään.


9

 

2.3 Määrittely- ja kutsurakenne

 

Kuvassa 6 on ohjelman kutsumatriisi, joka kertoo mitä aliohjelmakutsuja proseduurit sisältävät. Aliohjelmakutsuissa välitettävistä parametreista kerrotaan jokaisen aliohjelman kohdalla erikseen (Luvut 2.4.1 - 2.4.16).

 

Kuva 6: Kutsumatriisi

 

2.4 Ohjelman toiminta

 

Linkitettyjä listoja ohjelmassa käsittelee yhdeksän aliohjelmaa. Kolmella ensimmäisellä (Lisaa, Poista ja Pituus)  käsitellään yksittäisiä jonoja. Jonojenkäsittelyaliohjelmat yhdessä aikaharppausaliohjelman kanssa suorittavat simuloinnin.

Simuloinnista käyttäjälle näkyvä informaatio tulostetaan aliohjelmilla LisaaMaariin, TarkkailuPaivitys ja GrafiikkaPaivitys.

Ohjelman ja simuloinnin alustamiseen käytetään aliohjelmia AlustaOhjelma, AlustaSimulaattori, NollaaGrafiikka ja EiTarkkailla.

Valikon tilanteen muutokset toteutetaan aliohjelmilla ValikkoKohta ja ValikkoArvo.

Käyttäjän ja ohjelman kommunikoinnista huolehtii aliohjelmat NappaimenKasittely ja KysyArvo.

Grafiikkatilan alustuksen suorittaa aliohjelma Grafiikkatilaan.

Aliohjelmalla Box piirretään kolmiulotteisia suoraikaiteita.

Aliohjelmalla PiirraTausta piirretään ohjelman taustakuva.

 

Pääohjelmasta ja aliohjelmista kerrotaan lisää luvuissa 2.4.1 - 2.4.16.

 

2.4.1 Pääohjelma

 

Pääohjelman alussa alustetaan muuttujat, grafiikkatila ja piirretään taustakuva. Sen jälkeen ikuisessa silmukassa suoritetaan simulointia kutsumalla AikaHarppaus proseduuria. Simulointisykäyksien välissä tarkastetaan onko käyttäjä painanut  jotain nappia, jos on, kutsutaan NappaimenKasittely proseduuria.


10

 

2.4.2 Aliohjelma Lisaa

 

Proseduurilla lisätään linkitetyn listan perään uusi alkio. Parametreina annetaan osoitin linkitettyyn listaan ja lisättävän alkion tiedot.

 

2.4.3 Aliohjelma Poista

 

Proseduurilla poistetaan linkitetystä listasta alkio. Parametreina annetaan osoitin linkitettyyn listaan ja poistettavan alkion osoitin. Jos linkitetty lista on tyhjä,  aiheuttaa aliohjelma virheilmoituksen ja poistuu ohjelmasta. Jos poistettavaa alkiota ei ole linkitetyssä listassa aliohjelma ei tee listalle mitään.

 

2.4.4 Aliohjelma Pituus

 

Fnktio saa parametrina osoittimen linkitetyn listan alkuun ja palauttaa listan pituuden.

Jos parametrina annetaan jokin linkitetyn listan alkio, palauttaa funktio listan pituuden, kuin annettu alkio olisi listan ensimmäinen alkio.

 

2.4.5 Aliohjelma TekoJononKasittely

 

Proseduuri siirtää kaikki tilauksensa valmiiksi tehneet tarjoilijat TekoJonosta HuilausJonoon.

 

2.4.6 Aliohjelma MaksuJononKasittely

 

Proseduuri siirtää kaikki asiakkaat, joiden tilaus valmistui MaksuJonosta JuomaJonoon ja heiltä vähennetään jäljelläolevien tilausten määrää yhdellä.

 

2.4.7 Aliohjelma TilausJononKasittely

 

Proseduuri käsittelee mahdollisimman monta tilausta, tilausten käsittelyssä käytetään seuraavaa algoritmiä:

Varmistetaan että TilausJonossa ja HuilausJonossa on kummassakin vähintään yksi alkio, jolloin vapaalla tarjoilijalla on siis tilaava asiakas. Asiakkaalle arvotaan tilattava tuote, tarjoilija siirretään HuilausJonosta TekoJonoon tuotetta tekemään ja asiakas siirretään TilausJonosta MaksuJonoon odottamaan tuotteen valistumista. Tätä jatketaan niin kauan, kunnes TilausJonosta tai HuilausJonosta ei löydy yhtään alkiota.

 

2.4.8 Aliohjelma JuomaJononKasittely

 

Proseduuri siirtää tilauksensa nauttineet asiakkaat JuomaJonosta TilausJonoon, jos asiakas tekee vielä tilauksia. Jos asiakas ei enää tilaa, poistetaan asiakas JuomaJonosta ja kasvatetaan poistuneiden asiakkaiden määrää yhdellä.

 

2.4.9 Aliohjelma PihaJononKasittely

 

Proseduuri päästää pihalta mahdollisimman monta asiakasta ravintolaan ja poistaa kyllästyneet asiakkaat jonosta. Ravintolaan päässeet asiakkaat siis siirretään PihaJonosta TilausJonoon ja heille arvotaan tilausten määrä. Kyllästyneet asiakkaat poistetaan PihaJonosta ja kasvatetaan kyllästyneiden asiakkaiden laskuria.

 

2.4.10 Aliohjelma AikaHarppaus

 

Proseduuri kutsuu TekoJonon-, MaksuJonon-, Tilausjonon-, JuomaJonon- ja PihaJononKäsittely aliohjelmia. Huolehtii uusien asiakkaiden lisäämisestä PihaJonoon ja kasvattaa jokaisen jonon odotusaikoja.

 

11

 

2.4.11 Aliohjelma LisaaMaariin

 

Proseduuri kasvattaa simuloinnin aloitushetkestä lähtien seurattavia muuttujia ja tulostaa kasvatetun arvon näytölle, parametrina välitetään kasvatettavan kohdan järjestysnumero. Parametrin arvon on oltava välillä 1-5, muuten proseduuri yrittää koskea taulukon "maarat" ulkopuolelle. Muuttujan kasvatuksen yhteydessä tarkistetaan, ettei luku vuotanut yli. Parametrilla 1 kasvattetaan simuloinnin aikaa ja parametrilla 5 myytyjen tuotteiden määrää (Katso kuva 2 luvusta 1.3.3).

 

Normaalisti lukujen ylivuodon tarkastelussa luku on vuotanut yli, jos se on negatiivinen. Tässä tapauksessa luku on vuotanut yli, jos se on pienempi kuin -1. Tämä sen takia, koska luvut nollataan asettamalla luvun arvoksi -1 ja kutsumalla tätä aliohjelmaa, tällöinhän aliohjelma tulostaa luvun 0.

 

2.4.12 Aliohjelma TarkkailuPaivitys

 

Proseduuri päivittää tarkkailumuuttujia ja tulostaa muutetun kohdan arvot näytölle, parametreina välitetään päivitettävän kohdan järjestysnumero ja uusi arvo. Parametrin arvon on oltava väliltä 1-5, muuten proseduuri yrittää koskea taulukon "tarkkailtavat" ulkopuolelle. Tarkkailumuuttujien kasvatuksen yhteydessä tarkistetaan, ettei luku vuotanut yli. Ylivuodon tarkistukset 10 ja 100 viimeisimmän keskiarvon kohdalla voisi todennäköisesti jättää pois, koska vain pihajonon pituuden keskiarvon laskeminen voi aiheuttaa ylivuodon ja pihajonon pituuden pitäisi tällöin olla epärealistisen suuri. Parametrilla 1 päivittetään ravintolan täyttöastetta ja parametrilla 5 tilausta odottavien määrää (Katso kuva 3 luvusta 1.3.3).

 

2.4.13 Aliohjelma GrafiikkaPaivitys

 

Proseduuri päivittää graafisia käyriä, uusimmat arvot haetaan jonojen pituuksien  ja muuttujan "kyllastyneet" avulla.

 

2.4.14 Aliohjelma NappaimenKasittely

 

Proseduuri lukee käyttäjän painaman näppäimen ja suorittaa tarvittavat toimenpiteet. Aliohjelmaa on siis tarkoitus kutsua vasta, kun käyttäjä on painanut jotain näppäintä, muutoin aliohjelma jää odottamaan näppäimen painamista.

 

Ensin aliohjelmassa selvitetään näppäimen aiheuttaman komennon numero seuraavasti:

Komentovalikon ylin komento on 0 ja alin 10.

-(n+1):    0 >= n >= 6:     valikon komennon n kohdalla on painettu nuolta vasemmalle.

n+1:        0 >= n >= 6:     valikon komennon n kohdalla on painettu nuolta oikealle.

12:                                    painettu nuolta ylös.

13:                                    painettu nuolta alas.

n+21:  0 >= n >= 10:       valikon komennon n kohdalla on painettu enteriä.

 

Näin on jokainen toiminto saatu yksilöllisesti numeroitua, jolloin toiminnot voidaan suorittaa case-lauseen sisällä.

 

2.4.15 Aliohjelma KysyArvo

 

Proseduuri pyytää käyttäjältä uutta arvoa valikon arvoihin, parametreina välitetään päivitettävän arvon järjestysnumero ja vanha arvo. Kysyttävä arvo on kokonaisluku, joten proseduuri hyväksyy vain lukuja, jos syötettävä arvo ylittää ylärajan tuhat, niin arvo muutetaan jo syöttövaiheessa tuhanneksi. Jos käyttäjä yrittää palauttaa tyhjää arvoa tai painaa esciä palauttaa proseduuri vanhan arvon.


12

2.4.16 Muut aliohjelmat

 

AlustaOhjelma

      Alustaa linkitetyt listat, asettaa yleiset muuttujat alkuarvoihinsa, aliohjelmien avulla piirtää

      taustakuvan ja valikon muuttujat.

 

AlustaSimulaattori

      Tyhjentää linkitetyt listat, asettaa oikean määrän tarjoilijoita huilausjonoon sekä nollaa

      tarkkailumuuttujat.

 

NollaaGrafiikka

      Nollaa Graafiset käyrät .

 

EiTarkkailla

      Tyhjentää "oma tarkkailu" sarakkeiden arvot.

 

ValikkoKohta

      Saa parametreinä valikon kohdan ja napin tyylin. Piirtää valikon napin joko normaaliksi,

      valituksi tai alaspainetuksi ja päivittää ohjekentän.

 

ValikkoArvo

      Saa parametreinä valikon kohdan ja tulostettavan arvon. Tulostaa annetun valikon napin

      arvokenttään annetun arvon.

 

Grafiikkatilaan

      Siirtää ohjelman tekstimodista grafiikkatilaan tai antaa virheilmoituksen grafiikkatilaan

      siirtymisen epäonnistumisesta ja pysäyttää ohjelman suorituksen.

 

Box

      Saa parametreinaan suorakaiteen vasemman yläkulman ja oikean alakulman koordinaatit ja

      kolme väriä, ensimmäisellä värillä väritetään suorakaiteen vasen- ja yläreuna, jos keskimmäinen

      väri on positiivinen väritetään suorakaide sillä värillä sisältä ja viimeisellä värillä väritetään

      suorakaiteeen oikea- ja alareuna.

 

Piirratausta

      Piirtää ohjelman taustakuvan.

 

2.5 Parannusehdotuksia

 

Simuloinnin lämmittelyn olisi voinut toteuttaa jotenkin muuten, kuin "oma tarkastelu" komennolla. Tosin tähän käyttöliittymään ei olisi enää voinut lisätä  kuin oman tarkastelun sarakkeet myös ajan ja määrien tarkkailuun (Kuva 2 luvusta 1.3.3).

 

Graafisten käyrien takia jonojen käsittely pitää suorittaa käänteisessä järjestyksessä, tällöin asiakkaat joutuvat jonottamaan yhden aikayksikön, vaikka eteneminen olisi ollut mahdollista suoraan. Tämä ylimääräinen odotusaika voidaan vaikka ajatella siirtymiseen kuluvaksi ajaksi.

 

Simuloinnin olisi voinut suorittaa huomattavasti tehokkaammin, mutta tässä järjestelmässä simuloinnin nopeus ei mielestäni ole pääasia. Ja kuitenkin suurin osa ajasta kuluu graafisen käyttöliittymän päivitykseen.


13

 

3 Testaus

3.1 Tietorakenteiden käsittelyrutiinien testaus

 

Lisaa ja poista proseduurien testaus suoritettiin koodauksen yhteydessä, testaustuloksia rutiinien testauksesta ei ole, mutta rutiinien virheellinen toiminta huomattaisiin varmasti käsittelyrutiinien yhteisessä testauksessa.

 

Lisaa proseduurin toiminta testattiin kutsumalla proseduuria aina uudelleen samaan jonoon. Alussa

jono oli tyhjä ja jokaisen kutsukerran jälkeen jonon pituus kasvoi yhdellä. Tuhannennen alkion kohdalla testaus lopetettiin. Lisättävällä alkiolla oli aina yhtä suurempi järjestysnumero kuin aikaisemmalla alkiolla. Lopussa järjestysnumerot olivat nousevassa järjestyksessä, joten lisäys tapahtui aina jonon perään.

 

Poista proseduuria testattiin 50 alkion jonoihin, ensimmäisellä kerralla poista proseduurilla

poistettiin jonon ensimmäinen alkio 50 kertaa,  toisella kerralla poistettiin jonon viimeinen alkio 50 kertaa ja kolmannella kerralla arvottiin poistettava alkio. Alkioihin oli sioitettu järjestysnumerot, joten oikean alkion poistaminen pystyttiin näin varmistamaan.

 

Funktio pituus testattiin lisaa proseduurin testauksen yhteydessä.

 

Jonojenkäsittelyrutiinien testauksen testaustuloste on liitteessä 4. AikaHarppaus proseduuri tulostaa jokaisen aikaharppauksen kohdalla jonojen pituudet ja jokainen käsittelyrutiini tulostaa tekemänsä

siirrot. Parametrien muuttumiset on myöskin kirjattu testaustulosteeseen.

 

Simuloiti käynnistettiin yhdellä tarjoilijalla ja pienellä asiakkaiden saapumisvälillä, koska ravintolan tilausjonoon haluttiin kerätä ruuhka.

Ruuhkan synnyttyä tarjoilijoiden määrää nostettiin viiteen, jolloin Tilausjonon käsittelyn proseduurin toiminnan oikeellisuus saatiin testattua.

Seuraavaksi asiakaspaikkojen määrä pudotettiin kahdestakymmenestä viiteen. Näin pihajonon käsittelyn toiminta tuli testattua, pihajonosta ei päästetty asiakkaita sisään, koska ravintola oli täynnä.

Saapumisväli muutettiin (1,1):stä (1,100):aan. Välittömästi havaittiin, ettei ravintolan jonoon tullut enää uusia asiakkaita. Samalla havaittiin asiakkaiden kyllästyvän ulko-ovella jonottamiseen, joten

pihajononkäsittely osasi poistaa kyllästyneitä asiakkaita jonosta ja aikaharppaus proseduuri osasi lisätä asiakkaita pihajonoon saapumisvälin mukaisesti.

 

Simuloiti käynnistettiin uudestaan, samalla muutettiin simuloinnin parametrejä. Jonot olivat simuloinnin alussa tyhjiä, joten uudelleenkäynnistysrutiini toimi halutulla tavalla. Tämän jälkeen ruettiin jälleen kasvattamaan tilausjonoa.

Tarjoilijoiden määrää lisättiin jälleen, etukäteen jo tiedettiin tarjoilijoiden lisäämisen toimivan, mutta nyt simulointia pyöritettiin sen aikaa, että voitaisiin testata tarjoilijoiden poistamista.

Kun 5 tarjoilijasta 2 oli huilaamassa ja 3 tekemässä tuotetta, pudotettiin tarjoilijoiden määrä yhteen. Poistaminen toimi aivan kuin oli suunniteltu. Ensimmäiseksi poistettiin huilausjonosta tarjoilijoita ja loput poistettiin tekojonosta. Kaksi asiakasta saivat tilauksensa "haamutarjoilijalta" ja simulointi jatkui sen jälkeen aivan normaalisti.

 

Testaustulosteesta selviää myöskin, ettei asiakkaita tai tarjoilijoita huku matkan varrella.


 14

 

3.2 Kommunikointirutiinien testaus

 

Päävalikossa liikkuminen tapahtuu nuolilla ylös ja alas, ylimmästä kohdasta ei pääse ylemmäs ja alimmasta kohdasta ei pääse alemmas.

Valikkoarvoja voi muuttaa sivuttaisnuolilla, pienintä arvoa (1 / ---I) ei voi enää pienentää ja suurinta arvoa (1000 / I+++) ei voi suurentaa. Komentojen kohdalla sivuttaisnuolet eivät aiheuta toimintoja.

Valikkoarvojen kohdalla enter pyytää uutta lukua, simulointinopeuden kohdalla enterillä ei tapahdu mitään. Komentojen kohdalla enterillä hyväksytään komento.

Muita näppämiä ei käsitellä komentovalikon kohdalla.

 

Komentovalikon arvon muuttamisessa hyväksytään numeronäppäimet, backspace, enter ja esc.

Numeronäppäimillä nykyinen arvo kerrotaan kymmenellä ja numeronäppäimen arvo lisätään lukuun. Luvun ylittäessä tuhannen, luku muutetaan tuhanneksi.

Backspace jakaa luvun kymmenellä ja ottaa jäljelle jäävän kokonaisluvun uudeksi luvuksi. Vaikka tyhjästä luvusta yritetään pyyhkiä merkkejä pois on luku siis edelleenkin 0.

Enter hyväksyy luvun, jos se ei ole nolla. Luvun ollessa nolla enter toimii kuten esc.

Esc palauttaa luvuksi luvun vanhan arvon.

Muita näppäimiä ei käsitellä.

 

3.3 Tarkkailurutiinien testaus

 

Proseduuria LisaaMaariin ei testattu kuin ylivuodon osalta. Normaalisti proseduuri kasvattaa muuttujaa yhdellä, mutta testauksessa muuttujaa kasvatettiin paljon suuremmalla arvolla ja simulointia suoritettiin niin pitkään, että jokainen luku oli vuotanut yli.

 

Proseduuri TarkkailuPaivitys testattiin ylivuodon osalta kertomalla parametrina saatu luku sopivalla arvolla, jolloin ylivuotoja tapahtui huomattavasti nopeammin, kuin normaalissa simuloinnissa.