Dyfodiadau Cyflwr-dibynnol

Yn yr enghraifft hon byddwn yn ystyried rhwydwaith o gwsmeriaid sy'n cyrraedd i wahanol nodau yn dibynnu ar cyflwr y system. Edrychwn ar system heb yr ymddygiad hwn yn gyntaf, ac yna'r system gyda'r ymddygiad dymunol, i'w gymharu.

Heb yr ymddygiad dymunol

Ystyriwch y rhwydwaith dau nod canlynol, lle mae dyfodiadau ond yn digwydd yn y nod cyntaf, ac mae cynhwysedd ciwio o 10. Mae'r ail nod yn segur ac yn ddiangen yn y senario hon:

>>> import ciw
>>> from collections import Counter

>>> N = ciw.create_network(
...     arrival_distributions=[ciw.dists.Exponential(6.0), ciw.dists.NoArrivals()],
...     service_distributions=[ciw.dists.Exponential(5.0), ciw.dists.Exponential(5.0)],
...     routing=[[0.0, 0.0], [0.0, 0.0]],
...     number_of_servers=[1, 1],
...     queue_capacities=[10, float('inf')]
... )

Nawr rhedwn y system am 100 uned amser, a gwelwn cawn 494 gwasanaeth yn y nod cyntaf, a dim yn yr ail nod:

>>> ciw.seed(1)
>>> Q = ciw.Simulation(N)
>>> Q.simulate_until_max_time(100)

>>> service_nodes = [r.node for r in Q.get_all_records()]
>>> Counter(service_nodes)
Counter({1: 494})

Gyda'r ymddygiad dymunol

Nawr byddwn yn creu CustomArrivalNode newydd fel bod cwsmeriaid sy'n cyrraedd pan mae gan y nod cyntaf 10 neu mwy o gwsmeriaid yn bresenol yn cael eu hanfon i'r ail nod. Yn gyntaf mae'r CustomArrivalNode yn etifeddu o ciw.ArrivalNode, ac yn trosysgrifo'r dull send_individual:

>>> class CustomArrivalNode(ciw.ArrivalNode):
...     def send_individual(self, next_node, next_individual):
...         """
...         Yn anfon y next_individual i'r next_node
...         """
...         self.number_accepted_individuals += 1
...         if len(next_node.all_individuals) <= 10:
...             next_node.accept(next_individual)
...         else:
...             self.simulation.nodes[2].accept(next_individual)

Er mwyn rhedeg y system, mae angen cael gwared a'r arg queue_capacities wrth creu'r rhwydwaith, fel nad yw cwsmeriaid yn cael ei gwrthod cyn cyrraedd y dull send_individual method:

>>> N = ciw.create_network(
...     arrival_distributions=[ciw.dists.Exponential(6.0), ciw.dists.NoArrivals()],
...     service_distributions=[ciw.dists.Exponential(5.0), ciw.dists.Exponential(5.0)],
...     routing=[[0.0, 0.0], [0.0, 0.0]],
...     number_of_servers=[1, 1]
... )

Nawr ail-rhedwn yr un system, gan ddweud wrth Ciw i ddefnyddio'r arrival_node_class newydd. Gwelwn bron yr un nifer o gwasanaethau yn digwydd yn Nod 1, ond mae'r cwsmeriaud a fydd wedi cael eu gwrthod nawr yn cael gwasanaethau yn Nod 2:

>>> ciw.seed(1)
>>> Q = ciw.Simulation(N, arrival_node_class=CustomArrivalNode)
>>> Q.simulate_until_max_time(100)

>>> service_nodes = [r.node for r in Q.get_all_records()]
>>> Counter(service_nodes)
Counter({1: 503, 2: 84})