Simulointi Simulointi Johdanto Simulointi ~ jäljittely Pyrkii kuvaamaan tutkittavan ilmiön tai systeemin oleellisia piirteitä mallin avulla. Systeemin rajaus ja tarkasteltavat piirteet määriteltävä ennen mallin kiinnittämistä ja simulointia. Malli sisältää kolme mallia: Systeemin tuloksen tarkasteltavat ominaisuudet Systeemin (mallinnettu) syöte Systeemin toiminnallinen malli Mallit Malleja voidaan luokitella eri tavoin Konkreetti/abstrakti pienoismalli vs tietokonemalli Deterministinen/stokastinen Tunnettu vs. satunnainen data Analyyttinen/numeerinen Ratkaisulle kaava vs likimääräisratkaisu Jatkuva/diskreetti Ääretön vs äärellinen määrä tiloja ja muutoksia Esimerkkejä Vino heittoliike Yhtälöt ja alkuarvot tunnetaan, ratkaisulle esitys kaavana (deterministinen/analyyttinen) Tykin ammus Yhtälöt monimutkaisemmat (ilmanvastuksen ja tuulen osuus), lähtönopeus ja tuuli epätarkkoja Edellyttää numeerista ratkaisua, epävarmuuden arviointi tärkeää (stokastisuus) Esimerkkejä Game of life Deterministiset säännöt, äärellinen määrä sääntöjä ja solujen tiloja (deterministinen, diskreettiaikainen) Kassajono Diskreetti (äärellinen määrä tiloja/tapahtumia), Stokastinen (ajoista vain tilastollista dataa) Joskus analyyttinen (lauseke halutulle ominaisuudelle) Kurssirunko Kurssi painottuu äärellisiin, stokastisiin malleihin (ns. discrete event) ja niiden numeerisiin simulointeihin. Esitietoina todennäköisyyslaskennan ja tilastotieteen perusteita sekä olioohjelmointia.
Luentorunko Esimerkki Johdanto Simulointiparadigmat Tapahtumapohjainen simulointi Oliopohjainen simulointi Satunnaisluvut Monte Carlo Tasapainotilan simulointi Varianssin hallinta Kokeensuunnittelu ja Metamallinnus (Auton) pesuautomaatti Tarjolla kaksi erilaista mallia (hinta, operointikustannus ja kapasiteetti poikkeavat). Tiedossa potentiaalinen asiakasvirta. Kumpi malli on kannattavampi (ja onko kumpikaan kannattava). Arvioitava tuotto/aikayksikkö Esimerkki Tuotto/aikayksikkö P= au b b = kiinteät kulut/aikayksikkö a = tuotto/aikayksikkö pesun aikana U = käyttöaste a ja b tunnetaan tai ovat arvioitavissa U määrättävä simuloinnin avulla Esimerkki Tilanteesta tunnetaan Potentiaalisten asiakkaiden käyttäytyminen (tuloaikojen jakauma) Maksimaalinen jonon pituus Palvelutapahtuman kesto(n jakauma) Haluttu tulos Käyttöaste U =T_busy/T_total Tai 1 T_idle/T_total Tai eri varianttien käyttöasteiden erotus Esimerkki Tila kuvattavissa yhdellä muuttujalla N(t)= asiakkaiden määrä hetkellä t Systeemin tilaan kohdistuu kahden tyyppisiä tapahtumia Tulo: uusi asiakas (i) saapuu hetkellä t= t_a(i) Lähtö: asiakas (j) poistuu hetkellä t= t_d(j) Jos N=0, systeemi on tyhjä (asema ei käytössä). = > Simuloinnissa selvitettävä ajat, jolloin N=0 (tai N>0). Esimerkki Jos N(0) ja t_a:t ja t_d:t tunnetaan, N(t) on yksikäsitteisesti määrätty ja laskettavissa. Tulo- ja lähtöaikojen määrääminen edellyttää systeemin simulointia. Neljä muuttujaa + laskurit AT, DT (seuraavat tulo- ja lähtöajat) N (asiakkaiden määrä) t (nykyinen aika) E, T_idle (laskurit tyhjäajalle)
Esimerkki Esimerkki Alusta simuloinnin kesto (T), jonon pituus M. t=0, laskurit (T0=0, E=0), N=0 (tyhjä systeemi), DT=maxint AT= t+ tuloaika Toista kunnes t>t Jos AT<DT tapahtuma AT, muuten DT Raportoi tulokset AT t=at; Jos N<= M, N=N+1; Jos N=1 DT=t+ palveluaika T0=T0+t-E; AT=t+ tuloaika ; DT t=dt; N=N-1; Jos N>0 DT=t+ palveluaika Muuten DT=maxint; E=t; Esimerkki Esimerkki oli brute force lähestyminen hyvin yksinkertaiseen tapaukseen. Yleistettävyys monimutkaisempiin tilanteisiin on huono useampia tapahtumatyyppejä, monimutkaisempi tila, asiakkaiden seuraaminen. Kaikki tehdään itse Tietojen keruu, kirjanpito tapahtumista ja systeemin tilasta, jne. Simuloinnin vaiheet 1 Systeemin/ongelman tunnistaminen Miten rajata tarkastelu, mihin kysymyksiin haetaan vastausta. Mallin suunnittelu Systeemin osat ja niiden väliset vuorovaikutukset Tiedon keruu ja parametrien arviointi Mistä saadaan realistiset syöttötiedot (paljon kovaa työtä ja mittausta) Simuloinnin vaiheet 2 Ohjelman suunnittelu Mallin logiikan ja tarvittavien käsitteiden kuvaaminen Ohjelman toteutus Simulaattorin koodaus Ohjelman testaus Koodin debuggaus Simuloinnin vaiheet 3 Mallin validointi Mallin laadullinen analyysi (vertailut havaittuun, intuitiivisiin odotuksiin, yksinkertaistetut tilanteet, tulosten riippuvuus epävarmoista parametreista) Mallin kokeilu Ensimmäiset tuotantoajot, tulosten tarkkuus/luotettavuus, tuotantokokeiden suunnittelu. Tulosten analyysi Johtopäätökset, riski/herkkyysanalyysi, päätöksenteko ja mallipohjainen optimointi
Simuloinnin periaatteita Älä simuloi, jos ei ole pakko Analyyttiset ja deterministiset ratkaisut ensisijaisia Älä simuloi, jos et ymmärrä mikä on kysymys Tavoitteen vaihto kesken mallin rakennuksen voi olla todella vaikeaa When computing starts, thinking stops! Simulointi Tapahtumapohjainen Diskreettiaikainen simulointi 1 Tarkastellaan systeemejä, joissa on äärellisen monta komponenttia. Jokaisella komponentilla äärellisen monta tilaa. Komponentit vaikuttavat toistensa tiloihin tapahtumien välityksellä. Tapahtuma on aina sidottu tiettyyn ajan hetkeen (ts. sillä ei ole kestoa). Diskreettiaikainen simulointi 2 Tapahtuma voi muuttaa tiloja, generoida muita tapahtumia (samalle ajanhetkelle tai tulevaisuuteen). Tyypillisiä rakennekomponentteja laiteresurssit (vapaa/varattu) työntekijät (vapaa/varattu) raaka-aineet (saatavuus/määrä) tuotteet (aihion saatavuus/valmistumisvaihe) Tapahtumia toimenpiteiden alut/loput Pesu-esimerkki Autopesulassa rakenneosia Pesuasema (vapaa/varattu) Jonotustila (M käytettävissä olevaa tilayksikköä) Asiakkaat (pesemätön/pesty auto) Tapahtumia Asiakkaan saapuminen/lähteminen Pesun alku/loppu Jonoon liittyminen/poistuminen Osa tapahtumista esiintyy aina yhdessä Simuloinnin osatoiminnot 1 Simulointiohjelmiston hallittava 5 toimintoa Mallin rakenteen määrittely Systeemin osat -> tilamuuttujat Osien looginen riippuvuus -> vuokaavio Tapahtumien logiikka -> koodi Satunnaisprosessit Halutun jakauman mukaiset satunnaisluvut Tilastollinen tietojenkeruu ja raportointi Luottamusvälit, visualisointi, analyysi
Simuloinnin osatoiminnot 2 Ajan hallinta kellon edistäminen Simuloinnin kokonaishallinta Simuloinnin aloitus/lopetus Tapahtumien lisäys/poisto Oikean tapahtuman aktivointi Kokeiden hallittu toisto Simuloinnin osatoiminnot 3 Osa simuloinnin toiminnoista on yhteisiä kaikille malleille ja tapauksille Ajan hallinta Satunnaisprosessit Tietojen keruu ja raportointi Osa sisältää malli- ja koeriippuvia osia Mallin rakenne ja logiikka Simulointikokeen kulku ja toisto Simuloinnin paradigmat Kolme tarkastelukulmaa simulointiin Tapahtumapohjainen Lähtökohtana samaan aikaan sidotut tilan muutokset Prosessipohjainen Samaan osasysteemiin liittyvien tapahtumien elinkaari. Aktiviteettipohjainen Osasysteemin resursseja sitovat aikaa vievät toiminnot Johtavat erilaisiin malli- ja ohjelmarakenteisiin Sopivat erilaisiin mallitustilanteisiin Tapahtumalähtöinen simulointi Keskeisinä tapahtumarutiinit Yksi rutiini per tapahtumatyyppi Sisältävät mallin logiikan Tapahtumarutiini voi muuttaa tilasuureita ja luoda uusia tapahtumailmoituksia. Tapahtumien järjestelijä kirjaa tapahtumailmoituksia (aika, tapahtuma) Yksi rutiini kerrallaan aktivoidaan. Prosessi/oliopohjainen s. Osaprosessit olioina, joilla omat tilamuuttujat ja tapahtumarutiinit. Kaikki resurssiin liittyvä toiminta yhdessä paikassa. Erilliset metodit toisten olioiden ja järjestelijän kanssa kommunikointiin. Ei erillisiä ilmoituksia. Useampi prosessi käynnissä yhtä aikaa (korutiinit, säikeistys). Aktiviteettipohjainen s. Logiikka aktiviteettirutiineissa Rutiini liittyy aina johonkin resurssiin Kaksi rajapintaa Aktivointi (jos ehdot toteutuvat, varaa resurssin ja kiinnittää lopetusajan) Passivointi: vapauttaa resurssin annettuna aikana Kaikki aktiviteetit käydään systemaattisesti läpi Jos ehdot toteutuvat, aktivoidaan. Jos yksikään rutiini ei aktivoidu, kasvatetaan aikaa seuraavaan lopetushetkeen.
Tapahtumapohjainen s. Vanhin lähestymistapa Logiikka yksi kerrallaan suoritettavissa rutiineissa Helppo toteuttaa millä tahansa proseduraalisella kielellä Logiikka fragmentoituu helposti Peräkkäiset tai toisiinsa liittyvät tapahtumat eri rutiineissa Taphtumap. pesuesim. Minimissään kaksi eri tapahtumaa (tulo ja lähtö (vrt. johdanto) Molemmat voivat varata pesuaseman ja generoida lähtötapahtuman Potentiaalinen ylläpidettävyysongelma Jako 4 atomaariseen tapahtumaan Tulo (generoi asiakkaan) Alku (varaa resurssin ja käynnistää palvelun) Loppu (vapauttaa resurssin, lopettaa palvelun) Lähtö (poistaa asiakkaan) Pesu 2 Tulo Jos jonossa on tilaa Luo uusi asiakas ja aseta jonoon Luo uusi Alku-tapahtuma Luo uusi tulotapahtuma (ja uusi tuloaika) Alku Jos palvelu vapaa ja jonossa asiakas Ota jonosta asiakas Varaa palvelu Luo Loppu-tapahtuma (uusi palvelun kesto) Pesu 3 Loppu Vapauta palvelu Luo Lähtö-tapahtuma Luo Alku-tapahtuma Lähtö Kerää asiakkaan tiedot (jos on) Poista asiakas Pesu Pesu - toteutus Tulo Alku Loppu Lähtö 4 tapahtumarutiinia (aliohjelmaa) Tapahtumia varten TapahtumaTyyppi (Tulo, Alku, Loppu, Lähtö) Kirjanpitoon TapahtumaIlmoitus(Aika, Tapahtuma) Tapahtumalista hallinnoi TapahtumaIlmoituksia Metodit SeuraavaTapahtuma LisääTapahtuma (Aika, Tapahtuma) (PoistaTapahtuma) Jono Koostuu Asiakas instansseista Metodit Lisää, Ota, Pituus Palvelee Alku-tapahtumaa Lähtö tarvitsee teknisen jonon
Pesu - pääohjelma Alustukset T=0; LisääTapahtuma(TuloAikaJakauma(),Tulo); While (T< TMax) \\ tms lopetusehto Ilmoitus=SeuraavaTapahtuma(); T=Ilmoitus.Aika; Tyyppi=Ilmoitus.Tapahtuma; CASE Tyyppi of \\ kutsutaan a.o. tapahtumarutiinia END CASE End While Tulo Tulo_Tapahtuma() Asiakas_Tyyppi_Osoitin :: Auto { LisääTapahtuma(Tulo_Aika_Jakauma(),Tulo); If Jono.Pituus() < M then Auto= Luo_Asiakas(); Jono.Lisää(Auto) LisääTapahtuma(0.,Alku) EndIf Alku Alku_Tapahtuma() Asiakas_Tyyppi_Osoitin :: Auto { If(Asema.Vapaa() and Jono.Pituus()>0) then Auto=Jono.Ota(); Asema.Varaa(Auto); LisääTapahtuma(Palvelu_Aika_Jakauma(),Loppu) Endif Loppu Loppu_Tapahtuma() Asiakas_Tyyppi_Osoitin :: Auto { Auto= Asema.Vapauta() Lähtö.Varaa(Auto) \\ Muuten asiakas hukkuu LisääTapahtuma(0.,Lähtö) LisääTapahtuma(0.,Alku) Lähtö Lähtö_Tapahtuma() Asiakas_Tyyppi_Osoitin :: Auto { Auto=Lähtö.Vapauta() // Kerää statiikkaa Poista_Asiakas(Auto) // Varaa ja Vapauta tarvitaan välittämään asiakastieto, koska jonoa ei ole. Huomioita Erilaiset jonotusstrategiat voi piilottaa Jonon sisään. Useamman palvelun, reitityksen, asiakasvirran jne huomiointi edellyttää tapahtumien monistamista tai parametrisointia. Käytännössä palvelusta ja sen jonosta on hyvä tehdä kokonaisuus, johon asiakas reititetään.
Prosessipohjainen s. Simulointi Oliopohjainen Loogisesti yhteenkuuluvat tapahtumat kootaan yhdeksi elinkaareksi (irrallisten tapahtumarutiinien sijaan) Osakokonaisuuksien hahmottaminen helpompaa Hallittava useamman samanaikaisen elinkaaren koordinointi Mahdollisesti useampia instansseja samasta elinkaaresta/prosessista. Asiakasprosessi Pesuesimerkissä jokaisella asiakkaalla on selkeä elinkaari. Esimerkki voidaan mallittaa yhdellä prosessilla, josta tehdään kopio jokaista asiakasta kohden. Miten hoidetaan useampi rinnakkainen asiakasprosessi, jos ohjelmointikieli ei tue rinnakkaisuutta. Asiakasprosessi Elinkaari on jaettava vaiheisiin (tapahtuma per vaihe), joihin voidaan viitata ja jonka prosessi-instanssi muistaa. Tapahtumalistassa aika ja viittaus prosessi-instanssiin (ja vaiheeseen). Simuloinnin pääohjelma Lukee tapahtumalistaa. Kutsuu seuraavaa prosessi-instanssia suorittamaan seuraavan vaiheensa. Asiakasprosessi AsiakasProsessi(Phase) VaiheTyyppi :: Phase CASE Phase Tulo { Auto = new Asiakas \\ Kutsuu seuraavan asiakkaan Auto.Vaihe(TuloAikaJakauma(),Tulo) Jos (Jono.Pituus< m) Jono.Lisää(*this) Palvelu.Kysy() Muuten \\Jos asiakas ei pääse jonoon, se poistuu this.vaihe(0, Lähtö) Alku { this.seuraavavaihe(palveluaikajakauma()) Loppu { Palvelu.Vapauta() Palvelu.Kysy() this.seuraavavaihe(0.) Lahto { //Keraa statiikka PoistaAsiakas ENDCASE Asiakasprosessi
Palvelu Palvelu.Kysy() AsiakasTyyppi :: Auto { Jos(Palvelu.Vapaa() ja Jono.Pituus()>0) { Auto=Jono.Ota() Palvelu.Varaa() Auto.SeuraavaVaihe(0.) //Vaiheeseen Alku Analyysiä Perinteisillä kielillä on erikseen Välitettävä suorituksen vaihe Välitettävä sisäiset muuttujat Jaettava suoritus vaiheisiin Rakennettava ehdolliset elinkaaret Ohjelmointi helpottuu, jos nämä voi kapseloida prosessi-instanssin sisään -> Olio Oliosimulointi Oliot keksittiin kapseloimaan simuloitavia prosesseja (SIMULA-kieli, 1967). Perintämekanismit luotiin piilottamaan säikeistyksen edellyttämät kontrollirakenteet. Prosessien tiloille ja kommunikaatiolle on luotu vakioitu sanasto/metodit. Prosessiolion tilat Neljä mahdollista tilaa Aktiivinen (parhaillaan suoritettava) Ajastettu (scheduled) Aktivoitumisaika tiedossa eli tapahtumalistassa viite tähän olioon Passiivinen (ei tiedossa tulevia tapahtumia) Jonkin toisen olion on aktivoitava/ajastettava tämä Lopetettu (terminated, ei voida enää mitenkään aktivoida) Tilamuutokset Vain aktiivinen prosessi voi tehdä tilamuutoksia Itseensä Passivate (odottaa kunnes joku aktivoi) Hold (odottaa itse määräämänsä ajan) Terminoituu jos elinkaari päättyy Toisiin Activate (herättää passiivisen, heti tai myöhemmin) Cancel (peruuttaa ajastetun aktivoinnin) Terminate (poistaa koko prosessin) Esimerkki Pesuesimerkki voidaan toteuttaa monin eri tavoin Jako aktiivisiin suureisiin (oma elinkaari) ja muihin (metodeja, joita aktiiviset prosessit kutsuvat) voidaan tehdä monella tapaa. Aktiiviset asiakkaat, passiivinen palveluresurssi jonoineen Passiivinen asiakas ja jono, aktiivinen palvelu
Asiakasprosessi Asiakas Auto Asema Q Auto = new Asiakas Auto.Activate(TuloAikaJakauma()) \\seuraava asiakas Jos (Q.Pituus <m+1) Q.Varaa(*this) \\ varataan palvelu mahd. \\jonotuksen jälkeen Hold(PalveluAikaJakauma()) \\ kontrolli siirtyy Q.Vapauta \\ Kerätään statistiikka Terminate \\asiakasprosessi kuolee jolloin kontrolli \\ siirtyy pois Asema Alusta \\ Asetetaan jono tyhjäksi ja \\tehdään muut alustukset Varaa(Asiakas Auto) Jos Vapaa \\ varataan palvelu, jos se on vapaa Vapaa=false Muuten LisaaJonoon(Auto) \\ Jos ei vapaa, jäädään odottamaan Auto.Passivate() \\ Siirretään kontrolli pois Vapauta() Jos(Pituus >0) Auto = OtaJonosta() \\Jonon ensimmäinen Auto.Activate(0.) \\Aktivoidaan varaamaan asema Muuten Vapaa=true \\ Asema vapautuu AlustaStatiikka Pääohjelma Q = New Jono Auto = New Asiakas Auto.Activate(TuloAikaJakauma()) Hold(SimuloinninKesto) Raportoi \\ Terminoi jonossa olevat asiakkaat ja jono \\ Terminoidu itse (päätymällä koodin loppuun) Pääohjelma, controller, on prosessiolio, jolla on simulointiprosessin metodit Luodaan varsinaisessa pääohjelmassa Analyysiä Edellisessä esimerkissä tarvittiin prosesseja, joita voi suorittaa rinnakkain Taustalla säikeiden (threads) käyttö Tarvittavat luokat periytettävä käytetyn ohjelmointikielen/ympäristön säieluokista Ks esim JavaSim tai C++Sim pakettien luokkakirjastoja Käytännössä esimerkki ei toimi Dynaamiset asiakkaat luovat uusia asiakkaita Kun ensimmäinen asiakas/säie kuolee, seuraavat menevät myös sekaisin Tarvitaan erillinen pysyvä asiakasgeneraattoriprosessi Palvelupohjainen malli Pesu-esimerkki voidaan toteuttaa kahden prosessi-instanssin avulla Asiakasgeneraattori Palveluprosessi Lisäksi asiakkaat ja jono (passiivisia) Toteutus demona JavaSim-esimerkin pohjalta Oikeat esimerkit Kaikkia tilanteita ei voi helposti mallittaa edellä esitetyillä prosessien tiloilla ja metodeilla Voidaan tunnistaa yleisesti toistuvia tilanteita, joille prosessimallia voidaan laajentaa Tietyn tapahtuman tai tilanteen odottaminen Keskeytykset Kriittiset resurssit
Oikeat esimerkit Käsitelaajennuksia ovat Prosessi voi odottaa (wait) Tietyn ajan Tietyn prosessin päättymistä Tiettyä resurssia (semafori) Jotain muuta ärsykettä (trigger) Odottava prosessi voidaan keskeyttää (interrupt) Aktivoidaan ennen kuin odotusehto täyttyy Oikeat esimerkit Laajennuksia tarvitaan epäsynkroonisten tapahtumien hallintaan Tulevan tapahtuman aika ja/tai sen generoiva prosessi ei ole etukäteen tiedossa Semafori välittää tietoa kriittistä resurssia käyttävän ja sitä odottavien olioiden välillä Muuten kaikki mahdolliset kombinaatiot olisi huomioitava koodissa Oikeat esimerkit Yleensä simulointimalleissa on enemmän rakenneosia Useita palvelupisteitä, jonoja, asiakasvirtoja Yksittäisen osan elinkaari hallittavissa ja usein vakioitavissa (parametrisoitava luokka) Osien keskinäiset kytkennät hahmotettava (graafinen editori, visualisointi, reititystaulut) Käytännössä periytettävä myös graafisia luokkia. Linkkejä http://javasim.ncl.ac.uk/ Oleellisesti SIMULA ympäristö avoimena Java toteutuksena http://asi-www.informatik.unihamburg.de/desmoj/ Java-pohjainen ympäristö tapahtuma- ja oliopohjaiseen simulointiin http://www.idsia.ch/~andrea/simtools.html Laaja kokoelma linkkejä simulointisoftiin Satunnaisluvut Simulointi Satunnaisluvut Anyone who considers arithmetic methods of producing random digits is, of course, in a state of sin, John v. Neumann Simuloinnissa käytetään aina näennäisesti satunnaisia lukuja (pseudo random numbers) Satunnaislukujen tulisi olla Tehokkaasti ja toistettavasti generoitavia Toistaa tavoitellun satunnaislukujonon keskeiset piirteet (tunnusluvut, näennäinen riippumattomuus) Käyttötarve määrää, mitkä piirteet keskeisiä
Historiaa Tarve generoida satunnaislukuja syntyi yhtä aikaa tietokoneiden kanssa Ydinreaktion simulointi, Los Alamos Alkuvaiheessa yksinkertaisuus ja laskennallinen tehokkuus korostuivat Yksinkertaiset laskutoimitukset, sopivat numeeriset vakiot Myöhemmin siirrettävyys Tehokas toteutus korkean tason kielillä Lisäksi tilastolliset ominaisuudet Satunnaislukujen generointi Generointi jaetaan yleensä kahteen osaan Tasan (0,1) jakautuneiden satunnaislukujen generointi Tasajakaumaa haetaan generoimalla tasan (0,m- 1) jakautuneita kokonaislukuja ja jakamalla lopuksi m:llä Annetun todennäköisyysjakauman mukaan jakautuneiden lukujen generointi Tehdään Tas(0,1) lukujen avulla Keskineliömenetelmä Ensimmäisiä ad hoc ajatuksia (von Neumann) Olkoon x k-numeroinen luku. Esim x=12345 Lasketaan x*2 (2k-numeroinen) 0016604025 Otetaan k keskimmäistä 16604 ->x, U=0,16604 Jne Keskineliömenetelmä integer,parameter :: m0=100,m1=10000 integer :: seed real function random() seed=seed*seed seed=seed/m0 seed=modulo(seed,m1) random=real(seed)/real(m1) return end function random 3456 0.9439 9.47000E-02 0.8968 0.425 6.25000E-02 0.3906 0.2568 0.5946 0.3549 0.5954 0.4501 0.259 0.7081 0.1405 0.974 0.8676 0.2729 0.4474 1.66000E-02 2.75000E-02 7.56000E-02 0.5715 0.6612 0.7185 0.6242 0.9625 0.6406 3.68000E-02 0.1354 0.8333 0.4388 0.2545 0.477 0.7529 0.6858 3.21000E-02 0.103 6.09000E-02 0.3708 0.7492 0.13 0.69 0.61 0.21 0.41 0.81 0.61 0.21 0.41 0.81 0.61 0.21 Keskineliö - analyysiä Menetelmä tuottaa päättymättömän jonon k-numeroisia lukuja. Ensimmäiset luvut yleensä näennäisesti toisistaan riippumattomia. Menetelmä päätyy toistamaan tiettyä lukusarjaa Sykli yleensä liian lyhyt simulointitarpeisiin Syklin pituutta ja laatua ei voi hallita helposti Hyvät satunnaisluvut Generoiduilta satunnaisluvuilta edellytetään Satunnaisuutta Sama sekvenssi ei saa toistua systemaattisesti käytön aikana Käytännössä syklin oltava pidempi kuin koesarjassa tarvittujen lukujen määrä Oikeaa jakaumaa Yleensä OK, jos kaikki mahdolliset arvot käydään läpi (maksimisykli).
Hyvät satunnaisluvut Peräkkäisten arvojen riippumattomuus Ei toteudu kirjaimellisesti, vaatii testausta Esim. k peräkkäisen arvon jakauma R^k:n yksikkökuutiossa tai max(x_i,,x_(i+k-1)):n jakauma. Taajuustesti (lukujonon tulisi olla ortogonaalinen kaikkien sini-aaltojen kanssa) Hyvyys riippuu käyttötarkoituksesta käytetäänkö lukuja yksittäin, pareittain, k-luvun ryppäissä, jne Lehmer generaattori Kehitetty 40-luvulla (D Lehmer) ensimmäisille tietokoneille (Eniac) Perusoperaatiot: kertolasku, yhteenlasku ja jakojäännöksen ottaminen X= (a X+ c) mod m Parametreilla a, c ja m voidaan vaikuttaa lukujonon ominaisuuksiin Alkuperäinen generaattori toteutettiin omana laskentayksikkönään (jonka tuloksia käytettiin vain tarvittaessa) -> lisää satunnaisuutta Lehmer generaattori Alkuperäinen generaattori Eniacille m= 10^8 +1 A= 23 C= 0 Oli tehokas toteuttaa kyseisellä koneella Ei erityisen hyvälaatuinen (pieni kertoja, peräkkäiskorrelaatiota) Lehmer generaattori Seuraava X määräytyy yksikäsitteisesti edellisestä. Generaattori alkaa toistaa samaa sarjaa heti kun X toistuu ensimmäisen kerran X:n arvoalue määrää teoreettisen maksimipituuden syklille (= m) Lehmer generaattorille tiedetään, milloin maksimisykli saavutetaan Jos q on m:n tekijä (alkuluku tai 4), a-1 =0 mod q c:llä ja m:llä ei yhteisiä tekijöitä (ja c ei nolla) Lehmer generaattori Jos c=0, maksimisykliä ei saavuteta (X=0 kuvautuu aina nollaksi) Teoreettinen maksimisykli (kun c=0) on m-1. Voidaan saavuttaa jos ja vain jos m on alkuluku a on ns primitiivinen elementti mod m Käytännössä a voidaan määrätä vain kokeellisesti Prime modulus multiplicative congruental generator Lehmer generaattorit Käytännössä suosittuja perusgeneraattoreita Käsitteellisesti helppoja laskutoimituksia 2^31-1 (maxint) on sopivasti alkuluku Helppo tehdä siirrettävä toteutus (jos a riittävän pieni) (käytettävä kaksoistarkkuuden aritmetiikkaa, jos 64 bitin kokonaislukuja ei tueta) Tutkittu ja tunnettu
Lehmer generaattori real(dp),parameter :: m=2._dp**31-1._dp m_1=1._dp/m a=16807._dp real(wp) function random() seed=modulo(seed*a,m) random=seed*m_1 return end function random Yhdistelmägeneraattorit Tehty aikanaan lyhyen sananpituuden koneille (16-bit), Wichman-Hill Käytetään useampaa lyhyen syklin generaattoria Esim syklit m_1, m_2 ja m_3 Tuotetaan jonot X_i ja U_i= X_i/m_i Tulos U= U_1+U_2+U_3 mod 1 Sopivin valinnoin syklin pituus on m_1*m_2*m_3 Toteutus täysin standardiaritmetiikalla Sekoitetut generaattorit Käytetään sekä syklin pidentämiseen että peräkkäiskorrelaation vähentämiseen Periaate on tuottaa satunnaislukuja generaattorilla A taulukkoon Taulukosta poimitaan generaattorin B avulla satunnainen alkio (generaattorin output) ja lasketaan tilalle uusi luku generaattorilla A Tarvitsee muistia ja käynnistysvaiheen sekä kaksi satunnaislukua/tulos Sykli pitenee (mutta paljonko) State of the Art Tämän hetken de facto standardi on Mersenne Twister Kehitetty 1990-luvun lopulla Erittäin pitkä sykli (2^ 19937-1) Parhaat tunnetut peräkkäiskorrelaatioominaisuudet Tarvitsee 624-sanan työmuistin (joten käynnistys kestää) Saatavissa useille kielille/ympäristöille Mersenne twister Mihin perustuu X_(N+1) = F(X_N,, X_(N-623)) Tilavektorissa 624*32 = 19968 bittiä Teoreettinen maksimisykli kävisi kaikki tilat läpi Jättämällä X_(N-623):sta osa biteistä käyttämättä, ja rajaamalla algoritmisesti 0-vektori pois mahdollisista tiloista saadaan haluttu teoreettisesti maksimaalinen sykli (alkuluku, ns Mersenne luku, josta nimi) Mersenne twister Tarvitaan F, joka On laskennallisesti kevyt Tuottaa maksimaalisen syklin Löydetty luokasta X_(N+1) = X_N*A_0 + X_(N-k) * A_k A_i:t kerroinmatriiseja Menetelmäluokalle on teoriaa maksimisykleistä Löydetty A:t joille vain 3 matriisia nollasta eroavia Ts vain kolmea vanhaa X arvoa käytetään yhdellä kierroksella
Mersenne Twister Löydetty menetelmä tuottaa pitkä sykli Laskennallisesti kevyt Peräkkäiskorrelaatio vaatii vielä huomiota K-testi: tarkastellaan peräkkäisten satunnaislukujen k-merkitsevimpien bittien jonoa Monelleko peräkkäiselle luvulle ym jono on tasajakautunut Tähän voidaan vaikuttaa sekoittamalla X:n bittejä laskennan jälkeen Ei vaikuta sykliin vaan vain output streamiin Satunnaisluvut ja jakaumat Miten generoida satunnaislukuja, joilla on haluttu tiheysjakauma. Käänteistodennäköisyyden menetelmä Olkoon f haluttu tiheysfunktio. Tätä vastaa kertymäfunktio F: x-> (0,1). Arvotaan u Tas (0,1) jakaumasta Asetetaan x = F^(-1) (u). x:n tiheysjakauma on f. Edellyttää, että F^(-1) tunnetaan suljetussa muodossa Käänteistn. menetelmä Tarkastellaan eksponenttijakaumaa Tiheys f. on f(x) = a e^(-ax) Kertymä f. on F(x) = 1- e^(-ax) Vastaavasti F^(-1) (U) = - ln(1-u)/a Eksponenttijakautuneita suureita saadaan arpomalla U ~ Tas(0,1) ja tulostamalla ln(1-u)/a Myös ln (U)/a toimii, jos U>0 aina Eliminointimenetelmä Yleinen menetelmä, edellyttää pelkästään tiheysfunktion arvoja Olkoon f tiheysfunktio välillä (a,b), 0<f<c. Arvotaan x, Tas(a,b), y, Tas(0,c). Jos y< f(x), hyväksytään x. Muuten hylätään ja arvotaan uudet x,y Hyväksytyt x:t noudattavat tiheysjakaumaa f. Mitä vähemmän hylkäyksiä, sitä tehokkaampi Tarvittaessa jaetaan väli (a,b) osaväleihin ja/tai vaihdetaan y:n jakaumaa paremmin f:ää approksimoivaksi. Yhteenvetoa Satunnaislukugeneraattoreilla 60-vuoden historia Testattuja ja tunnettuja generaattoreita hyvin saatavilla. Itse ei yleensä kannata säätää Tuntematonta generaattoria (menetelmä ja lähdeviitteet puuttuvat) ei kannata käyttää ainakaan testaamatta (vrt PC:n Basic-generaattori) Generaattoria ymmärrettävä niin, että voi tehdä hallittuja kokeita/toistoja. Simulointi Monte Carlo
Monte Carlo simulointi Yksittäisen stokastisen simuloinnin tulos on aina sattumanvarainen Yksittäinen instanssi satunnaismuuttujasta Simulointikoesarjan tavoite on saada tietoa satunnaismuuttujan jakaumasta tai jakauman parametreista (keskiarvo, hajonta) Taustalla periaatteessa deterministinen arvo, johon ei kuitenkaan aina suoraan päästä käsiksi. Buffonin neula Klassinen esimerkki mekaanisesta simuloinnista, jonka tarkka vastaus tunnetaan. Buffonin herttuan 1733 esittämä menetelmä π arvon määräämiseksi. Heitetään l pituista neulaa alustalle, jossa on yhdensuuntaisia suoria d välein. Lasketaan, kuinka usein neula koskettaa viivaa. Kokeellinen todennäköisyys P= #osumat/#yritykset Buffonin neula Buffonin neula Neula osuu viivaan jos Neulan keskipisteen etäisyys viivasta on pienempi kuin l sin α, missä α on neulan ja viivan välinen kulma Kulma ~ Tas(0, π/2) Keskipiste ~ Tas (0,d/2) d l α Osuman todennäköisyys lasketaan sinikäyrän rajoittaman pinta-alan avulla p= 2l/(πd) Jos p:lle tunnetaan havaintoarvo, voidaan saada estimaatti π:lle. d/2 l/2 π/2 Buffonin neula Yksittäisen heiton tulos on satunnainen Samoin N heiton keskiarvo. Mitä tiedämme N heiton jälkeen? Määrättävä N heiton keskiarvon (P) jakauma Tai aínakin odotusarvo ja keskihajonta P on N:n riippumattoman satunnaissuureen keskiarvo Yksittäiset kokeet noudattava binomijakaumaa odotusarvolla p (=2l/(πd)) E(P)=p. Buffonin neula Yksittäisen heiton tuloksen (tai Bin(p) muuttujan) varianssi on p(1-p) N riippumattoman kokeen keskiarvon varianssi on p(1-p)/n Ts Var(P) = p(1-p)/n Nyt meillä on havainto satunnaissuureesta, jonka varianssi tunnetaan. Voimme tehdä arvioita havainnon (otoskeskiarvo) ja odotusarvon välisestä suhteesta.
Luottamusväli Oletetaan, että tunnemme satunnaismuuttujasta otoskeskiarvon Millä välillä on todellinen odotusarvo esim 99% todennäköisyydellä. Määriteltävä ns. luottamusväli, jolle pätee P( P-δ < p< P+δ) >0.99. Määrittely mahdollista, jos P:n jakauma tunnetaan. P N riippumattoman Bin-muuttujan summa, joten suurilla N, P likimain normaalijakautunut. δ laskettavissa ja muotoa c(p)n^(1/2). Monte Carlo Integrointi Buffonin neulan taustalla oli odotusarvon integraalilauseke, jolle haettiin estimaattia kokeellisesti. Samaa voi soveltaa yleisemminkin integraalien laskentaan. Integroidaan f välillä [a,b] jos 0<f<c Jos x on Tas(a,b) ja y on Tas(0,c) jakautunut, määrätään (kokeellisesti) tn p, jolla y< f(x). Integraali on p(b-a)c. Monte Carlo Integrointi Kokeellinen arvo integraalille on sitä tarkempi, mitä useampi koetoisto tehdään. Luottamusväli tarkentuu suhteessa N^(1/2):een. Hyötysuhde on huono yksiulotteisille integraaleille Luottamusvälin pituus ja käyttäytyminen ei riipu integraalin dimensiosta (vaan vain osumistodennäköisyydestä p) Tehokas tapa saada karkeita likiarvoja moniulotteisille integraaleille. Monte Carlo Edellinen Monte Carlo ei suoraan sovellu kaikkiin tapauksiin Rajoittamaton funktio tai väli Mahdollista luopua y muuttujasta Lasketaan vain E(f(x)) Halvempi, mutta varianssianalyysi vaikeampaa Korvataan tasainen yläraja Etsitään tn tiheysfunktio g s.e. f(x)< cg(x) Arvotaan x:t g-jakaumasta Tavoitteena osumis tn ~ 1 Monte Carlo sovelluksia Tyypillinen Monte Carlo sovellus on (erittäin) moniulotteinen integraali, joka syntyy kun mallitetaan säteilyn etenemistä materiaalissa. Jokainen törmäys mallittuu moniulotteisella integraalilla (heijastus ja absorptiotodennäköisyydet, tulokulman, energian jne funktioina, partikkelien muodot, pintaominaisuudet, sironta väliaineessa jne) Yksittäisen säteen simuloinnin kannalta monimutkaisuus kasvaa vain lineaarisesti.