Skip to content

Commit c1e12f1

Browse files
committed
Optimises simulated annealing by not using N_Itr and passing the initial seq as palmers' seq
1 parent b48d51d commit c1e12f1

File tree

1 file changed

+14
-32
lines changed

1 file changed

+14
-32
lines changed

flowshop.py

Lines changed: 14 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -54,19 +54,15 @@ def solve_johnson(self):
5454
else:
5555
default_timer = time.time
5656
s = default_timer.__call__()
57-
5857
# Build optimal sequence array
5958
machine_1_sequence = [j for j in range(
6059
self.nb_jobs) if self.data[0][j] <= self.data[1][j]]
6160
machine_1_sequence.sort(key=lambda x: self.data[0][x])
6261
machine_2_sequence = [j for j in range(
6362
self.nb_jobs) if self.data[0][j] > self.data[1][j]]
6463
machine_2_sequence.sort(key=lambda x: self.data[1][x], reverse=True)
65-
6664
seq = machine_1_sequence + machine_2_sequence
67-
6865
e = default_timer.__call__()
69-
7066
jobs_m1, jobs_m2 = [], []
7167
job_name_rad = "job_"
7268
job = {"name": job_name_rad +
@@ -454,62 +450,48 @@ def swapTwoJobs(self,seq,pos1,pos2):
454450
seq[pos1], seq[pos2] = seq[pos2], seq[pos1]
455451
return seq
456452

457-
def simulated_annealing(self,Ti = 750,Tf = 2.5 ,alpha = 0.93):
453+
def simulated_annealing(self,Ti = 790,Tf = 3 ,alpha = 0.93):
458454
#Number of jobs given
459455
n = self.nb_jobs
460-
# of machines given
461-
m = self.nb_machines
462-
#Initialize the primary seq
463456
default_timer = None
464457
if sys.platform == "win32":
465458
default_timer = time.clock
466459
else:
467460
default_timer = time.time
468461
s = default_timer.__call__()
469-
470-
old_seq = list([ i for i in range(0,n)])
471-
shuffle(old_seq)
472-
new_seq = []
473-
old_makeSpan = self._get_makespan(old_seq,self.data)
474-
new_makeSpan = 0
475-
#The difference between the two makespans
462+
#Initialize the primary seq
463+
old_seq,schedules,old_makeSpan, _ = self.palmer_heuristic()
464+
new_seq = []
476465
delta_mk1 = 0
477-
#Set of cooling constants
478-
Cc = []
479466
#Initialize the temperature
480467
T = Ti
481468
Tf = Tf
482469
alpha = alpha
483470
# of iterations
484-
N_itr = (np.log(Tf/T)/np.log(alpha))
485471
temp_cycle = 0
486-
while N_itr > 0 :
487-
488-
pos1,pos2 = randint(0,n-1),randint(0,n-1)
489-
new_seq = self.swapTwoJobs(old_seq,pos1,pos2)
472+
while T >= Tf :
473+
new_seq = old_seq.copy()
474+
job = new_seq.pop(randint(0,n-1))
475+
new_seq.insert(randint(0,n-1),job)
490476
new_make_span = self._get_makespan(new_seq,self.data)
491477
delta_mk1 = new_make_span - old_makeSpan
492-
493478
if delta_mk1 <= 0:
494479
old_seq = new_seq
495480
old_makeSpan = new_make_span
496-
N_itr-=1
497481
else :
498-
Aprob = np.exp(-(delta_mk1/T) ** -1)
499-
if Aprob > np.random.uniform():
482+
Aprob = np.exp(-(delta_mk1/T))
483+
if Aprob > np.random.uniform(0.5,0.9):
500484
old_seq = new_seq
501485
old_makeSpan = new_make_span
502-
N_itr -= 1
503486
else :
504487
#The solution is discarded
505-
N_itr -= 1
506-
T = T * (alpha ** temp_cycle)
488+
pass
489+
T = T * alpha
507490
temp_cycle += 1
508491

509-
# Result Sequence
510-
seq = old_seq
511492
e = default_timer.__call__()
512-
493+
#Result Sequence
494+
seq = old_seq
513495
schedules = np.zeros((self.nb_machines, self.nb_jobs), dtype=dict)
514496
# schedule first job alone first
515497
task = {"name": "job_{}".format(

0 commit comments

Comments
 (0)