-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathData.py
More file actions
494 lines (471 loc) · 27.6 KB
/
Data.py
File metadata and controls
494 lines (471 loc) · 27.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
import random
# SCENARIO
# time horizon: 2 weeks
num_time_periods = 2
# shift types list
shift_types = ['morning', 'afternoon', 'night']
# contract types list
contract_types = ['full_time', 'part_time', 'on_call']
# contracts details
contracts = {'full_time': {'min_assignments': 5, 'max_assignments': 12, 'min_cons_working_days': 1, 'max_cons_working_days': 5,
'min_cons_days_off': 1, 'max_cons_days_off': 6, 'max_working_week_ends': 2, 'complete_week_ends': False},
'part_time': {'min_assignments': 8, 'max_assignments': 12, 'min_cons_working_days': 2, 'max_cons_working_days': 6,
'min_cons_days_off': 1, 'max_cons_days_off': 5, 'max_working_week_ends': 2, 'complete_week_ends': True},
'on_call': {'min_assignments': 0, 'max_assignments': 5, 'min_cons_working_days': 1, 'max_cons_working_days': 5,
'min_cons_days_off': 1, 'max_cons_days_off': 14, 'max_working_week_ends': 2, 'complete_week_ends': False}
}
# skills list
skills = ['head_nurse', 'regular_nurse', 'trainee']
# nurses: dictionary of dictionaries
nurses = {0 : {'name': 'Tina', 'contract_type': 'full_time', 'skills': ['head_nurse', 'regular_nurse']},
1 : {'name': 'Giovanna', 'contract_type': 'part_time', 'skills': ['regular_nurse']},
2 : {'name': 'Ilaria', 'contract_type': 'on_call', 'skills': ['trainee']},
3 : {'name': 'Umberto', 'contract_type': 'full_time', 'skills': ['regular_nurse']},
4 : {'name': 'Ugo', 'contract_type': 'part_time', 'skills': ['trainee']},
5 : {'name': 'Francesca', 'contract_type': 'full_time', 'skills': ['trainee']},
6 : {'name': 'Gilberto', 'contract_type': 'full_time', 'skills': ['head_nurse']},
7 : {'name': 'Elena', 'contract_type': 'part_time', 'skills': ['regular_nurse']},
8 : {'name': 'Maria', 'contract_type': 'part_time', 'skills': ['trainee']},
9 : {'name': 'Paolo', 'contract_type': 'on_call', 'skills': ['regular_nurse', 'trainee']},
10 : {'name': 'Roberta', 'contract_type': 'part_time', 'skills': ['regular_nurse']},
11 : {'name': 'Franco', 'contract_type': 'full_time', 'skills': ['trainee']},
12 : {'name': 'Iva', 'contract_type': 'full_time', 'skills': ['regular_nurse']},
13 : {'name': 'Paola', 'contract_type': 'full_time', 'skills': ['head_nurse']},
14 : {'name': 'Bianca', 'contract_type': 'on_call', 'skills': ['trainee']},
15 : {'name': 'Mauro', 'contract_type': 'on_call', 'skills': ['regular_nurse']},
16 : {'name': 'Francesco', 'contract_type': 'part_time', 'skills': ['trainee']},
17 : {'name': 'Patrizia', 'contract_type': 'full_time', 'skills': ['trainee']},
18 : {'name': 'Giada', 'contract_type': 'full_time', 'skills': ['head_nurse']},
19 : {'name': 'Lorenza', 'contract_type': 'part_time', 'skills': ['regular_nurse']},
20 : {'name': 'Roberto', 'contract_type': 'part_time', 'skills': ['trainee']},
21 : {'name': 'Riccardo', 'contract_type': 'on_call', 'skills': ['regular_nurse', 'trainee']},
22 : {'name': 'Silvia', 'contract_type': 'part_time', 'skills': ['regular_nurse']},
23 : {'name': 'Angela', 'contract_type': 'full_time', 'skills': ['trainee']},
24 : {'name': 'Pina', 'contract_type': 'full_time', 'skills': ['head_nurse', 'regular_nurse']},
25 : {'name': 'Giusi', 'contract_type': 'part_time', 'skills': ['regular_nurse']},
26 : {'name': 'Chiara', 'contract_type': 'on_call', 'skills': ['trainee']},
27 : {'name': 'Anna', 'contract_type': 'full_time', 'skills': ['regular_nurse']},
28 : {'name': 'Annalisa', 'contract_type': 'part_time', 'skills': ['trainee']},
29 : {'name': 'Ferdinando', 'contract_type': 'full_time', 'skills': ['trainee']},
30 : {'name': 'Giovanni', 'contract_type': 'full_time', 'skills': ['head_nurse']},
31 : {'name': 'Mario', 'contract_type': 'part_time', 'skills': ['regular_nurse']},
32 : {'name': 'Rodolfo', 'contract_type': 'part_time', 'skills': ['trainee']},
33 : {'name': 'Martina', 'contract_type': 'on_call', 'skills': ['regular_nurse', 'trainee']},
34 : {'name': 'Viola', 'contract_type': 'part_time', 'skills': ['regular_nurse']},
35 : {'name': 'Federico', 'contract_type': 'full_time', 'skills': ['trainee']}
}
# minimum number of consecutive assignments
minimum_consecutive_assignment = {'morning' : 2, 'afternoon' : 3, 'night' : 1}
# maximum number of consecutive assignments
maximum_consecutive_assignment = {'morning' : 3, 'afternoon' : 4, 'night' : 1}
# matrix that represents the shifts succession that are forbidden
forbidden_shifts_succession = {'morning' : {'morning' : False, 'afternoon' : False , 'night' : False},
'afternoon' : {'morning' : False, 'afternoon' : False, 'night' : False},
'night' : {'morning' : True, 'afternoon' : True, 'night' : True}
}
lambdaS1 = 30
lambdaS2_min = 15
lambdaS2_max = 30
lambdaS3 = 30
lambdaS4 = 10
lambdaS5 = 30
lambdaS6 = 20
lambdaS7 = 30
# WEEK-DATA
# single week: 7 days
week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
days = [day + '-' + str(t) for t in range(num_time_periods) for day in week]
# optimum number of nurses
optimum_nurses = {
('Monday-0', 'morning', 'head_nurse'): 1,
('Monday-0', 'morning', 'regular_nurse'): 4,
('Monday-0', 'morning', 'trainee'): 3,
('Monday-0', 'afternoon', 'head_nurse'): 1,
('Monday-0', 'afternoon', 'regular_nurse'): 4,
('Monday-0', 'afternoon', 'trainee'): 3,
('Monday-0', 'night', 'head_nurse'): 1,
('Monday-0', 'night', 'regular_nurse'): 4,
('Monday-0', 'night', 'trainee'): 5,
('Tuesday-0', 'morning', 'head_nurse'): 1,
('Tuesday-0', 'morning', 'regular_nurse'): 5,
('Tuesday-0', 'morning', 'trainee'): 2,
('Tuesday-0', 'afternoon', 'head_nurse'): 1,
('Tuesday-0', 'afternoon', 'regular_nurse'): 4,
('Tuesday-0', 'afternoon', 'trainee'): 2,
('Tuesday-0', 'night', 'head_nurse'): 1,
('Tuesday-0', 'night', 'regular_nurse'): 5,
('Tuesday-0', 'night', 'trainee'): 5,
('Wednesday-0', 'morning', 'head_nurse'): 1,
('Wednesday-0', 'morning', 'regular_nurse'): 4,
('Wednesday-0', 'morning', 'trainee'): 2,
('Wednesday-0', 'afternoon', 'head_nurse'): 1,
('Wednesday-0', 'afternoon', 'regular_nurse'): 2,
('Wednesday-0', 'afternoon', 'trainee'): 3,
('Wednesday-0', 'night', 'head_nurse'): 1,
('Wednesday-0', 'night', 'regular_nurse'): 5,
('Wednesday-0', 'night', 'trainee'): 4,
('Thursday-0', 'morning', 'head_nurse'): 1,
('Thursday-0', 'morning', 'regular_nurse'): 5,
('Thursday-0', 'morning', 'trainee'): 3,
('Thursday-0', 'afternoon', 'head_nurse'): 1,
('Thursday-0', 'afternoon', 'regular_nurse'): 3,
('Thursday-0', 'afternoon', 'trainee'): 5,
('Thursday-0', 'night', 'head_nurse'): 1,
('Thursday-0', 'night', 'regular_nurse'): 5,
('Thursday-0', 'night', 'trainee'): 3,
('Friday-0', 'morning', 'head_nurse'): 1,
('Friday-0', 'morning', 'regular_nurse'): 5,
('Friday-0', 'morning', 'trainee'): 4,
('Friday-0', 'afternoon', 'head_nurse'): 1,
('Friday-0', 'afternoon', 'regular_nurse'): 5,
('Friday-0', 'afternoon', 'trainee'): 4,
('Friday-0', 'night', 'head_nurse'): 1,
('Friday-0', 'night', 'regular_nurse'): 2,
('Friday-0', 'night', 'trainee'): 5,
('Saturday-0', 'morning', 'head_nurse'): 1,
('Saturday-0', 'morning', 'regular_nurse'): 4,
('Saturday-0', 'morning', 'trainee'): 4,
('Saturday-0', 'afternoon', 'head_nurse'): 1,
('Saturday-0', 'afternoon', 'regular_nurse'): 5,
('Saturday-0', 'afternoon', 'trainee'): 5,
('Saturday-0', 'night', 'head_nurse'): 1,
('Saturday-0', 'night', 'regular_nurse'): 4,
('Saturday-0', 'night', 'trainee'): 4,
('Sunday-0', 'morning', 'head_nurse'): 1,
('Sunday-0', 'morning', 'regular_nurse'): 3,
('Sunday-0', 'morning', 'trainee'): 4,
('Sunday-0', 'afternoon', 'head_nurse'): 1,
('Sunday-0', 'afternoon', 'regular_nurse'): 2,
('Sunday-0', 'afternoon', 'trainee'): 4,
('Sunday-0', 'night', 'head_nurse'): 1,
('Sunday-0', 'night', 'regular_nurse'): 2,
('Sunday-0', 'night', 'trainee'): 2,
('Monday-1', 'morning', 'head_nurse'): 1,
('Monday-1', 'morning', 'regular_nurse'): 4,
('Monday-1', 'morning', 'trainee'): 3,
('Monday-1', 'afternoon', 'head_nurse'): 1,
('Monday-1', 'afternoon', 'regular_nurse'): 4,
('Monday-1', 'afternoon', 'trainee'): 3,
('Monday-1', 'night', 'head_nurse'): 1,
('Monday-1', 'night', 'regular_nurse'): 4,
('Monday-1', 'night', 'trainee'): 5,
('Tuesday-1', 'morning', 'head_nurse'): 1,
('Tuesday-1', 'morning', 'regular_nurse'): 5,
('Tuesday-1', 'morning', 'trainee'): 2,
('Tuesday-1', 'afternoon', 'head_nurse'): 1,
('Tuesday-1', 'afternoon', 'regular_nurse'): 4,
('Tuesday-1', 'afternoon', 'trainee'): 2,
('Tuesday-1', 'night', 'head_nurse'): 1,
('Tuesday-1', 'night', 'regular_nurse'): 5,
('Tuesday-1', 'night', 'trainee'): 5,
('Wednesday-1', 'morning', 'head_nurse'): 1,
('Wednesday-1', 'morning', 'regular_nurse'): 4,
('Wednesday-1', 'morning', 'trainee'): 2,
('Wednesday-1', 'afternoon', 'head_nurse'): 1,
('Wednesday-1', 'afternoon', 'regular_nurse'): 2,
('Wednesday-1', 'afternoon', 'trainee'): 3,
('Wednesday-1', 'night', 'head_nurse'): 1,
('Wednesday-1', 'night', 'regular_nurse'): 5,
('Wednesday-1', 'night', 'trainee'): 4,
('Thursday-1', 'morning', 'head_nurse'): 1,
('Thursday-1', 'morning', 'regular_nurse'): 5,
('Thursday-1', 'morning', 'trainee'): 3,
('Thursday-1', 'afternoon', 'head_nurse'): 1,
('Thursday-1', 'afternoon', 'regular_nurse'): 3,
('Thursday-1', 'afternoon', 'trainee'): 5,
('Thursday-1', 'night', 'head_nurse'): 1,
('Thursday-1', 'night', 'regular_nurse'): 5,
('Thursday-1', 'night', 'trainee'): 3,
('Friday-1', 'morning', 'head_nurse'): 1,
('Friday-1', 'morning', 'regular_nurse'): 5,
('Friday-1', 'morning', 'trainee'): 4,
('Friday-1', 'afternoon', 'head_nurse'): 1,
('Friday-1', 'afternoon', 'regular_nurse'): 5,
('Friday-1', 'afternoon', 'trainee'): 4,
('Friday-1', 'night', 'head_nurse'): 1,
('Friday-1', 'night', 'regular_nurse'): 2,
('Friday-1', 'night', 'trainee'): 5,
('Saturday-1', 'morning', 'head_nurse'): 1,
('Saturday-1', 'morning', 'regular_nurse'): 4,
('Saturday-1', 'morning', 'trainee'): 4,
('Saturday-1', 'afternoon', 'head_nurse'): 1,
('Saturday-1', 'afternoon', 'regular_nurse'): 5,
('Saturday-1', 'afternoon', 'trainee'): 5,
('Saturday-1', 'night', 'head_nurse'): 1,
('Saturday-1', 'night', 'regular_nurse'): 4,
('Saturday-1', 'night', 'trainee'): 4,
('Sunday-1', 'morning', 'head_nurse'): 1,
('Sunday-1', 'morning', 'regular_nurse'): 3,
('Sunday-1', 'morning', 'trainee'): 4,
('Sunday-1', 'afternoon', 'head_nurse'): 1,
('Sunday-1', 'afternoon', 'regular_nurse'): 2,
('Sunday-1', 'afternoon', 'trainee'): 4,
('Sunday-1', 'night', 'head_nurse'): 1,
('Sunday-1', 'night', 'regular_nurse'): 2,
('Sunday-1', 'night', 'trainee'): 2,
}
# minimum number of nurses
minimum_nurses = {
('Monday-0', 'morning', 'head_nurse'): 1,
('Monday-0', 'morning', 'regular_nurse'): 1,
('Monday-0', 'morning', 'trainee'): 2,
('Monday-0', 'afternoon', 'head_nurse'): 1,
('Monday-0', 'afternoon', 'regular_nurse'): 2,
('Monday-0', 'afternoon', 'trainee'): 1,
('Monday-0', 'night', 'head_nurse'): 1,
('Monday-0', 'night', 'regular_nurse'): 1,
('Monday-0', 'night', 'trainee'): 1,
('Tuesday-0', 'morning', 'head_nurse'): 1,
('Tuesday-0', 'morning', 'regular_nurse'): 2,
('Tuesday-0', 'morning', 'trainee'): 2,
('Tuesday-0', 'afternoon', 'head_nurse'): 1,
('Tuesday-0', 'afternoon', 'regular_nurse'): 1,
('Tuesday-0', 'afternoon', 'trainee'): 2,
('Tuesday-0', 'night', 'head_nurse'): 1,
('Tuesday-0', 'night', 'regular_nurse'): 2,
('Tuesday-0', 'night', 'trainee'): 2,
('Wednesday-0', 'morning', 'head_nurse'): 1,
('Wednesday-0', 'morning', 'regular_nurse'): 2,
('Wednesday-0', 'morning', 'trainee'): 2,
('Wednesday-0', 'afternoon', 'head_nurse'): 1,
('Wednesday-0', 'afternoon', 'regular_nurse'): 1,
('Wednesday-0', 'afternoon', 'trainee'): 1,
('Wednesday-0', 'night', 'head_nurse'): 1,
('Wednesday-0', 'night', 'regular_nurse'): 1,
('Wednesday-0', 'night', 'trainee'): 2,
('Thursday-0', 'morning', 'head_nurse'): 1,
('Thursday-0', 'morning', 'regular_nurse'): 2,
('Thursday-0', 'morning', 'trainee'): 2,
('Thursday-0', 'afternoon', 'head_nurse'): 1,
('Thursday-0', 'afternoon', 'regular_nurse'): 1,
('Thursday-0', 'afternoon', 'trainee'): 2,
('Thursday-0', 'night', 'head_nurse'): 1,
('Thursday-0', 'night', 'regular_nurse'): 2,
('Thursday-0', 'night', 'trainee'): 1,
('Friday-0', 'morning', 'head_nurse'): 1,
('Friday-0', 'morning', 'regular_nurse'): 2,
('Friday-0', 'morning', 'trainee'): 2,
('Friday-0', 'afternoon', 'head_nurse'): 1,
('Friday-0', 'afternoon', 'regular_nurse'): 2,
('Friday-0', 'afternoon', 'trainee'): 2,
('Friday-0', 'night', 'head_nurse'): 1,
('Friday-0', 'night', 'regular_nurse'): 1,
('Friday-0', 'night', 'trainee'): 2,
('Saturday-0', 'morning', 'head_nurse'): 1,
('Saturday-0', 'morning', 'regular_nurse'): 1,
('Saturday-0', 'morning', 'trainee'): 2,
('Saturday-0', 'afternoon', 'head_nurse'): 1,
('Saturday-0', 'afternoon', 'regular_nurse'): 2,
('Saturday-0', 'afternoon', 'trainee'): 2,
('Saturday-0', 'night', 'head_nurse'): 1,
('Saturday-0', 'night', 'regular_nurse'): 2,
('Saturday-0', 'night', 'trainee'): 1,
('Sunday-0', 'morning', 'head_nurse'): 1,
('Sunday-0', 'morning', 'regular_nurse'): 1,
('Sunday-0', 'morning', 'trainee'): 2,
('Sunday-0', 'afternoon', 'head_nurse'): 1,
('Sunday-0', 'afternoon', 'regular_nurse'): 1,
('Sunday-0', 'afternoon', 'trainee'): 2,
('Sunday-0', 'night', 'head_nurse'): 1,
('Sunday-0', 'night', 'regular_nurse'): 1,
('Sunday-0', 'night', 'trainee'): 1,
('Monday-1', 'morning', 'head_nurse'): 1,
('Monday-1', 'morning', 'regular_nurse'): 1,
('Monday-1', 'morning', 'trainee'): 2,
('Monday-1', 'afternoon', 'head_nurse'): 1,
('Monday-1', 'afternoon', 'regular_nurse'): 2,
('Monday-1', 'afternoon', 'trainee'): 1,
('Monday-1', 'night', 'head_nurse'): 1,
('Monday-1', 'night', 'regular_nurse'): 1,
('Monday-1', 'night', 'trainee'): 1,
('Tuesday-1', 'morning', 'head_nurse'): 1,
('Tuesday-1', 'morning', 'regular_nurse'): 2,
('Tuesday-1', 'morning', 'trainee'): 2,
('Tuesday-1', 'afternoon', 'head_nurse'): 1,
('Tuesday-1', 'afternoon', 'regular_nurse'): 1,
('Tuesday-1', 'afternoon', 'trainee'): 2,
('Tuesday-1', 'night', 'head_nurse'): 1,
('Tuesday-1', 'night', 'regular_nurse'): 2,
('Tuesday-1', 'night', 'trainee'): 2,
('Wednesday-1', 'morning', 'head_nurse'): 1,
('Wednesday-1', 'morning', 'regular_nurse'): 2,
('Wednesday-1', 'morning', 'trainee'): 2,
('Wednesday-1', 'afternoon', 'head_nurse'): 1,
('Wednesday-1', 'afternoon', 'regular_nurse'): 1,
('Wednesday-1', 'afternoon', 'trainee'): 1,
('Wednesday-1', 'night', 'head_nurse'): 1,
('Wednesday-1', 'night', 'regular_nurse'): 1,
('Wednesday-1', 'night', 'trainee'): 2,
('Thursday-1', 'morning', 'head_nurse'): 1,
('Thursday-1', 'morning', 'regular_nurse'): 2,
('Thursday-1', 'morning', 'trainee'): 2,
('Thursday-1', 'afternoon', 'head_nurse'): 1,
('Thursday-1', 'afternoon', 'regular_nurse'): 1,
('Thursday-1', 'afternoon', 'trainee'): 2,
('Thursday-1', 'night', 'head_nurse'): 1,
('Thursday-1', 'night', 'regular_nurse'): 2,
('Thursday-1', 'night', 'trainee'): 1,
('Friday-1', 'morning', 'head_nurse'): 1,
('Friday-1', 'morning', 'regular_nurse'): 2,
('Friday-1', 'morning', 'trainee'): 2,
('Friday-1', 'afternoon', 'head_nurse'): 1,
('Friday-1', 'afternoon', 'regular_nurse'): 2,
('Friday-1', 'afternoon', 'trainee'): 2,
('Friday-1', 'night', 'head_nurse'): 1,
('Friday-1', 'night', 'regular_nurse'): 1,
('Friday-1', 'night', 'trainee'): 2,
('Saturday-1', 'morning', 'head_nurse'): 1,
('Saturday-1', 'morning', 'regular_nurse'): 1,
('Saturday-1', 'morning', 'trainee'): 2,
('Saturday-1', 'afternoon', 'head_nurse'): 1,
('Saturday-1', 'afternoon', 'regular_nurse'): 2,
('Saturday-1', 'afternoon', 'trainee'): 2,
('Saturday-1', 'night', 'head_nurse'): 1,
('Saturday-1', 'night', 'regular_nurse'): 2,
('Saturday-1', 'night', 'trainee'): 1,
('Sunday-1', 'morning', 'head_nurse'): 1,
('Sunday-1', 'morning', 'regular_nurse'): 1,
('Sunday-1', 'morning', 'trainee'): 2,
('Sunday-1', 'afternoon', 'head_nurse'): 1,
('Sunday-1', 'afternoon', 'regular_nurse'): 1,
('Sunday-1', 'afternoon', 'trainee'): 2,
('Sunday-1', 'night', 'head_nurse'): 1,
('Sunday-1', 'night', 'regular_nurse'): 1,
('Sunday-1', 'night', 'trainee'): 1,
}
# nurse requests: not to work that day in that shift
permit_requests = [(0, 'Saturday-0', 'morning'),
(0, 'Saturday-0', 'afternoon'),
(0, 'Saturday-0', 'night'),
(1, 'Monday-0', 'morning'),
(2, 'Tuesday-0', 'afternoon'),
(3, 'Friday-0', 'night'),
(4, 'Sunday-0', 'morning'),
(5, 'Wednesday-0', 'afternoon'),
(6, 'Thursday-0', 'morning'),
(7, 'Monday-0', 'afternoon'),
(8, 'Friday-0', 'morning'),
(9, 'Sunday-0', 'night'),
(10, 'Thursday-0', 'morning'),
(10, 'Thursday-0', 'afternoon'),
(10, 'Thursday-0', 'night'),
(11, 'Monday-0', 'morning'),
(12, 'Saturday-0', 'morning'),
(12, 'Saturday-0', 'afternoon'),
(12, 'Saturday-0', 'night'),
(13, 'Monday-0', 'morning'),
(14, 'Tuesday-0', 'afternoon'),
(15, 'Friday-0', 'night'),
(16, 'Sunday-0', 'morning'),
(17, 'Wednesday-0', 'afternoon'),
(18, 'Thursday-0', 'morning'),
(19, 'Monday-0', 'afternoon'),
(20, 'Friday-0', 'morning'),
(21, 'Sunday-0', 'night'),
(22, 'Thursday-0', 'morning'),
(22, 'Thursday-0', 'afternoon'),
(22, 'Thursday-0', 'night'),
(23, 'Monday-0', 'morning'),
(24, 'Saturday-0', 'morning'),
(24, 'Saturday-0', 'afternoon'),
(24, 'Saturday-0', 'night'),
(25, 'Monday-0', 'morning'),
(26, 'Tuesday-0', 'afternoon'),
(27, 'Friday-0', 'night'),
(28, 'Sunday-0', 'morning'),
(29, 'Wednesday-0', 'afternoon'),
(30, 'Thursday-0', 'morning'),
(31, 'Monday-0', 'afternoon'),
(32, 'Friday-0', 'morning'),
(33, 'Sunday-0', 'night'),
(34, 'Thursday-0', 'morning'),
(34, 'Thursday-0', 'afternoon'),
(34, 'Thursday-0', 'night'),
(35, 'Monday-0', 'morning'),
(0, 'Saturday-1', 'morning'),
(0, 'Saturday-1', 'afternoon'),
(0, 'Saturday-1', 'night'),
(1, 'Monday-1', 'morning'),
(2, 'Tuesday-1', 'afternoon'),
(3, 'Friday-1', 'night'),
(4, 'Sunday-1', 'morning'),
(5, 'Wednesday-1', 'afternoon'),
(6, 'Thursday-1', 'morning'),
(7, 'Monday-1', 'afternoon'),
(8, 'Friday-1', 'morning'),
(9, 'Sunday-1', 'night'),
(10, 'Thursday-1', 'morning'),
(10, 'Thursday-1', 'afternoon'),
(10, 'Thursday-1', 'night'),
(11, 'Monday-1', 'morning'),
(12, 'Saturday-1', 'morning'),
(12, 'Saturday-1', 'afternoon'),
(12, 'Saturday-1', 'night'),
(13, 'Monday-1', 'morning'),
(14, 'Tuesday-1', 'afternoon'),
(15, 'Friday-1', 'night'),
(16, 'Sunday-1', 'morning'),
(17, 'Wednesday-1', 'afternoon'),
(18, 'Thursday-1', 'morning'),
(19, 'Monday-1', 'afternoon'),
(20, 'Friday-1', 'morning'),
(21, 'Sunday-1', 'night'),
(22, 'Thursday-1', 'morning'),
(22, 'Thursday-1', 'afternoon'),
(22, 'Thursday-1', 'night'),
(23, 'Monday-1', 'morning'),
(24, 'Saturday-1', 'morning'),
(24, 'Saturday-1', 'afternoon'),
(24, 'Saturday-1', 'night'),
(25, 'Monday-1', 'morning'),
(26, 'Tuesday-1', 'afternoon'),
(27, 'Friday-1', 'night'),
(28, 'Sunday-1', 'morning'),
(29, 'Wednesday-1', 'afternoon'),
(30, 'Thursday-1', 'morning'),
(31, 'Monday-1', 'afternoon'),
(32, 'Friday-1', 'morning'),
(33, 'Sunday-1', 'night'),
(34, 'Thursday-1', 'morning'),
(34, 'Thursday-1', 'afternoon'),
(34, 'Thursday-1', 'night'),
(35, 'Monday-1', 'morning')
]
# BORDER DATA
history = {0 : {'last_shift': 'morning', 'num_cons_shift': 2, 'num_cons_shift_sametype': 2, 'num_cons_days_off': 0, 'num_worked_shifts': 6, 'num_worked_week_ends': 2},
1 : {'last_shift': None, 'num_cons_shift': 0, 'num_cons_shift_sametype': 0, 'num_cons_days_off': 1, 'num_worked_shifts': 1, 'num_worked_week_ends': 1},
2 : {'last_shift': 'afternoon', 'num_cons_shift': 1, 'num_cons_shift_sametype': 1, 'num_cons_days_off': 0, 'num_worked_shifts': 4, 'num_worked_week_ends': 2},
3 : {'last_shift': 'morning', 'num_cons_shift': 3, 'num_cons_shift_sametype': 2, 'num_cons_days_off': 0, 'num_worked_shifts': 7, 'num_worked_week_ends': 1},
4 : {'last_shift': None, 'num_cons_shift': 0, 'num_cons_shift_sametype': 0, 'num_cons_days_off': 3, 'num_worked_shifts': 3, 'num_worked_week_ends': 0},
5 : {'last_shift': 'morning', 'num_cons_shift': 2, 'num_cons_shift_sametype': 2, 'num_cons_days_off': 0, 'num_worked_shifts': 8, 'num_worked_week_ends': 2},
6 : {'last_shift': 'afternoon', 'num_cons_shift': 3, 'num_cons_shift_sametype': 1, 'num_cons_days_off': 0, 'num_worked_shifts': 9, 'num_worked_week_ends': 2},
7 : {'last_shift': 'morning', 'num_cons_shift': 3, 'num_cons_shift_sametype': 1, 'num_cons_days_off': 0, 'num_worked_shifts': 5, 'num_worked_week_ends': 2},
8 : {'last_shift': 'night', 'num_cons_shift': 3, 'num_cons_shift_sametype': 1, 'num_cons_days_off': 0, 'num_worked_shifts': 3, 'num_worked_week_ends': 3},
9 : {'last_shift': 'afternoon', 'num_cons_shift': 4, 'num_cons_shift_sametype': 2, 'num_cons_days_off': 0, 'num_worked_shifts': 7, 'num_worked_week_ends': 2},
10 : {'last_shift': 'morning', 'num_cons_shift': 3, 'num_cons_shift_sametype': 2, 'num_cons_days_off': 0, 'num_worked_shifts': 3, 'num_worked_week_ends': 3},
11 : {'last_shift': 'morning', 'num_cons_shift': 3, 'num_cons_shift_sametype': 2, 'num_cons_days_off': 0, 'num_worked_shifts': 5, 'num_worked_week_ends': 2},
12 : {'last_shift': None, 'num_cons_shift': 0, 'num_cons_shift_sametype': 0, 'num_cons_days_off': 4, 'num_worked_shifts': 3, 'num_worked_week_ends': 2},
13 : {'last_shift': 'morning', 'num_cons_shift': 3, 'num_cons_shift_sametype': 2, 'num_cons_days_off': 0, 'num_worked_shifts': 2, 'num_worked_week_ends': 2},
14 : {'last_shift': 'afternoon', 'num_cons_shift': 1, 'num_cons_shift_sametype': 1, 'num_cons_days_off': 0, 'num_worked_shifts': 5, 'num_worked_week_ends': 5},
15 : {'last_shift': 'morning', 'num_cons_shift': 2, 'num_cons_shift_sametype': 2, 'num_cons_days_off': 0, 'num_worked_shifts': 3, 'num_worked_week_ends': 2},
16 : {'last_shift': 'night', 'num_cons_shift': 3, 'num_cons_shift_sametype': 1, 'num_cons_days_off': 0, 'num_worked_shifts': 3, 'num_worked_week_ends': 3},
17 : {'last_shift': None, 'num_cons_shift': 0, 'num_cons_shift_sametype': 0, 'num_cons_days_off': 1, 'num_worked_shifts': 3, 'num_worked_week_ends': 2},
18 : {'last_shift': 'morning', 'num_cons_shift': 4, 'num_cons_shift_sametype': 1, 'num_cons_days_off': 0, 'num_worked_shifts': 4, 'num_worked_week_ends': 4},
19 : {'last_shift': 'night', 'num_cons_shift': 3, 'num_cons_shift_sametype': 1, 'num_cons_days_off': 0, 'num_worked_shifts': 4, 'num_worked_week_ends': 4},
20 : {'last_shift': None, 'num_cons_shift': 0, 'num_cons_shift_sametype': 0, 'num_cons_days_off': 3, 'num_worked_shifts': 4, 'num_worked_week_ends': 3},
21 : {'last_shift': 'morning', 'num_cons_shift': 3, 'num_cons_shift_sametype': 2, 'num_cons_days_off': 0, 'num_worked_shifts': 3, 'num_worked_week_ends': 2},
22 : {'last_shift': 'morning', 'num_cons_shift': 2, 'num_cons_shift_sametype': 2, 'num_cons_days_off': 0, 'num_worked_shifts': 3, 'num_worked_week_ends': 2},
23 : {'last_shift': 'afternoon', 'num_cons_shift': 3, 'num_cons_shift_sametype': 3, 'num_cons_days_off': 0, 'num_worked_shifts': 2, 'num_worked_week_ends': 2},
24 : {'last_shift': 'morning', 'num_cons_shift': 5, 'num_cons_shift_sametype': 2, 'num_cons_days_off': 0, 'num_worked_shifts': 1, 'num_worked_week_ends': 1},
25 : {'last_shift': 'afternoon', 'num_cons_shift': 4, 'num_cons_shift_sametype': 1, 'num_cons_days_off': 0, 'num_worked_shifts': 3, 'num_worked_week_ends': 2},
26 : {'last_shift': None, 'num_cons_shift': 0, 'num_cons_shift_sametype': 0, 'num_cons_days_off': 2, 'num_worked_shifts': 2, 'num_worked_week_ends': 2},
27 : {'last_shift': 'night', 'num_cons_shift': 2, 'num_cons_shift_sametype': 1, 'num_cons_days_off': 0, 'num_worked_shifts': 3, 'num_worked_week_ends': 1},
28 : {'last_shift': 'morning', 'num_cons_shift': 3, 'num_cons_shift_sametype': 2, 'num_cons_days_off': 0, 'num_worked_shifts': 8, 'num_worked_week_ends': 2},
29 : {'last_shift': 'afternoon', 'num_cons_shift': 1, 'num_cons_shift_sametype': 1, 'num_cons_days_off': 0, 'num_worked_shifts': 3, 'num_worked_week_ends': 1},
30 : {'last_shift': None, 'num_cons_shift': 0, 'num_cons_shift_sametype': 0, 'num_cons_days_off': 1, 'num_worked_shifts': 3, 'num_worked_week_ends': 3},
31 : {'last_shift': 'morning', 'num_cons_shift': 4, 'num_cons_shift_sametype': 3, 'num_cons_days_off': 0, 'num_worked_shifts': 7, 'num_worked_week_ends': 4},
32 : {'last_shift': 'morning', 'num_cons_shift': 3, 'num_cons_shift_sametype': 2, 'num_cons_days_off': 0, 'num_worked_shifts': 3, 'num_worked_week_ends': 3},
33 : {'last_shift': None, 'num_cons_shift': 0, 'num_cons_shift_sametype': 0, 'num_cons_days_off': 1, 'num_worked_shifts': 6, 'num_worked_week_ends': 2},
34 : {'last_shift': 'night', 'num_cons_shift': 5, 'num_cons_shift_sametype': 1, 'num_cons_days_off': 0, 'num_worked_shifts': 5, 'num_worked_week_ends': 2},
35 : {'last_shift': 'afternoon', 'num_cons_shift': 3, 'num_cons_shift_sametype': 2, 'num_cons_days_off': 0, 'num_worked_shifts': 4, 'num_worked_week_ends': 2},
}