How to Set Priority Classes¶
Ciw has the capability to assign priorities to the customer classes. This is done by mapping customer classes to priority classes, included as a keyword when creating the Network object. An example is shown:
priority_classes={'Class 0': 0,
'Class 1': 1,
'Class 2': 1}
This shows a mapping from three customer classes to two priority classes. Customers in class 0 have the highest priority and are placed in priority class 0. Customers in class 1 and class 2 are both placed in priority class 1; they have the same priority as each other but less that those customers in class 0.
Note:
The lower the priority class number, the higher the priority. Customers in priority class 0 have higher priority than those with in priority class 1, who have higher priority than those in priority class 2, etc.
Priority classes are essentially Python indices, therefore if there are a total of 5 priority classes, priorities must be labelled 0, 1, 2, 3, 4. Skipping a priority class, or naming priority classes anything other than increasing integers from 0 will cause an error.
The priority discipline used is non-preemptive. Customers always finish their service and are not interrupted by higher priority customers.
To implement this, create the Network object with the priority_classes
option included with the mapping:
>>> import ciw
>>> N = ciw.create_network(
... arrival_distributions={'Class 0': [ciw.dists.Exponential(rate=5)],
... 'Class 1': [ciw.dists.Exponential(rate=5)]},
... service_distributions={'Class 0': [ciw.dists.Exponential(rate=10)],
... 'Class 1': [ciw.dists.Exponential(rate=10)]},
... priority_classes={'Class 0': 0, 'Class 1': 1},
... number_of_servers=[1]
... )
Now let’s run the simulation, comparing the waiting times for Class 0 and Class 1 customers, those with higher priority should have lower average wait than those with lower priority:
>>> ciw.seed(1)
>>> Q = ciw.Simulation(N)
>>> Q.simulate_until_max_time(100.0)
>>> recs = Q.get_all_records()
>>> waits_0 = [r.waiting_time for r in recs if r.customer_class=='Class 0']
>>> sum(waits_0)/len(waits_0)
0.1866109...
>>> waits_1 = [r.waiting_time for r in recs if r.customer_class=='Class 1']
>>> sum(waits_1)/len(waits_1)
7.6103100...
Pre-emption¶
There are a number of options that can be used to pre-emptively replace lower priority customers from service. See the following page: