11#!/usr/bin/env python
22# -*- coding: utf-8 -*-
33
4+ import sys
45from functools import lru_cache
56from itertools import permutations
6-
7+ import time
78import numpy as np
89
910from 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
398452class RandomFlowshop :
0 commit comments