Tiwtorial IV: Arbrofion, Amser Twymo & Amser Oeri¶
Yn Diwtorialau I-III fe ymchwilion ni un rhediad efelychiad o fanc. Cyn gallwn ni dod i gasgliadau am ymddygiad y banc, mae yna gwpl o bethau rhaid i ni ystyried:
Fe wnaeth ein disgrifiad gwreiddiol o'r banc ei disgrifio fel bod ar agor 24/7. Mae hwn yn golygu bod y banc byth yn dechrau o gyflwr gwag, fel mae'r efelychiad yn.
Y cwsmeriaid sydd dal yn y system ar ddiwedd y rhediad: ni chasglwyd ei chofnodion data, er gwaethaf fod nhw wedi treulio amser yn y system yn ystod y cyfnod arsylwi.
A yw'r rhediad sengl yma yn adlewyrchu bywyd go iawn? A oedd y canlyniadau yma yn llyngyr? Yn arsylwad eithafol?
Fe all goresgyn y tri phryder yma gan ddefnyddio amser-twymo, amser-oeri, ac arbrofion, yn ôl ei eu trefn. Mae disgrifiad llawn rhain ar gael fan hyn.
Amser-twymo: Efelychu'r system am ryw gyfnod amser cyn dechrau'r cyfnod arsylwi, felly nad yw'r system yn wag a bod y system mewn 'full swing' erbyn cychwyn y cyfnod arsylwi. Ond casglwch ganlyniadau o ddechrau'r cyfnod arsylwi.
Amser-oeri: Efelychu'r system am ryw gyfnod amser ar ôl diwedd y cyfnod arsylwi, felly nad oes unrhyw gwsmeriaid dan sylw yn sownd yn yr efelychiad pryd casglwyd canlyniadau. Ond casglwch ganlyniadau nes diwedd y cyfnod arsylwi.
Arbrofion: Efelychu'r system nifer o weithiau gyda llif rhifau ar hap gwahanol (gwahanol hadau). Cadwch holl ganlyniadau o dan ddiddordeb o'r holl arbrofion, felly gallwch gymryd cymedrau a chyfyngau hyder.
Gadwech i ni ddiffinio ein banc trwy greu gwrthrych Network:
>>> import ciw
>>> N = ciw.create_network(
... arrival_distributions=[ciw.dists.Exponential(0.2)],
... service_distributions=[ciw.dists.Exponential(0.1)],
... number_of_servers=[3]
... )
Am symlrwydd, fe fyddwn â diddordeb ffeindio'r amser aros cymedrig yn unig. Rhedwn 10 efelychiad mewn lŵp, a chymryd amser-twymo ac amser-oeri o 100 uned amser. Felly rhedwn bob arbrawf am 1 diwrnod + 200 munud (1640 munud):
>>> average_waits = []
>>> for trial in range(10):
... ciw.seed(trial)
... Q = ciw.Simulation(N)
... Q.simulate_until_max_time(1640)
... recs = Q.get_all_records()
... waits = [r.waiting_time for r in recs if r.arrival_date > 100 and r.arrival_date < 1540]
... mean_wait = sum(waits) / len(waits)
... average_waits.append(mean_wait)
Fe fydd y rhestr average_waits
yn cynnwys deg rhif, yr amser aros cymedrig o bob un o'r arbrofion.
Sylwch fe osodon ni hedyn gwahanol pob tro, fel bydd pob arbrawf yn rhoi canlyniadau gwahanol:
>>> average_waits
[3.91950..., 4.34163..., 4.61779..., 5.33537..., 5.06224..., 2.90274..., 4.93209..., 17.95093128538666, 4.06136..., 3.14126...]
Gwelwn fod ystod yr amseroedd aros yn uchel, rhwng 1.6 a 7.5. Dangosir hyn ni fydd rhedeg un arbrawf yn unig yn rhoi ateb hyderus. Fe allwn gymryd cymedr y canlyniadau dros yr arbrofion i gael ateb mwy hyderus:
>>> sum(average_waits) / len(average_waits)
5.62649...
Gan ddefnyddio Ciw, rydym wedi ffeindio fod cwsmeriaid yn aros 5.62 munud ar gyfartaledd mewn ciw yn y banc. Beth fydd yn digwydd os ychwanegwn weinydd arall? Ail-adroddwch y dadansoddiad gyda 4 gweinydd:
>>> N = ciw.create_network(
... arrival_distributions=[ciw.dists.Exponential(0.2)],
... service_distributions=[ciw.dists.Exponential(0.1)],
... number_of_servers=[4]
... )
>>> average_waits = []
>>> for trial in range(10):
... ciw.seed(trial)
... Q = ciw.Simulation(N)
... Q.simulate_until_max_time(1640)
... recs = Q.get_all_records()
... waits = [r.waiting_time for r in recs if r.arrival_date > 100 and r.arrival_date < 1540]
... mean_wait = sum(waits) / len(waits)
... average_waits.append(mean_wait)
>>> sum(average_waits) / len(average_waits)
0.79868...
Trwy ychwanegu gweinydd arall fe allwn leihau'r amser aros cymedrig o 5.62 munud i 0.79 munud! Da iawn, rydych chi wedi rhedeg eich senario beth-os cyntaf! Mae senarios beth-os yn galluogi defnyddio efelychiad i weld os fydd newidiadau drud yn fuddiol i'r system, heb weithredu'r newidiadau drud hynny yn y system go iawn.