-
Notifications
You must be signed in to change notification settings - Fork 3
/
weight_loss_plan_ip2.py
90 lines (76 loc) · 2.78 KB
/
weight_loss_plan_ip2.py
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
import time
import pulp
def solve_mip_model(N,
M,
c,
max_day_time=6,
max_single_day_time=4,
min_cont=3,
min_interval=4,
EN=3):
# Create a LP problem
problem = pulp.LpProblem("Exercise_Scheduling", pulp.LpMaximize)
# Variables
x = [
pulp.LpVariable(f'x_{i}', lowBound=0, upBound=180, cat=pulp.LpInteger)
for i in range(N)
]
y = [pulp.LpVariable(f'y_{i}', cat=pulp.LpBinary) for i in range(N)]
t = [[
pulp.LpVariable(f't_{i}_{j}',
lowBound=0,
upBound=max_day_time,
cat=pulp.LpInteger) for j in range(M)
] for i in range(N)]
z = [[pulp.LpVariable(f'z_{i}_{j}', cat=pulp.LpBinary) for j in range(M)]
for i in range(N)]
# Constraints
for i in range(N):
problem += x[i] == sum(c[j] * t[i][j] for j in range(M))
problem += sum(t[i][j] for j in range(M)) <= max_day_time
for j in range(M):
problem += t[i][j] <= max_single_day_time
if i <= N - min_cont - 1:
problem += sum(y[k]
for k in range(i, i + min_cont + 1)) <= min_cont
if i <= N - min_interval - 1:
for j in range(M):
problem += sum(z[k][j]
for k in range(i, i + min_interval + 1)) <= 1
problem += sum(z[i][j] for j in range(M)) <= EN
for j in range(M):
problem += y[i] >= z[i][j]
for j in range(M):
problem += t[i][j].getUb() * z[i][j] >= t[i][j]
# Objective
objective = sum(x[i] for i in range(N))
problem += objective
# Solve the model
# problem.solve(pulp.PULP_CBC_CMD(msg=False))
problem.solve(pulp.CPLEX_PY(msg=False))
# Print results
if problem.status == pulp.LpStatusOptimal:
print('wall time =', problem.solutionCpuTime)
print('Objective value =', pulp.value(objective))
# for i in range(N):
# print(f'Day {i + 1}: ')
# for j in range(M):
# if z[i][j].value() == 1:
# print(f'{exercise[j]}: {t[i][j].value() * 10} minutes')
else:
print('The problem does not have an optimal solution.')
if __name__ == '__main__':
# Define your parameters here
N = 30
M = 6
c = [15, 20, 30, 28, 27,
18] # List of consumption values for each type of exercise
exercise = [
'Push-ups', 'Sit-ups', 'Squats', 'Pull-ups', 'Leg-lifts', 'Planks'
]
# time the following function call
s = time.perf_counter()
for i in range(10):
solve_mip_model(N, M, c)
e = time.perf_counter()
print(f'Average time: {(e - s) / 10}')