Diskreetne sündmuspõhine simulatsioon

**Diskreetne sündmuspõhine simulatsioon** modelleerib süsteemi tööd kui lõplikku sündmuste jada ajas . Iga sündmus toimub kindlal ajahetkel ning tähistab süsteemi oleku muutust . Tavaliselt kasutatakse aja arvestamiseks sündmuspõhist ajakulgu, sest võib arvestada, et järjestikuste sündmuste vahel süsteemis muutusi ei toimu ning seetõttu võib simulatsiooni aeg automaatselt järgmise sündmuse toimumise juurde hüpata.

Lisaks sündmuspõhisele ajakulgemisele on olemas alternatiivne lähenemine, mida nimetatakse astmelist ajakulgu, kus aeg on jagatud väikesteks ühikuteks ning süsteemi olekut uuendatakse vastavalt sündmustele, mis selles ajaühikus juhtuvad . Kuna iga ajahetke ei ole vaja simuleerida, siis sündmuspõhise ajakulgemisega simulatsioon on tavaliselt palju kiirem kui vastav astmelise ajakulgemisega simulatsioon.

Mõlemad diskreetse sündmuspõhise simulatsiooni vormid vastanduvad pidevsimulatsiooniga, kus süsteemi oleku muutusi jälgitakse pidevalt aja kulgedes, tavaliselt diferentsiaalvõrranditel põhinevate arvutusute põhjal .

## Näide
Üks hea viis, kuidas seletada diskreetse sündmuspõhise simulatsiooni toimimist, on modelleerida järjekorda, näiteks kui kliendid saabuvad restorani ning ootavad teenindamist. Sel juhul süsteemi olemid oleks klientide järjekord ja teenindajad. Süsteemi sündmused oleks kliendi saabumine, kliendi teenindamine ja kliendi lahkumine. Süsteemi olekud, mida need sündmused muudavad, oleks näiteks klientide arv järjekorras ja teenindaja staatus (hõivatud või vaba). Muutujad, millest süsteemi töö sõltub, on näiteks kui palju teenindamisele aega kulub ning kui kaua aega kliendid restoranis viibivad.

## Mudel
Simuleeritava süsteemi mudel koosneb mitmetest komponentidest.

### Olek
Süsteemi olekud on muutujad, mis hoiavad vajalikku infot süsteemi uurimiseks. Süsteemi olekud võivad aja jooksul muutuda sündmuste toimumisel.

### Aeg
Simulatsioon peab sündmuste toimimiseks arvestama aja kulgu, kas siis sündmuspõhiselt või astmeliselt.

### Sündmused
Mudelis hoitakse vähemalt ühte sündmuste järjendit. Selles järjendis on eelseisvad sündmused, mida põhjustasid eelnevad sündmused ning mida ennast pole jõutud veel simuleerida. Sündmust kirjeldab aeg, millal ta juhtub ning tüüp, mille põhjal jooksutatakse vastavat koodi, mis sündmust simuleerib.

Kui sündmused toimuvad hetkeliselt, siis tegevused, mis kestavad pikemat aega modelleeritakse sündmuste järjekorrana. Mõned sündmused võivad kesta ka intervallina, sel juhul on sündmuse juures ära märgitud algus- ja lõppaeg.

Sündmuste järjend on tavaliselt prioriteet-järjekord, mis on sorteeritud sündmuste algusaja põhjal . Seetõttu on alati teada, mis on järgmine sündmus ning süsteemi aeg võib otse hüpata vastavalt järgmise sündmuseni.

Tavaliselt lisatakse sündmuste järjendisse uusi sündmusi dünaamiliselt vastavalt simulatsiooni kulgemisele. Simulatsiooni käivitamiseks on üldiselt algsed sündmused varem ette määratud.

### Juhusliku arvu generaator
Simulatsioonil on üldiselt vaja genereerida erinevaid juhuslikke muutujaid, vastavalt võimalikkudele sündmustele. 

### Statistika
Simulatsioon kogub andmeid süsteemi toimimise kohta, mis on määratud vastavalt uurimisprobleemile. Restorani näitel oleks see näiteks keskmiste ooteaegade uurimiseks, mida saaks ära kasutada töögraafikute koostamisel. Simulatsioonis saadakse andmeid korduva simulatsiooni jooksutamisel saadud keskmiste tulemuste põhjal.

### Lõppolek
Simulatsiooni lõppemiseks peab otsustama, millal simulatsiooni töö lõpetada. Tavaliselt on selleks lihtsalt kas ajaline limiit või sündmuste arvu limiit. 

## Simulaatori loogika
Simulaatori töö näeb välja umbes selline:

### Algus
* Väärtusta lõppolek vääraks
* Väärtusta süsteemi oleku muutujad
* Väärtusta süsteemi algaeg
* Lisa algsündmused sündmuste järjendisse

### Töö
* Määra süsteemi ajaks järgmise sündmuse algusaeg
* Simuleeri järgmine sündmus ning eemalda see sündmuste järjendist
* Uuenda kogutud andmeid
* Jooksuta tsüklit kuni lõppoleku saabumiseni

### Lõpp
* Genereeri simulatsiooni aruanne

## Kasutusalad
Sellist simulatsiooni võib kasutada igas valdkonnas, kus on vaja mingit tegevust optimeerida. Selleks võib olla näiteks tootmise kitsaskohtade leidmine, töögraafikute optimeerimine vastavalt nõudlusele, arvutivõrgu testimine või mängudes tulemuse maksimeerimine.

## Viited