Sut i Ganfod Llwyrglo

Ffenomen yw llwyrglo lle mar holl symudiad a llif cwsmeriaid mewn rhwydwaith ciwio cyfyngedig yn dod i ben, oherwydd blocio cylchol. Mae'r diagram isod yn dangos enghraifft, mae'r cwsmer yn y nod top wedi blocio i'r nod gwaelod, a'r cwsmer yn y nod gwaelod wedi blocio i'r nod top. Mae'r blocio cylchol yma yn achosi holl symudiad naturiol i beidio.

Rhwydwaith ciwio 2 node mewn llwyrglo.

Mae gan Ciw y gallu i ganfod llwyrglo. Gyda Ciw, fe all efelychu rhwydwaith ciwio nes cyrraedd llwyrglo. Yna mae Ciw yn cofnodi'r amser nes cyrraedd llwyrglo o bob cyflwr. (Gwelwch y ddogfennaeth ar tracwyr cyflwr.)

I fanteisio ar y nodwedd yma, gosodwch y ddadl deadlock_detection i un o’r dulliau canfod llwyrglo wrth greu gwrthrych Simulation. Ar hyn o bryd yr unig ddull yw 'StateDigraph'. Yna defnyddiwch y dull simulate_until_deadlock. Mae'r briodwedd times_to_deadlock yn cynnwys yr amseroedd nes cyrraedd llwyrglo o bob cyflwr.

Ystyriwch y ciw M/M/1/3 lle mae gan gwsmeriaid tebygolrwydd 0.5 o ail-ymuno a'r ciw ar ôl gwasanaeth. Os yw'r ciw yn llawn yna caiff y cwsmer yn ei flocio, felly mae'r system yn cyrraedd llwyrglo.

Paramedrau:

>>> import ciw
>>> N = ciw.create_network(
...    arrival_distributions=[ciw.dists.Exponential(6.0)],
...    service_distributions=[ciw.dists.Exponential(5.0)],
...    routing=[[0.5]],
...    number_of_servers=[1],
...    queue_capacities=[3]
... )

Rhedeg nes cyrraedd llwyrglo (gan ddefnyddio gwrthrych ciw.trackers.NaiveBlocking):

>>> import ciw
>>> ciw.seed(1)
>>> Q = ciw.Simulation(N,
...     deadlock_detector=ciw.deadlock.StateDigraph(),
...     tracker=ciw.trackers.NaiveBlocking()
... )
>>> Q.simulate_until_deadlock()
>>> Q.times_to_deadlock 
{((0, 0),): 0.94539784..., ((1, 0),): 0.92134933..., ((2, 0),): 0.68085451..., ((3, 0),): 0.56684471..., ((3, 1),): 0.0, ((4, 0),): 0.25332344...}

Fan hyn allweddau yn cyfateb a chyflyrau a chofnodwyd gan y traciwr cyflwr. Nodwch, er mwyn i times_to_deadlock fod yn ystyrlon, angen defnyddio traciwr cyflwr.