Tiwtorial VII: Dosbarthau Cwsmer Lluosog¶
Dychmygwch glinig paediatregydd 24 awr:
Mae dau fath o glaf yn cyrraedd, babanod a phlant.
Pan gyrhaeddir cleifion mae angen iddynt gofrestru yn y dderbynfa.
Mae'r amser y mae'n cymryd i gofrestru ar hap, ond ar gyfer babanod mae'n para 15 munud ar gyfartaledd, ac ar gyfer plant mae'n para 10 munud ar gyfartaledd.
Ar ôl cofrestru mae'r ddau fath o glaf yn mynd i ystafelloedd aros gwahanol, lle maent yn aros ar gyfer arbenigwyr gwahanol.
Mae apwyntiad gydag arbenigwyr yn para am amser ar hap, ond yn para ar gyfartaledd un awr.
Mae yna un derbynnydd ar ddyletswydd, dau arbenigwr babanod, a tri arbenigwr plant ar ddyletswydd.
Mae babanod yn cyrraedd ar hap ar gyfradd un yr awr, a phlant ar gyfradd dau yr awr.
Yn y senario yma mae dau wahanol fath o gwsmer yn defnyddio'r un adnoddau, ond gallant nhw ddefnyddio'r adnoddau yma mewn gwahanol ffyrdd. Mae Ciw yn delio gyda hwn trwy aseinio dosbarthau cwsmer i gwsmeriaid. Yn y senario yma:
Aseinir babanod y dosbarth cwsmer
'Class 0'
.Aseinir plant y dosbarth cwsmer
'Class 1'
.Y dderbynfa yw Nod 1.
Yr arbenigwr babanod yw Nod 2.
Yr arbenigwr plant yw Nod 3.
Aseiniwn ymddygiad gwahanol i ddosbarthau cwsmer gwahanol trwy amnewid gwerthoedd allweddeiriau'r gwrthrych Network gyda geiriaduron, gyda dosbarthau cwsmer fel allweddau, a'r ymddygiad penodol fel gwerthoedd:
>>> import ciw
>>> N = ciw.create_network(
... Arrival_distributions={'Class 0': [ciw.dists.Exponential(1.0)],
... ciw.dists.NoArrivals(),
... ciw.dists.NoArrivals()],
... 'Class 1': [ciw.dists.Exponential(2.0),
... ciw.dists.NoArrivals(),
... ciw.dists.NoArrivals()]}
... Service_distributions={'Class 0': [ciw.dists.Exponential(4.0)],
... ciw.dists.Exponential(1.0)],
... ciw.dists.Deterministic(0.0)],
... 'Class 1': [ciw.dists.Exponential(6.0)],
... ciw.dists.Deterministic(0.0)],
... ciw.dists.Exponential(1.0)]]},
... routing={'Class 0': [[0.0, 1.0, 0.0],
... [0.0, 0.0, 0.0],
... [0.0, 0.0, 0.0]],
... 'Class 1': [[0.0, 0.0, 1.0],
... [0.0, 0.0, 0.0],
... [0.0, 0.0, 0.0]]},
... Number_of_servers=[1, 2, 3],
... )
Sylwch er rydym yn gwybod ni fydd dosbarthau cwsmer penodol angen gwasanaeth (er enghraifft ni fydd angen gweld arbenigwr plant ar fabanod: bydd cwsmeriaid Class 0 byth angen gwasanaeth yn Nod 3) mae dal angen mewnbynnu dosraniad gwasanaeth.
Dewiswn y dosraniad ffug ciw.dists.Deterministic(0.0)
.
Efelychwch y clinig am 9 awr:
>>> Q = ciw.Simulation(N)
>>> Q.simulate_until_max_time(9)
>>> recs = Q.get_all_records()
Gwelwn nad oes unrhyw gwsmer Class 0 wedi cyrraedd Nod 3; ac nad oes unrhyw gwsmer Class 1 wedi cyrraedd Nod 2:
>>> visited_by_babies = {1, 2}
>>> set([r.node for r in recs if r.customer_class==0]) == visited_by_babies
True
>>> visited_by_children = {1, 3}
>>> set([r.node for r in recs if r.customer_class==1]) == visited_by_children
True
Hoffwn ffeindio'r amser aros cymedrig yn y dderbynfa, wrth yr arbenigwr babanod, ac wrth yr arbenigwr plant. Efelychwn am 24 awr, yn defnyddio amser-twymo o 3 awr ac amser-oeri o 3 awr, ar 16 arbrawf. Casglwn yr amseroedd aros cymedrig wrth bob nod am bob arbrawf:
>>> average_waits_1 = []
>>> average_waits_2 = []
>>> average_waits_3 = []
>>> for trial in range(16):
... ciw.seed(trial)
... Q = ciw.Simulation(N)
... Q.simulate_until_max_time(30)
... recs = Q.get_all_records()
... waits1 = [r.waiting_time for r in recs if r.node==1 and r.arrival_date > 3 and r.arrival_date < 27]
... waits2 = [r.waiting_time for r in recs if r.node==2 and r.arrival_date > 3 and r.arrival_date < 27]
... waits3 = [r.waiting_time for r in recs if r.node==3 and r.arrival_date > 3 and r.arrival_date < 27]
... average_waits_1.append(sum(waits1) / len(waits1))
... average_waits_2.append(sum(waits2) / len(waits2))
... average_waits_3.append(sum(waits3) / len(waits3))
Nawr ffeindiwn yr amser aros cymedrig dros yr arbrofion:
>>> sum(average_waits_1) / len(average_waits_1)
0.274301...
>>> sum(average_waits_2) / len(average_waits_2)
0.268752...
>>> sum(average_waits_3) / len(average_waits_3)
0.284763...
Mae'r canlyniadau yma yn dangos fod babanod yn aros 0.6 awr, tua 36 munud am apwyntiad. Gall hwn cael ei ddefnyddio fel mesur gwaelodlin i gymharu unrhyw ailgyfluniadau potensial i'r clinig.