Skip to content

Commit a36990e

Browse files
committed
handles Time calculations for benchmarks
1 parent c88b171 commit a36990e

File tree

1 file changed

+71
-17
lines changed

1 file changed

+71
-17
lines changed

flowshop.py

Lines changed: 71 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
#!/usr/bin/env python
22
# -*- coding: utf-8 -*-
33

4+
import sys
45
from functools import lru_cache
56
from itertools import permutations
6-
7+
import time
78
import numpy as np
89

910
from geneticFunctions import *
@@ -40,10 +41,18 @@ def solve_johnson(self):
4041
Returns:
4142
tuple -- returns a tuple containing the optimal sequence of scheduled jobs and a list of scheduled jobs on the 2 machines
4243
"""
44+
4345
if self.nb_machines != 2:
4446
raise Exception(
4547
"Johnson's algorithm only possible for a 2 machine problem"
4648
)
49+
default_timer = None
50+
if sys.platform == "win32":
51+
default_timer = time.clock
52+
else:
53+
default_timer = time.time
54+
s = default_timer.__call__()
55+
4756
# Build optimal sequence array
4857
machine_1_sequence = [j for j in range(
4958
self.nb_jobs) if self.data[0][j] <= self.data[1][j]]
@@ -53,6 +62,9 @@ def solve_johnson(self):
5362
machine_2_sequence.sort(key=lambda x: self.data[1][x], reverse=True)
5463

5564
seq = machine_1_sequence + machine_2_sequence
65+
66+
e = default_timer.__call__()
67+
5668
jobs_m1, jobs_m2 = [], []
5769
job_name_rad = "job_"
5870
job = {"name": job_name_rad +
@@ -84,7 +96,8 @@ def solve_johnson(self):
8496
"end_time": job_end_m2}
8597
jobs_m2.append(job)
8698
optim_makespan = int(jobs_m2[-1]["end_time"])
87-
return seq, [jobs_m1, jobs_m2], optim_makespan
99+
t_t = e - s
100+
return seq, [jobs_m1, jobs_m2], optim_makespan, t_t
88101

89102
@staticmethod
90103
def johnson_seq(data):
@@ -123,6 +136,13 @@ def cds(self):
123136
else:
124137
data_ndarray = self.data
125138
data_transposed = data_ndarray.T
139+
default_timer = None
140+
if sys.platform == "win32":
141+
default_timer = time.clock
142+
else:
143+
default_timer = time.time
144+
s = default_timer.__call__()
145+
126146
merged_times = [[0, sum(j_t)] for j_t in data_transposed]
127147
perms = []
128148
for i in range(0, self.nb_machines-1):
@@ -133,6 +153,8 @@ def cds(self):
133153

134154
seq = min(perms, key=lambda p: self._get_makespan(p, self.data))
135155

156+
e = default_timer.__call__()
157+
136158
schedules = np.zeros((self.nb_machines, self.nb_jobs), dtype=dict)
137159
# schedule first job alone first
138160
task = {"name": "job_{}".format(
@@ -159,11 +181,8 @@ def cds(self):
159181
job_id+1), "start_time": start_t, "end_time": end_t}
160182
schedules[m_id][index+1] = task
161183
max_mkspn = int(schedules[self.nb_machines-1][-1]["end_time"])
162-
return seq, schedules, max_mkspn
163-
164-
165-
166-
184+
t_t = e - s
185+
return seq, schedules, max_mkspn, t_t
167186

168187
def palmer_heuristic(self):
169188
"""solves an N machines M jobs pfsp problem using Palmer's Heuristic
@@ -172,17 +191,23 @@ def palmer_heuristic(self):
172191
"""
173192

174193
def palmer_f(x): return -(self.nb_machines - (2*x - 1))
194+
195+
default_timer = None
196+
if sys.platform == "win32":
197+
default_timer = time.clock
198+
else:
199+
default_timer = time.time
200+
s = default_timer.__call__()
201+
175202
weights = list(map(palmer_f, range(1, self.nb_machines+1)))
176203
ws = []
177-
print(weights)
178-
print(self.data)
179204
for job_id in range(self.nb_jobs):
180205
p_ij = sum([self.data[j][job_id]*weights[j]
181206
for j in range(self.nb_machines)])
182207
ws.append((job_id, p_ij))
183208
ws.sort(key=lambda x: x[1], reverse=True)
184209
h_seq = [x[0] for x in ws]
185-
print(h_seq)
210+
e = default_timer.__call__()
186211
schedules = np.zeros((self.nb_machines, self.nb_jobs), dtype=dict)
187212
# schedule first job alone first
188213
task = {"name": "job_{}".format(
@@ -209,7 +234,8 @@ def palmer_f(x): return -(self.nb_machines - (2*x - 1))
209234
job_id+1), "start_time": start_t, "end_time": end_t}
210235
schedules[m_id][index+1] = task
211236
opt_makespan = int(schedules[self.nb_machines-1][-1]["end_time"])
212-
return h_seq, schedules, opt_makespan
237+
t_t = e - s
238+
return h_seq, schedules, opt_makespan, t_t
213239

214240
def _get_makespan(self, seq, data):
215241
c = np.zeros((self.nb_machines, len(seq)), dtype=object)
@@ -231,6 +257,13 @@ def _get_makespan(self, seq, data):
231257

232258
def neh_heuristic(self):
233259
sums = []
260+
default_timer = None
261+
if sys.platform == "win32":
262+
default_timer = time.clock
263+
else:
264+
default_timer = time.time
265+
s = default_timer.__call__()
266+
234267
for job_id in range(self.nb_jobs):
235268
p_ij = sum([self.data[j][job_id]
236269
for j in range(self.nb_machines)])
@@ -244,6 +277,8 @@ def neh_heuristic(self):
244277
cands.append((cand, self._get_makespan(cand, self.data)))
245278
seq = min(cands, key=lambda x: x[1])[0]
246279

280+
e = default_timer.__call__()
281+
247282
schedules = np.zeros((self.nb_machines, self.nb_jobs), dtype=dict)
248283
# schedule first job alone first
249284
task = {"name": "job_{}".format(
@@ -270,12 +305,24 @@ def neh_heuristic(self):
270305
job_id+1), "start_time": start_t, "end_time": end_t}
271306
schedules[m_id][index+1] = task
272307
max_mkspn = int(schedules[self.nb_machines-1][-1]["end_time"])
273-
return seq, schedules, max_mkspn
308+
309+
t_t = e - s
310+
return seq, schedules, max_mkspn, t_t
274311

275312
@lru_cache(maxsize=128)
276313
def brute_force_exact(self):
314+
default_timer = None
315+
if sys.platform == "win32":
316+
default_timer = time.clock
317+
else:
318+
default_timer = time.time
319+
s = default_timer.__call__()
320+
277321
jobs_perm = permutations(range(self.nb_jobs))
278322
seq = min(jobs_perm, key=lambda x: self._get_makespan(x, self.data))
323+
324+
e = default_timer.__call__()
325+
279326
schedules = np.zeros((self.nb_machines, self.nb_jobs), dtype=dict)
280327
# schedule first job alone first
281328
task = {"name": "job_{}".format(
@@ -302,9 +349,17 @@ def brute_force_exact(self):
302349
job_id+1), "start_time": start_t, "end_time": end_t}
303350
schedules[m_id][index+1] = task
304351
makespan = int(schedules[self.nb_machines-1][-1]["end_time"])
305-
return seq, schedules, makespan
352+
t_t = e -s
353+
return seq, schedules, makespan, t_t
306354

307355
def genetic_algorithm(self):
356+
default_timer = None
357+
if sys.platform == "win32":
358+
default_timer = time.clock
359+
else:
360+
default_timer = time.time
361+
s = default_timer.__call__()
362+
308363
optimal = [4534, 920, 1302]
309364
opt = 0
310365
no_of_jobs, no_of_machines = self.nb_jobs, self.nb_machines
@@ -363,6 +418,7 @@ def genetic_algorithm(self):
363418

364419
seq = list(map(int, costed_population[0][1]))
365420
makespan = self._get_makespan(seq, self.data)
421+
e = default_timer.__call__()
366422

367423
schedules = np.zeros((self.nb_machines, self.nb_jobs), dtype=dict)
368424
# schedule first job alone first
@@ -389,10 +445,8 @@ def genetic_algorithm(self):
389445
task = {"name": "job_{}".format(
390446
job_id+1), "start_time": start_t, "end_time": end_t}
391447
schedules[m_id][index+1] = task
392-
393-
#print(seq, makespan)
394-
# print(schedules)
395-
return seq, schedules, makespan
448+
t_t = e - s
449+
return seq, schedules, makespan, t_t
396450

397451

398452
class RandomFlowshop:

0 commit comments

Comments
 (0)