Esimerkki: Tietoliikennekytkin Tämä Mathematica - notebook sisältää luennolla 2A (2..26) käsitellyn esimerkin laskut. Esimerkin kuvailu Tarkastellaan yksinkertaista mallia tietoliikennekytkimelle. Kytkimeen saapuu datapaketteja, kytkin tallentaa ne väliaikaisesti puskuriinsa, ja lähettää ne sitten eteenpäin. Pidämme kirjaaerityisesti puskurissa olevien datapakettien määrästä ajan funktiona, jota mallinnetaan Markov-prosessilla. Kullakin ajanhetkellä (esim. -6 s pituisilla ajanjaksoilla) kytkin lähettää puskuristaan yhden paketin eteenpäin, paitsi puskurin ollessa tyhjä, jolloin kytkin ei lähetä mitään. Kytkimeen saapuu vielä ennen seuraavaa ajanhetkeä Poisson ()-jakautunut määrä datapaketteja, riippumattomasti eri aikaväleillä. Saapuvat datapaketit tallennetaan puskuriin, mikäli puskurissa on tilaa. Puskuriin voi kerrallaan olla tallennettuna enintään M datapakettia. Paketit, joita ei voida tallentaa, hylätään. Jos X t on ajanhetkellä t puskurissa olevien datapakettien lukumäärä, on ylläolevilla oletuksilla prosessi X = (X t ) t Z+ Markov ketju äärellisellä tilajoukolla S = {,, 2,..., M -, M}. Parametrit ja M pitäisi realistisemmissa tietoliikennesovelluksissa selvittää kytkimen ja verkon ominaisuuksien ja käyttötarkoituksen perusteella. Parametri kuvaa pakettien tulointensiteettiä tietoliikenneverkossa, ja se liittyy siten verkon kuormitukseen kyseisen kytkimen kohdalla. Parametri M on puskurin muistikapasiteetti, ja siis kytkimen ominaisuus. Tässä esimerkissä oletamme parametreille arvot M = 8 (enintään kahdeksan datapakettia puskurissa) ja =.95 (odotusarvoisesti.95 saapuvaa pakettia per aikayksikkö). Poisson-jakauman pistemassafunktio In[]:= PoissonPMF k_ := Exp[-]*^k k! Vaihteen siirtymämatriisi Alustetaan oikean kokoinen matriisi P ensin pelkillä nollilla In[2]:= P = Table, i,, 8, j,, 8 ; Käydään läpi rivit, ja lasketaan siirtymätodennäköisyydet Poisson-jakaumasta
2 StokPros-network_switch_example.nb In[3]:= (* Lasketaan ensin siirtymätodennäköisyydet tyhjästä puskurista: nämä ovat viimeistä lukuunottamatta suoraan Poisson-jakauman pistetodennäköisyyksiä, viimeinen on todennäköisyys, että saapuvien pakettien lukumäärä on kahdeksan tai enemmän *) For in=, in< 8, in++, P, in+ = PoissonPMF in ; P[[, 8+]] = -Sum [P[[, y+]], {y,, 8}]; (* Lasketaan sitten siirtymätodennäköisyydet puskurista, jossa on buf> pakettia: nämä ovat jälleen viimeistä lukuunottamatta suoraan Poisson-jakauman pistetodennäköisyyksiä, viimeinen on todennäköisyys, että saapuvien pakettien lukumäärä riittää täyttämään puskurin ja mahdollisesti enemmänkin *) For buf =, buf 8, buf++, For in=, buf-+in< 8, in++, ; P buf+, buf-+in+ = PoissonPMF in ; P buf+, 8+ = -Sum P buf+, y+, {y,, 8} ; Näytetään siirtymämatriisi yleisellä : n arvolla In[6]:= P // MatrixForm Out[6]//MatrixForm= e - e - 2 e- 2 6 e- 3 24 e- 4 2 e- 5 72 e- 6 e - 7 54 -e - -e - - 2 e- 2-6 e- e - e - 2 e- 2 6 e- 3 24 e- 4 2 e- 5 72 e- 6 e - 7 54 -e - -e - - 2 e- 2-6 e- e - e - 2 e- 2 6 e- 3 24 e- 4 2 e- 5 72 e- 6 -e - -e - - 2 e- 2 - e 6 e - e - 2 e- 2 6 e- 3 24 e- 4 2 e- 5 -e - -e - - 2 e- e - e - 2 e- 2 6 e- 3 24 e- 4 -e - -e - - 2 e - e - 2 e- 2 6 e- 3 -e - -e - e - e - 2 e- 2 -e - e - e - e - Asetetaan : n arvo In[7]:= =.95; Näytetään siirtymämatriisi kiinnitetyllä : n arvolla In[8]:= P // MatrixForm Out[8]//MatrixForm=.38674.36744.7457.552637.325.249377.394847.53.38674.36744.7457.552637.325.249377.394847.53.38674.36744.7457.552637.325.249377.39.38674.36744.7457.552637.325.249.38674.36744.7457.552637.3.38674.36744.7457.552.38674.36744.745.38674.3674.3867 Lasketaan tilajakauma hetkellä lähtien tyhjästä puskurista
StokPros-network_switch_example.nb 3 In[9]:= ({{,,,,,,,, }}.P) // MatrixForm Out[9]//MatrixForm=.38674.36744.7457.552637.325.249377.394847.53 Lasketaan tilajakauma hetkellä 2 lähtien tyhjästä puskurista In[]:= ({{,,,,,,,, }}.P.P) // MatrixForm Out[]//MatrixForm= (.29659.344569.272.9753.349738.5848.278466.64856 Stationaarinen jakauma Puskurin tilaa kuvaava Markov-ketju on yhtenäinen, koska esimerkiksi siirtymät 8 7 6 5 4 3 2 tapahtuvat positiivisillä todennäköisyyksillä. Siten sillä on Lauseen 3.8 mukaan yksikäsitteinen stationaarinen jakauma. Tämä voidaan ratkaista siirtymämatriisin ominaisarvoa vastaavana vasempana ominaisvektorina, jonka komponenttien summa pitää muistaa normittaa ykköseksi (jotta se olisi todennäköisyysjakauma). Matriisin P ominaisarvot In[]:= Eigenvalues[P] Out[]=.,.929695,.744848,.5684,.269838,.3573,.23233,.86628, -4.543-3 Stationaarinen jakauma π on ominaisarvoa vastaava vasen ominaisvektori todennäköisyysjakaumaksi normalisoituna (ja koska vasen ominaisvektori on transpoosin oikea ominaisvektori, voidaan Mathematicaa pyytää laskemaan se komennolla Eigenvectors[Transpose[P]] ) In[2]:= Π = Eigenvectors[Transpose[P], ] Apply Plus, Flatten Eigenvectors[Transpose[P], ] ; Π // MatrixForm Out[3]//MatrixForm= (.874736.3878.43786.3327.2554.8895.983592.888454. Stationaarisen jakauman tulkintaa Puskurin tilaa kuvaava Markov-ketju on myös jaksoton, koska vaikkapa mistä tahansa tilasta voidaan yhdellä aika-askeleella päästä itseensä. Lauseen 3. perusteella yhtenäisen jaksottoman Markov ketjun hetkittäiset tilajakaumat μ t suppenevat kun t kohti stationaarista jakaumaa π, eli ketju asettuu pitkällä aikavälillä stationaarisen jakauman kuvaamaan tilastolliseen tasapainoon. Stationaarisessa jakaumassa (johon ketju pitkällä aikavälillä asettuu) puskuri on annetulla ajanhetkellä tyhjänä noin 8.7 % todennäköisyydellä, täynnä noin 8. % todennäköisyydellä, ja tyypillisimmin puskurissa on kaksi pakettia, noin 4.4 % todennäköisyydellä. Pitkän aikavälin kustannuskertymiä Puskurin käyttöaste Käyttöastetta kuvaava kustannusfunktio c : S R on yksinkertaisesti c(x) = x, missä x S = {,, 2, 3, 4, 5, 6, 7, 8} on puskurissa olevien pakettien lukumäärä. Funktio tulkitaan tilajoukon S indeksoimana pystyvektorina.
4 StokPros-network_switch_example.nb In[4]:= c = Transpose[{{,, 2, 3, 4, 5, 6, 7, 8}}]; c // MatrixForm Out[5]//MatrixForm= 2 3 4 5 6 7 8 In[6]:= Pitkän aikavälin kustannusvauhti lasketaan stationaarisen jakauman ja kustannusfunktion pistetulona Π.c Out[6]= {{3.7644}} Tämä on toki sama asia kuin summa vektorien komponenttien yli In[7]:= Sum Π, i *c i,, i,, 9 Out[7]= 3.7644 In[8]:= Hylättyjen pakettien odotettu määrä per aikayksikkö Hylättyjen pakettien odotettua määrää kuvaava kustannusfunktio c : S R saa tilassa x S arvon, joka on odotusarvo sille, kuinka paljon Poisson-jakautunut saapuvien pakettien lukumäärä ylittää puskurissa sillä hetkellä käytettävissä olevan kapasiteetin 8 - max {, x - } (tässä huomioidaan, että ajanhetken aluksi on jo lähetetty puskurista eteenpäin yksi paketti). Funktio tulkitaan jälleen tilajoukon S indeksoimana pystyvektorina, ja se lasketaan seuraavasti. c = Transpose Table Sum PoissonPMF in *Max, in-(8-max[, (x-)]), c // MatrixForm Out[9]//MatrixForm= 8.7764-7 In[2]:= 8.7764-7 7.92264-6.6864.52453.347347.95479.9886.33674 Π.c Out[2]= {{.374736}} In[2]:= in, 8-Max[, x-], Infinity, {x,, 8} ; Tämä on jälleen toki sama asia kuin summa vektorien komponenttien yli Sum Π, i *c i,, i,, 9 Out[2]=.374736 Kulkuaikoja Odotetut ajat puskurin ensimmäiseen tyhjenemiseen
StokPros-network_switch_example.nb 5 Oletetaan, että puskurissa on aluksi X = x dakettia. Tarkastellaan satunnaista hetkeä T {} = min {t X t = }, jolloin puskuri on ensimmäistä kertaa tyhjillään. Lasketaan, miten odotettu kulkuaika k(x) = Ε x [T {} ] riippuu alkutilasta x. Muodostetaan tuntemattomista odotetuista kulkuajoista pystyvektori (k(x)) x {,,...,8}. In[22]:= kvec = Transpose Map k[#] &, Range[, 8] ; kvec // MatrixForm Out[23]//MatrixForm= k[] k[] k[2] k[3] k[4] k[5] k[6] k[7] k[8] Käytetään ensin ilmeistä havaintoa k() =. In[24]:= k[] = kvec // MatrixForm Out[24]= Out[25]//MatrixForm= k[] k[2] k[3] k[4] k[5] k[6] k[7] k[8] Muodostetaan myös vektori, jonka kaikki komponentit ovat ykkösiä. In[26]:= onevec = Transpose Table[, {x,, 8}] ; onevec // MatrixForm Out[27]//MatrixForm= Odotetut kulkuajat saadaan sitten vaatimalla allaolevan vektorin komponentit (tilaa x = vastaavaa komponenttia lukuunottamatta) nolliksi. In[28]:= P-IdentityMatrix[9].kvec+onevec // MatrixForm Out[28]//MatrixForm=. +.36744 k[]+.7457 k[2]+.552637 k[3]+.325 k[4]+.249377 k[5]+.. -.632596 k[]+.7457 k[2]+.552637 k[3]+.325 k[4]+.249377 k[5]+. +.38674 k[]-.632596 k[2]+.7457 k[3]+.552637 k[4]+.325 k[5]+.2 +.38674 k[2]-.632596 k[3]+.7457 k[4]+.552637 k[5]+.325 k +.38674 k[3]-.632596 k[4]+.7457 k[5]+.552637 k[6]+. +.38674 k[4]-.632596 k[5]+.7457 k[6]+.552637 +.38674 k[5]-.632596 k[6]+.7457 k[7]+. +.38674 k[6]-.632596 k[7]+.245855 +.38674 k[7]-.38674 k[8]
6 StokPros-network_switch_example.nb In[29]:= Ratkaistaan tämä lineaarinen yhtälöryhmä. Solve Table P-IdentityMatrix[9].kvec+onevec j, j, 2, 9 Out[29]= {{k[].432, k[2] 2.9466, k[3] 3.4455, k[4] 39.899, k[5] 46.9495, k[6] 52.79, k[7] 56.934, k[8] 59.56}} Vektorimuodossa ratkaisu on seuraava : In[3]:= kvecsol = kvec /. %[[]] ; kvecsol // MatrixForm Out[3]//MatrixForm=.432 2.9466 3.4455 39.899 46.9495 52.79 56.934 59.56 In[32]:= Odotetut ajat puskurin ensimmäiseen täyttymiseen Oletetaan jälleen, että puskurissa on aluksi X = x dakettia. Tarkastellaan satunnaista hetkeä T {8} = min {t X t = 8}, jolloin puskuri on ensimmäistä kertaa täynnä. Lasketaan, miten odotettu kulkuaika k(x) = Ε x [T {} ] riippuu alkutilasta x. Muodostetaan tuntemattomista odotetuista kulkuajoista pystyvektori (k(x)) x {,,...,8} ja käytetään ilmeistä havaintoa k(8) =. k8vec = Transpose Map k8[#] &, Range[, 8] ; k8[8] = ; k8vec // MatrixForm Out[34]//MatrixForm= k8[] k8[] k8[2] k8[3] k8[4] k8[5] k8[6] k8[7] Odotetut kulkuajat saadaan sitten vaatimalla allaolevan vektorin komponentit (tilaa x = 8 vastaavaa komponenttia lukuunottamatta) nolliksi. In[35]:= P-IdentityMatrix[9].k8vec+onevec // MatrixForm Out[35]//MatrixForm=. -.63259 k8[]+.36744 k8[]+.7457 k8[2]+.552637 k8[3]+.325 k8[4]+.. +.38674 k8[]-.632596 k8[]+.7457 k8[2]+.552637 k8[3]+.325 k8[4]+.. +.38674 k8[]-.632596 k8[2]+.7457 k8[3]+.552637 k8[4]+.325. +.38674 k8[2]-.632596 k8[3]+.7457 k8[4]+.552637 k8[5]. +.38674 k8[3]-.632596 k8[4]+.7457 k8[5]+.552. +.38674 k8[4]-.632596 k8[5]+.7457 k8[6]. +.38674 k8[5]-.632596 k8[6]+.74. +.38674 k8[6]-.632596 k8[7. +.38674 k8[7] Ratkaistaan tämä lineaarinen yhtälöryhmä.
StokPros-network_switch_example.nb 7 In[36]:= Solve Table P-IdentityMatrix[9].k8vec+onevec j, j,, 8 Out[36]= {{k8[] 82.9352, k8[] 82.9352, k8[2] 8.7936, k8[3] 76.28, k8[4] 69.433, k8[5] 59.998, k8[6] 45.887, k8[7] 29.634}} Vektorimuodossa ratkaisu on seuraava : In[37]:= k8vecsol = k8vec /. %[[]] ; k8vecsol // MatrixForm Out[38]//MatrixForm= 82.9352 82.9352 8.7936 76.28 69.433 59.998 45.887 29.634