Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit b2cf3a1

Browse files
Adds bruteforce solution to get best sequence
1 parent 0b186cb commit b2cf3a1

File tree

1 file changed

+50
-4
lines changed

1 file changed

+50
-4
lines changed

‎flowshop.py‎

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# -*- coding: utf-8 -*-
33

44
import numpy as np
5-
5+
fromitertoolsimportpermutations
66

77
class Flowshop(object):
88
"""
@@ -84,6 +84,11 @@ def cds(self, parameter_list):
8484
raise NotImplementedError
8585

8686
def palmer_heuristic(self):
87+
"""solves an N machines M jobs pfsp problem using Palmer's Heuristic
88+
89+
Returns:
90+
tuple -- a tuple containing the job sequence, scheduled jobs and optimal makespan.
91+
"""
8792
def palmer_f(x): return -(self.nb_machines - (2*x - 1))
8893
weights = list(map(palmer_f, range(1, self.nb_machines+1)))
8994
ws = []
@@ -124,6 +129,44 @@ def palmer_f(x): return -(self.nb_machines - (2*x - 1))
124129
opt_makespan = int(schedules[self.nb_machines-1][-1]["end_time"])
125130
return h_seq, schedules, opt_makespan
126131

132+
def brute_force_exact(self):
133+
jobs_perm = permutations(range(self.nb_jobs))
134+
opt_makespan = float("inf")
135+
for seq in jobs_perm:
136+
schedules = np.zeros((self.nb_machines, self.nb_jobs), dtype=dict)
137+
# schedule first job alone first
138+
task = {"name": "job_{}".format(
139+
seq[0]+1), "start_time": 0, "end_time": self.data[0][seq[0]]}
140+
schedules[0][0] = task
141+
for m_id in range(1, self.nb_machines):
142+
start_t = schedules[m_id-1][0]["end_time"]
143+
end_t = start_t + self.data[m_id][0]
144+
task = {"name": "job_{}".format(
145+
seq[0]+1), "start_time": start_t, "end_time": end_t}
146+
schedules[m_id][0] = task
147+
148+
for index, job_id in enumerate(seq[1::]):
149+
start_t = schedules[0][index]["end_time"]
150+
end_t = start_t + self.data[0][job_id]
151+
task = {"name": "job_{}".format(
152+
job_id+1), "start_time": start_t, "end_time": end_t}
153+
schedules[0][index+1] = task
154+
for m_id in range(1, self.nb_machines):
155+
start_t = max(schedules[m_id][index]["end_time"],
156+
schedules[m_id-1][index+1]["end_time"])
157+
end_t = start_t + self.data[m_id][job_id]
158+
task = {"name": "job_{}".format(
159+
job_id+1), "start_time": start_t, "end_time": end_t}
160+
schedules[m_id][index+1] = task
161+
makespan = int(schedules[self.nb_machines-1][-1]["end_time"])
162+
if makespan < opt_makespan:
163+
opt_makespan = makespan
164+
best_schedule = np.copy(schedules)
165+
best_seq = np.copy(seq)
166+
167+
return best_seq, best_schedule, opt_makespan
168+
169+
127170

128171
class RandomFlowshop:
129172
"""This module makes an instance of random flowshop problem,
@@ -195,10 +238,13 @@ def get_problem_instance(self):
195238

196239

197240
if __name__ == "__main__":
198-
random_problem = RandomFlowshop(3, 3)
241+
random_problem = RandomFlowshop(5, 5)
199242
random_problem_instance = random_problem.get_problem_instance()
200-
seq, scheds = random_problem_instance.palmer_heuristic()
201-
print(scheds)
243+
seq, scheds, opt_makespan = random_problem_instance.palmer_heuristic()
244+
b_seq, b_scheds, b_opt_makespan = random_problem_instance.brute_force_exact()
245+
246+
print("Brute Force: {}, Palmer heuristic: {}".format(b_opt_makespan, opt_makespan))
247+
202248
#seq, jobs, opt_makespan = random_problem_instance.solve_johnson()
203249
# print("Sequence: {} \nJobs on Machine 1: \n {} \n Jobs on machine 2:\n {} \n".format(
204250
# seq, jobs[0], jobs[1]))

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /