Source code for quantum_launcher.problems.problem_formulations.jssp.scheduler
[docs]
1def get_label(task, time):
2 return f"{task.job}_{task.position},{time}"
3
4
[docs]
5class Task:
6 def __init__(self, job, position, machine, duration):
7 self.job = job
8 self.position = position
9 self.machine = machine
10 self.duration = duration
11
12 def __repr__(self):
13 return ("{{job: {job}, position: {position}, machine: {machine}, duration:"
14 " {duration}}}").format(**vars(self))
15
16
[docs]
17class KeyList:
18
19 def __init__(self, array, key_function):
20 self.array = array
21 self.key_function = key_function
22
23 def __len__(self):
24 return len(self.array)
25
26 def __getitem__(self, index):
27 item = self.array[index]
28 key = self.key_function(item)
29 return key
30
31
[docs]
32class JobShopScheduler:
33 def __init__(self, job_dict, max_time=None):
34 self.tasks = []
35 self.last_task_indices = []
36 self.max_time = max_time
37 self.H = 0
38 self.H_vars = {}
39 self.absurd_times = set()
40 self._process_data(job_dict)
41
42 def _process_data(self, jobs):
43 tasks = []
44 last_task_indices = [-1]
45 total_time = 0
46
47 for job_name, job_tasks in jobs.items():
48 last_task_indices.append(last_task_indices[-1] + len(job_tasks))
49
50 for i, (machine, time_span) in enumerate(job_tasks):
51 tasks.append(Task(job_name, i, machine, time_span))
52 total_time += time_span
53
54 self.tasks = tasks
55 self.last_task_indices = last_task_indices[1:]
56
57 if self.max_time is None:
58 self.max_time = total_time
59
60 def _remove_absurd_times(self, disable_till: dict, disable_since, disabled_variables):
61 predecessor_time = 0
62 current_job = self.tasks[0].job
63 for task in self.tasks:
64 if task.job != current_job:
65 predecessor_time = 0
66 current_job = task.job
67
68 for t in range(predecessor_time):
69 label = get_label(task, t)
70 self.absurd_times.add(label)
71
72 predecessor_time += task.duration
73
74 successor_time = -1
75 current_job = self.tasks[-1].job
76 for task in self.tasks[::-1]:
77 if task.job != current_job:
78 successor_time = -1
79 current_job = task.job
80
81 successor_time += task.duration
82 for t in range(successor_time):
83 label = get_label(task, (self.max_time - 1) - t)
84 self.absurd_times.add(label)
85
86 for task in self.tasks:
87 if task.machine in disable_till.keys():
88 for i in range(disable_till[task.machine]):
89 label = get_label(task, i)
90 self.absurd_times.add(label)
91 elif task.machine in disable_since.keys():
92 for i in range(disable_since[task.machine], self.max_time):
93 label = get_label(task, i)
94 self.absurd_times.add(label)
95
96 for label in disabled_variables:
97 self.absurd_times.add(label)