Sut i Ddiffinio Trosglwyddiadau wedi Seilio ar Brosesau¶
Mae gan Ciw y gallu i rhedeg efelychiadau wedi seilio ar brosesau (process-based). Mae hwn yn golygu fod taith cyfan cwsmer wedi'i pendrefynnu y dechrau, ac nid yw wedi'i penderfynnu gan tebygolrwyddau wrth iddynt teithio trwy'r rhwydwaith. Mae hwn yn galluogi i teithiau cael ei penderfynnu gan hanes unigolyn, er enghraifft, ailadrodd nodau nifer penodol o weithiau.
Mae taith cyfan cwsmer wedi'i penderfynnu ar y dechrau, wedi'i generadu gan ffwythiant taith, sy'n cymryd i mewn unigolyn ac yn allbynnu taith, sef rhestr o trefn y nodau. Er enghraifft:
>>> def routing_function(ind):
... return [1, 2, 2, 1]
Mae hwn yn cymryd unigolyn yn Nod 1 ac yn ei rhoi'r taith [1, 2, 2, 1]. Yn ar ôl gwasanaeth yn Nod 1 anfonnir yr unigolyn i Nod 2, yna nôl i Nod 2, yna nôl i Nod 1, cyn gadael y system. Nid yw sicrhau ailadrodd y nodau fel hyn yn bosib mewn system wedi'i seilio ar tebygolrwyddau yn unig.
Er mwyn defnyddio hwn, rydym yn amnewid y matrics trosglwyddo gyda rhestr o'r ffwythiannau taith hyn i defnyddio ym mhob pwynt dechrau. Er enghraifft:
>>> import ciw
>>> def repeating_route(ind):
... return [1, 1, 1]
>>> N = ciw.create_network(
... arrival_distributions=[ciw.dists.Exponential(1)],
... service_distributions=[ciw.dists.Exponential(2)],
... number_of_servers=[1],
... routing=[repeating_route]
... )
Fan hyn mae cwsmeriaid yn dyfodi wrth Nod 1, yn cael gwasanaeth yna, ac yna yn ailadrodd hyn dwywaith cyn gadael y system.
Gadewch i ni rhedeg hyn i weld teithiau rheini sydd wedi gadael y system.
>>> ciw.seed(0)
>>> Q = ciw.Simulation(N)
>>> Q.simulate_until_max_time(100.0)
>>> inds = Q.nodes[-1].all_individuals # Gafael ym mhob unigolyn yn y nod ola
>>> set([tuple(dr.node for dr in ind.data_records) for ind in inds]) # Gafael ym mhob taith yr unigolion hyn
{(1, 1, 1)}
Nawr gwelwn bod pob unigolyn sydd wedi gadael y system, hynny yw yr unigolion sydd wedi cwpla eu taith, wedi ailadrodd gwasanaeth yn Nod 1 tait gwaith.
Sylw Pwysig¶
Sut mae'n gwithio: Gallwch meddwl am hwn fel, pan mae unigolyn yn cyrraedd ei nod cyntaf, yn seiliedig ar yr arrival_distributions
, aseinir taith y dylai dechrau wrth y nod hyn. Bydd hwn yn sicrhau bod y nod cyntaf y mae'r unigolyn yn cyrraedd yr un peth â nod cyntaf y taith a aseinir.
Os nad yw hwn yn digwydd bydd y gwall 'Individual process route sent to wrong node'
yn codi.
Gwnewch yn siwr bod y ffwythiant taith ar gyfer Node \(i\) yn rhoi teithiau sy'n dechrau gyda Nod :math`i`.
Enghraifft pellach¶
Gall y ffwythiannau taith bod mor gymleth a sydd angen. Maent yn cymryd unigolyn, ac felly'n gallu defnyddio unrhyw priodwedd yr unigolyn hynn wrth penderfynnu ar taith (gan gynnwys ei customer_class
).
Crëwn rhwydwaith gyda tri nod a'r taith canlynol:
Ar gyfer cwsmeriaid yn dyfodi wrth Nod 1:
os oes gan yr unigolyn yna
id_number
sy'n eilrif, ailadrodd Nod 1 dwywaith, yna gadael.fel arall teithio o Nod 1 i Nod 2 i Nod 3 ac yna gadael.
Mae gan dyfodiadau wrth Nod 2:
siawn 50% o teithio i Nod 3, yna gadael.
siawn 50% o teithio i Nod 1, yna gadael.
Does dim dyfodiadau wrth Nod 3.
Ar gyfer hwn bydd angen dau ffwythiant taith: routing_function_Node_1
, routing_function_Node_2
:
>>> def routing_function_Node_1(ind):
... if ind.id_number % 2 == 0:
... return [1, 1, 1]
... return [1, 2, 3]
>>> import random
>>> def routing_function_Node_2(ind):
... if random.random() <= 0.5:
... return [2, 3]
... return [2, 1]
Oherwydd nad oes dyfodiadau yn Nod 3, ni fydd cwsmer yn cael taith wedi aseinio iddynt yna. Ond, rhaid defnyddio'r ffwythiant deiliad lle ciw.no_routing
i adlewyrchu hyn:
>>> N = ciw.create_network(
... arrival_distributions=[ciw.dists.Exponential(1),
... ciw.dists.Deterministic(1),
... ciw.dists.NoArrivals()],
... service_distributions=[ciw.dists.Exponential(2),
... ciw.dists.Exponential(2),
... ciw.dists.Exponential(2)],
... number_of_servers=[1,1,1],
... routing=[routing_function_Node_1,
... routing_function_Node_2,
... ciw.no_routing]
... )