-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest.py
More file actions
101 lines (80 loc) · 2.63 KB
/
Copy pathtest.py
File metadata and controls
101 lines (80 loc) · 2.63 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
import csv
import pulp as pl
import collections as cl
import pandas as pd
cov_file = 'coverage.csv'
coverages = dict()
with open(cov_file, 'r') as src:
for line in src:
data = line.strip().split(',')
pattern = data[0]
shifts = [int(t) for t in data[1:]]
coverages[pattern] = shifts
shifts = [1, 2, 3, 4, 5]
patterns = coverages.keys()
coverage_map = dict()
for (p, s) in [(p, s) for p in patterns for s in shifts]:
coverage_map[p, s] = 1 if s in coverages[p] else 0
# define the model: we want to minimize the hours
prob = pl.LpProblem("scheduling", pl.LpMinimize)
agents = ['robin', 'mathew', 'george', 'elisa']
vars_by_shift = {1: [],
2: [],
3: [],
4: [],
5: []
}
vars_by_agent = {'robin': [],
'mathew': [],
'george': [],
'elisa': []
}
schedule = []
# helper function
def shift_to_be_sent_to(pattern):
shifts = []
for shift in range(1, 6):
if coverage_map[pattern, shift] == 1:
shifts.append(shift)
return shifts
# store decision variables
for pattern in patterns:
for agent in agents:
shifts = shift_to_be_sent_to(pattern)
var = pl.LpVariable(
f"{agent},{pattern}", 0, 1, pl.LpInteger)
for shift in shifts:
# we want to send the variable to vars_by_shift in all corresponding vars_by_shift[shift]
vars_by_shift[shift].append(var)
# and send it to schedule and vars_by_agent only once
schedule.append(var)
vars_by_agent[agent].append(var)
prob += sum(schedule)
# constraint 1: must schedule someone at shift 1, 2, 5
for shift in vars_by_shift:
if shift == 1 or shift == 2 or shift == 5:
prob += sum(vars_by_shift[shift]) >= 1
if shift == 3 or shift == 4:
prob += sum(vars_by_shift[shift]) >= 2
# constraint 2: agent cant be scheduled once per day
for agent in agents:
prob += sum(vars_by_agent[agent]) <= 1
status = prob.solve()
print(pl.LpStatus[status])
# Results handling
results = list()
for shift, vars in vars_by_shift.items():
for var in vars:
if var.varValue == 1:
agent = var.name.split(',')[0]
results.append({
"shift": shift,
"worker": agent
})
data = []
for result in results:
data.append([result['shift'], result['worker']])
print("Result:", pl.LpStatus[status])
result_df = pd.DataFrame(data, columns=['shift', 'agent'])
result_df = result_df.sort_values(by=['shift', 'agent'])
result_df.to_csv('./schedule.csv', index=False)