How to Set Priority Classes¶
HCiw 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 hciw
>>> N = hciw.create_network(
... arrival_distributions={'Class 0': [hciw.dists.Exponential(rate=5)],
... 'Class 1': [hciw.dists.Exponential(rate=5)]},
... service_distributions={'Class 0': [hciw.dists.Exponential(rate=10)],
... 'Class 1': [hciw.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:
>>> hciw.seed(1)
>>> Q = hciw.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: