Nifer Newidol o Gweinyddion

Yn yr enghraifft hon byddwn yn ystyried rhwydwaith lle ychwanegwn neu dilewn gweinyddion 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 ciw M/M/1 gyda \(\Lambda = 1\) ac \(\mu = 0.4\). Fan hyn mae'r dwysedd traffig yn fwy nag un, hynny yw mae cwsmeriaid yn cyrraedd yn gyflymach na gallen nhw cael eu gwasanaethu, ac felly bydd y maint ciw yn cynyddu dros amser. Gadewch i ni weld hwn:

>>> import ciw

>>> N = ciw.create_network(
...     arrival_distributions=[ciw.dists.Exponential(1)],
...     service_distributions=[ciw.dists.Exponential(0.4)],
...     number_of_servers=[1]
... )

>>> ciw.seed(0)
>>> Q = ciw.Simulation(N, tracker=ciw.trackers.SystemPopulation())
>>> Q.simulate_until_max_time(100)

Nawr plotiwn poblogaeth y system dros amser:

>>> plt.plot(
...     [row[0] for row in Q.statetracker.history],
...     [row[1] for row in Q.statetracker.history]
... ); 
Plot o boblogaeth y system yn cynyddu dros amser.

Gyda'r ymddygiad dymunol

Nawr byddwn yn creu AdaptiveNode a fydd yn ychwanegu dau gweinydd os yw'r poblogaeth yn mynd yn fwy na 10 unigolyn, and yna disgyn yn ôl i un gweinydd os yw'r poblogaeth yn disgyn yn ôl i dri unigolyn. Yn gyntaf creuwn y AdaptiveNode sy'n eitfeddu o'r dosbarth ciw.Node, ac yn trosysgrifennu'r dull have_event fel ei bod yn gwirio'r maint poblogaeth ac yn ychwanegu / dileu gweinyddion fel sydd angen:

>>> class AdaptiveNode(ciw.Node):
...     def have_event(self):
...         if (len(self.all_individuals) > 10) and (len(self.servers) == 1):
...             print(f'Adding servers at {self.get_now():.3f}')
...             self.add_new_servers(2)
...         elif (len(self.all_individuals) < 4) and (len([s for s in self.servers if not s.offduty]) == 3):
...             print(f'Removing servers at {self.get_now():.3f}')
...             self.take_servers_off_duty()
...             self.add_new_servers(1)
...         super().have_event()

Fan hyn rydym wedi ychwanegu datganiadau print er mwyn recordio pryd mae'r newidiadau mewn niferoedd gweinyddion yn digwydd.

Nawr ail-rhedwn yr un system, yn dweud wrth Ciw i defnyddio'r node_class newydd. We'll still begin with just one server:

>>> ciw.seed(0)
>>> Q = ciw.Simulation(N, node_class=AdaptiveNode, tracker=ciw.trackers.SystemPopulation())
>>> Q.simulate_until_max_time(100)
Adding servers at 12.279
Removing servers at 43.344
Adding servers at 89.848

Nawr plotiwn poblogaeth y system dros amser:

>>> plt.plot(
...     [row[0] for row in Q.statetracker.history],
...     [row[1] for row in Q.statetracker.history]
... ); 
Plot o boblogaeth y system dros amser.

Nawr gwelwn fod poblogaeth y system o dan rheolaeth gwell. Ymhellach, mae'r newidiadau mawr ym mhoblogaeth y system yn tueddu digwydd ar yr amseroedd cafodd y weinyddion eu ychwanegu neu eu dileu.