├── CP_solvers ├── FJSSP_CPLEX.py ├── FJSSP_ORTOOLS.py ├── JSSP_CPLEX.py └── JSSP_ORTOOLS.py ├── README.md ├── data ├── instance_features_FJSSP_300s.csv ├── instance_features_FJSSP_30s.csv ├── instance_features_JSSP_300s.csv └── instance_features_JSSP_30s.csv └── selector ├── New_instance_analysis.py ├── machine_learning_algorithm_selection_FJSSP.py ├── machine_learning_algorithm_selection_JSSP.py └── scoring.py /CP_solvers/FJSSP_CPLEX.py: -------------------------------------------------------------------------------- 1 | import collections 2 | import datetime 3 | 4 | from docplex.cp.model import * 5 | 6 | import plotly as py 7 | import plotly.figure_factory as ff 8 | dt = datetime.datetime 9 | time_delta = datetime.timedelta 10 | pyplt = py.offline.plot 11 | import random 12 | import os 13 | import pandas as pd 14 | 15 | def rgb(): 16 | return random.randint(0, 256) 17 | 18 | def read_instance_FJSSP(instance): 19 | jobs = [] 20 | operations = [] 21 | 22 | with open(instance) as f: 23 | lines = f.readlines() 24 | name = os.path.basename(instance) 25 | name = name.replace('.txt', '') 26 | 27 | first_line = lines[0].split() 28 | # Number of jobs 29 | nb_jobs = int(first_line[0]) 30 | #Number of AGVs 31 | nb_AGVs = int(first_line[1]) 32 | 33 | 34 | with open(instance) as file: 35 | for line in file.readlines()[1:]: 36 | strip_lines = line.strip() 37 | jobs_list = strip_lines.split() 38 | jobs_list = list(map(int, jobs_list)) 39 | jobs.append(jobs_list) 40 | 41 | for operation in jobs: 42 | nb_tasks = len(operation) 43 | tasklist = [] 44 | n = 1 45 | while n < nb_tasks: 46 | k = operation[n] # 1 47 | f = n + 1 48 | tuple = [(operation[f], operation[f + 1]) for f in range(f, n+k*2, 2)] 49 | tasklist.append(tuple) 50 | n = (2*k + n) + 1 51 | operations.append(tasklist) 52 | 53 | return operations, nb_AGVs, name, nb_jobs 54 | 55 | 56 | def flexible_jobshop_CPLEX(data, AGVs, name, nb_jobs): 57 | # Data part. 58 | jobs = data 59 | instance = name 60 | nb_AGVs = AGVs 61 | nb_jobs = nb_jobs 62 | 63 | num_jobs = len(jobs) 64 | all_jobs = range(num_jobs) 65 | num_machines = AGVs 66 | all_machines = range(num_machines) 67 | machines_list = [*range(0,num_machines+1)] 68 | jobs_list = [*range(0, num_jobs)] 69 | 70 | 71 | # create DataFrame that contains number of operations per job 72 | JobsOperationsTable = pd.DataFrame(columns=['op_id', 'job', 'priority']) 73 | count = 0 74 | opid = 0 75 | priority = [] 76 | oper_id = [] 77 | joblist = [] 78 | nbr_operations = len(jobs[count]) 79 | for j in jobs: 80 | for o in range(1, nbr_operations+1): 81 | ope_id = ('opr_'+str(opid)+'_'+str(o)) 82 | oper_id.append(ope_id) 83 | j = count 84 | prio = o 85 | joblist.append(j) 86 | priority.append(prio) 87 | opid = opid + 1 88 | count = count + 1 89 | #print(JobsOperationsTable) 90 | JobsOperationsTable["op_id"] = oper_id 91 | JobsOperationsTable["job"] = joblist 92 | JobsOperationsTable["priority"] = priority 93 | from collections import namedtuple 94 | TJobsOperations = namedtuple("TJobsOperations", ["op_id", "job", "priority"]) 95 | JobsOperations = [TJobsOperations(*joboperations_row) for joboperations_row in JobsOperationsTable.itertuples(index=False)] 96 | print(JobsOperations) 97 | 98 | #Create DataFrame that contains machine id and processing time 99 | OperationMachinesTable = pd.DataFrame(columns=['op_id', 'machine', 'proc_time']) 100 | count = 0 101 | opid = 0 102 | nbr_operations = len(jobs[count]) 103 | machine_id = [] 104 | processing_time = [] 105 | operation_id = [] 106 | for j in jobs: 107 | t = 1 108 | for task in j: 109 | l = len(task) 110 | for a in range (0,l): 111 | machine1 = task[a][0] 112 | time = task[a][1] 113 | op_id = ('opr_'+str(count)+'_'+str(t)) 114 | machine_id.append(machine1) 115 | processing_time.append(time) 116 | operation_id.append(op_id) 117 | t = t+1 118 | count = count+1 119 | 120 | OperationMachinesTable["op_id"] = operation_id 121 | OperationMachinesTable["machine"] = machine_id 122 | OperationMachinesTable["proc_time"] = processing_time 123 | 124 | TOperationMachines = namedtuple("TOperationMachines",['op_id', 'machine', 'proc_time']) 125 | OperationMachines = [TOperationMachines(*operationmachines_row) for operationmachines_row in 126 | OperationMachinesTable.itertuples(index=False)] 127 | print(OperationMachines) 128 | 129 | mdl = CpoModel(name='parallelMachineScheduling_FlexibleJobShop') 130 | 131 | # define interval variables 132 | jobops_itv_vars = {} 133 | for jo in JobsOperations: 134 | jobops_itv_vars[(jo.op_id, jo.job, jo.priority)] = mdl.interval_var( 135 | name="operation {} job {} priority {}".format(jo.op_id, jo.job, jo.priority)) 136 | 137 | opsmchs_itv_vars = {} 138 | for om in OperationMachines: 139 | opsmchs_itv_vars[(om.op_id, om.machine)] = mdl.interval_var(optional=True, size=om.proc_time, 140 | name="operation {} machine {}".format(om.op_id, 141 | om.machine)) 142 | 143 | # minimize makespan 144 | objective = mdl.max([mdl.end_of(opsmchs_itv_vars[(op_id, machine)]) for (op_id, machine) in opsmchs_itv_vars]) 145 | mdl.add(mdl.minimize(objective)) 146 | 147 | # Force no overlap for operations executed on an equal machine 148 | machine_operations = [[] for m in machines_list] 149 | for (op_id, machine) in opsmchs_itv_vars: 150 | machine_operations[machine].append(opsmchs_itv_vars[(op_id, machine)]) 151 | if machine_operations[0] == []: 152 | del machine_operations[0] 153 | for mops in machine_operations: 154 | mdl.add(mdl.no_overlap(mops)) 155 | 156 | # Each operation must start after the end of the predecessor 157 | previuosops=dict() 158 | for jo1 in JobsOperations: 159 | for jo2 in JobsOperations: 160 | if jo1.job==jo2.job and jo1.priority+1==jo2.priority: 161 | previuosops[jo2]=jo1.op_id 162 | for j in jobs_list: 163 | for jo in JobsOperations: 164 | if jo.job==j and jo.priority>=2: 165 | mdl.add(mdl.end_before_start(jobops_itv_vars[(previuosops[jo],jo.job, jo.priority-1)], jobops_itv_vars[(jo.op_id,jo.job, jo.priority)])) 166 | 167 | # job operation intervals can only take value if one of alternative operation-machines intervals take value 168 | for (op_id, job, priority) in jobops_itv_vars: 169 | mdl.add(mdl.alternative(jobops_itv_vars[(op_id, job, priority)], 170 | [opsmchs_itv_vars[(o, m)] for (o, m) in opsmchs_itv_vars if (o == op_id)], 1)) 171 | 172 | msol = mdl.solve(log_output=True, TimeLimit=10) 173 | 174 | makespan = msol.get_objective_value() 175 | #print(makespan) 176 | #solve_time = docplex.cp.solution.CpoSolveResult.get_solve_time(res) 177 | solve_time = msol.get_solve_time() 178 | 179 | print("Solution: ") 180 | msol.print_solution() 181 | 182 | import docplex.cp.utils_visu as visu 183 | import matplotlib.pyplot as plt 184 | from pylab import rcParams 185 | rcParams['figure.figsize'] = 25, 5 186 | 187 | '''if msol and visu.is_visu_enabled(): 188 | visu.timeline("Solution Schedule", 0, 100) 189 | for m in machines_list: 190 | visu.sequence(name='M' + str(m)) 191 | for (op_id, job, priority) in jobops_itv_vars: 192 | for (o, mch) in opsmchs_itv_vars: 193 | itv2 = msol.get_var_solution(opsmchs_itv_vars[(o, mch)]) 194 | if op_id == o and m == mch and itv2.is_present(): 195 | itv = msol.get_var_solution(jobops_itv_vars[(op_id, job, priority)]) 196 | visu.interval(itv, m, 'J' + str(job) + '_' + str(op_id)) 197 | visu.show()''' 198 | 199 | 200 | return instance, makespan, solve_time 201 | 202 | 203 | path_of_directories = r'C:\[..]' 204 | cols = ['instance', 'makespan', 'solving time', 'solver'] 205 | files = [] 206 | lst = [] 207 | for names in os.listdir(path_of_directories): 208 | f = os.path.join(path_of_directories, names) 209 | files.append(f) 210 | if os.path.isfile(f): 211 | data, nb_AGVs, name, nb_jobs = read_instance_FJSSP(f) 212 | instance, makespan, solving_time = flexible_jobshop_CPLEX(data, nb_AGVs, name, nb_jobs) 213 | solver = 'CPLEX' 214 | lst.append([instance, makespan, solving_time, solver]) 215 | 216 | df1 = pd.DataFrame(lst, columns=cols) 217 | inst_analysis = df1.to_excel('instance_analysis_CPLEX_Barnes.xlsx') 218 | 219 | 220 | -------------------------------------------------------------------------------- /CP_solvers/FJSSP_ORTOOLS.py: -------------------------------------------------------------------------------- 1 | """ 2 | Solves a flexible jobshop problems with the CP-SAT solver. 3 | """ 4 | import collections 5 | import datetime 6 | 7 | from ortools.sat.python import cp_model 8 | 9 | import plotly as py 10 | import plotly.figure_factory as ff 11 | dt = datetime.datetime 12 | time_delta = datetime.timedelta 13 | pyplt = py.offline.plot 14 | import random 15 | import os 16 | import pandas as pd 17 | 18 | def rgb(): 19 | return random.randint(0, 256) 20 | 21 | class SolutionPrinter(cp_model.CpSolverSolutionCallback): 22 | """Print intermediate solutions.""" 23 | 24 | def __init__(self): 25 | cp_model.CpSolverSolutionCallback.__init__(self) 26 | self.__solution_count = 0 27 | 28 | def on_solution_callback(self): 29 | """Called at each new solution.""" 30 | print('Solution %i, time = %f s, objective = %i' % 31 | (self.__solution_count, self.WallTime(), self.ObjectiveValue())) 32 | self.__solution_count += 1 33 | 34 | def read_instance_FJSSP(instance): 35 | jobs = [] 36 | operations = [] 37 | 38 | with open(instance) as f: 39 | lines = f.readlines() 40 | name = os.path.basename(instance) 41 | name = name.replace('.txt', '') 42 | 43 | first_line = lines[0].split() 44 | # Number of jobs 45 | nb_jobs = int(first_line[0]) 46 | #Number of AGVs 47 | nb_AGVs = int(first_line[1]) 48 | 49 | 50 | with open(instance) as file: 51 | for line in file.readlines()[1:]: 52 | strip_lines = line.strip() 53 | jobs_list = strip_lines.split() 54 | jobs_list = list(map(int, jobs_list)) 55 | jobs.append(jobs_list) 56 | 57 | for operation in jobs: 58 | nb_tasks = len(operation) 59 | tasklist = [] 60 | n = 1 61 | while n < nb_tasks: 62 | k = operation[n] # 1 63 | f = n + 1 64 | tuple = [(operation[f], operation[f + 1]) for f in range(f, n+k*2, 2)] 65 | tasklist.append(tuple) 66 | n = (2*k + n) + 1 67 | operations.append(tasklist) 68 | 69 | return operations, nb_AGVs, name 70 | 71 | 72 | def flexible_jobshop(data, AGVs, name): 73 | # Data part. 74 | jobs = data 75 | instance = name 76 | print(instance) 77 | 78 | num_jobs = len(jobs) 79 | all_jobs = range(num_jobs) 80 | num_machines = AGVs 81 | all_machines = range(num_machines) 82 | 83 | # Model the flexible jobshop problem. 84 | model = cp_model.CpModel() 85 | 86 | horizon = 0 87 | for job in jobs: 88 | for task in job: 89 | max_task_duration = 0 90 | for alternative in task: 91 | max_task_duration = max(max_task_duration, alternative[1]) 92 | horizon += max_task_duration 93 | 94 | print('Horizon = %i' % horizon) 95 | 96 | # Global storage of variables. 97 | intervals_per_resources = collections.defaultdict(list) 98 | starts = {} # indexed by (job_id, task_id). 99 | presences = {} # indexed by (job_id, task_id, alt_id). 100 | job_ends = [] 101 | task_type = collections.namedtuple("task_type", "start end interval") 102 | assigned_task_type = collections.namedtuple("assigned_task_type", "start job index duration") 103 | 104 | # Scan the jobs and create the relevant variables and intervals. 105 | for job_id in all_jobs: 106 | job = jobs[job_id] 107 | num_tasks = len(job) 108 | previous_end = None 109 | for task_id in range(num_tasks): 110 | task = job[task_id] 111 | 112 | min_duration = task[0][1] 113 | max_duration = task[0][1] 114 | 115 | num_alternatives = len(task) 116 | all_alternatives = range(num_alternatives) 117 | 118 | for alt_id in range(1, num_alternatives): 119 | alt_duration = task[alt_id][1] 120 | min_duration = min(min_duration, alt_duration) 121 | max_duration = max(max_duration, alt_duration) 122 | 123 | # Create main interval for the task. 124 | suffix_name = '_j%i_t%i' % (job_id, task_id) 125 | start = model.NewIntVar(0, horizon, 'start' + suffix_name) 126 | duration = model.NewIntVar(min_duration, max_duration, 127 | 'duration' + suffix_name) 128 | end = model.NewIntVar(0, horizon, 'end' + suffix_name) 129 | interval = model.NewIntervalVar(start, duration, end, 130 | 'interval' + suffix_name) 131 | 132 | # Store the start for the solution. 133 | starts[(job_id, task_id)] = start 134 | 135 | # Add precedence with previous task in the same job. 136 | if previous_end is not None: 137 | model.Add(start >= previous_end) 138 | previous_end = end 139 | 140 | # Create alternative intervals. 141 | if num_alternatives > 1: 142 | l_presences = [] 143 | for alt_id in all_alternatives: 144 | alt_suffix = '_j%i_t%i_a%i' % (job_id, task_id, alt_id) 145 | l_presence = model.NewBoolVar('presence' + alt_suffix) 146 | l_start = model.NewIntVar(0, horizon, 'start' + alt_suffix) 147 | l_duration = task[alt_id][1] 148 | l_end = model.NewIntVar(0, horizon, 'end' + alt_suffix) 149 | l_interval = model.NewOptionalIntervalVar( 150 | l_start, l_duration, l_end, l_presence, 151 | 'interval' + alt_suffix) 152 | l_presences.append(l_presence) 153 | 154 | # Link the primary/global variables with the local ones. 155 | model.Add(start == l_start).OnlyEnforceIf(l_presence) 156 | model.Add(duration == l_duration).OnlyEnforceIf(l_presence) 157 | model.Add(end == l_end).OnlyEnforceIf(l_presence) 158 | 159 | # Add the local interval to the right machine. 160 | intervals_per_resources[task[alt_id][1]].append(l_interval) 161 | 162 | # Store the presences for the solution. 163 | presences[(job_id, task_id, alt_id)] = l_presence 164 | 165 | # Select exactly one presence variable. 166 | model.AddExactlyOne(l_presences) 167 | else: 168 | intervals_per_resources[task[0][1]].append(interval) 169 | presences[(job_id, task_id, 0)] = model.NewConstant(1) 170 | 171 | job_ends.append(previous_end) 172 | 173 | # Create machines constraints. 174 | for machine_id in all_machines: 175 | intervals = intervals_per_resources[machine_id] 176 | if len(intervals) > 1: 177 | model.AddNoOverlap(intervals) 178 | 179 | # Makespan objective 180 | makespan = model.NewIntVar(0, horizon, 'makespan') 181 | model.AddMaxEquality(makespan, job_ends) 182 | model.Minimize(makespan) 183 | 184 | # Solve model. 185 | solver = cp_model.CpSolver() 186 | solution_printer = SolutionPrinter() 187 | 188 | #Set time limit of 10s 189 | solver.parameters.max_time_in_seconds = 10.0 190 | 191 | status = solver.Solve(model, solution_printer) 192 | 193 | # Print final solution. 194 | assigned_jobs_fjssp = collections.defaultdict(list) 195 | for job_id in all_jobs: 196 | print('Job %i:' % job_id) 197 | for task_id in range(len(jobs[job_id])): 198 | start_value = solver.Value(starts[(job_id, task_id)]) 199 | machine = -1 200 | duration = -1 201 | selected = -1 202 | for alt_id in range(len(jobs[job_id][task_id])): 203 | if solver.Value(presences[(job_id, task_id, alt_id)]): 204 | duration = jobs[job_id][task_id][alt_id][1] 205 | machine = jobs[job_id][task_id][alt_id][0] 206 | selected = alt_id 207 | assigned_jobs_fjssp[machine].append( 208 | assigned_task_type(start=start_value, job=job_id, index=task_id, duration=duration)) 209 | 210 | print( 211 | ' task_%i_%i starts at %i (alt %i, machine %i, duration %i)' % 212 | (job_id, task_id, start_value, selected, machine, duration)) 213 | 214 | obj_makespan = solver.ObjectiveValue() 215 | solving_time = solver.WallTime() 216 | print('Solve status: %s' % solver.StatusName(status)) 217 | print('Optimal objective value: %i' % solver.ObjectiveValue()) 218 | print('Statistics') 219 | print(' - conflicts : %i' % solver.NumConflicts()) 220 | print(' - branches : %i' % solver.NumBranches()) 221 | print(' - wall time : %f s' % solver.WallTime()) 222 | 223 | return instance, obj_makespan, solving_time 224 | 225 | def draw_ganttchart(all_machines, assigned_jobs_fjssp, num_jobs): 226 | dfg = [] 227 | today = dt.today() 228 | start_date = dt(today.year, today.month, today.day) 229 | 230 | for machine in all_machines: 231 | assigned_jobs_fjssp[machine].sort() 232 | for assigned_task in assigned_jobs_fjssp[machine]: 233 | start = assigned_task.start 234 | duration = assigned_task.duration 235 | dfg.append(dict(Task="AGV%s" % (machine), Start=start_date + time_delta(0, start), 236 | Finish=start_date + time_delta(0, start + duration), 237 | Resource="%s" % (assigned_task.job +1), complete=assigned_task.job + 1)) 238 | colors = {} 239 | for i in range(num_jobs): 240 | key = "%s" % (i +1) 241 | colors[key] = "rgb(%s, %s, %s)" % (rgb(), rgb(), rgb()) 242 | fig = ff.create_gantt(dfg, colors=colors, index_col="Resource", group_tasks=True, show_colorbar=True) 243 | pyplt(fig, filename=r"./GanttChart_FJSSP.html", auto_open=True) 244 | 245 | 246 | path_of_directories = r'[..]' 247 | cols = ['instance', 'makespan', 'solving time', 'solver'] 248 | files = [] 249 | lst = [] 250 | for names in os.listdir(path_of_directories): 251 | f = os.path.join(path_of_directories, names) 252 | files.append(f) 253 | if os.path.isfile(f): 254 | data, nb_AGVs, name = read_instance_FJSSP(f) 255 | instance, makespan, solving_time = flexible_jobshop(data, nb_AGVs, name) 256 | solver = 'ORTOOLS' 257 | lst.append([instance, makespan, solving_time, solver]) 258 | 259 | df1 = pd.DataFrame(lst, columns=cols) 260 | inst_analysis = df1.to_excel('instance_analysis_ORTOOLS_FJSSP.xlsx') 261 | 262 | print(df1) 263 | 264 | -------------------------------------------------------------------------------- /CP_solvers/JSSP_CPLEX.py: -------------------------------------------------------------------------------- 1 | import docplex.cp.solution 2 | from docplex.cp.model import * 3 | import os 4 | 5 | import pandas as pd 6 | 7 | def read_instance(filename): 8 | 9 | with open(filename) as f: 10 | lines = f.readlines() 11 | instance = os.path.basename(filename) 12 | instance = instance.replace('.txt', '') 13 | 14 | with open(filename, 'r') as file: 15 | NB_JOBS, NB_MACHINES = [int(v) for v in file.readline().split()] 16 | JOBS = [[int(v) for v in file.readline().split()] for i in range(NB_JOBS)] 17 | 18 | return NB_JOBS, NB_MACHINES, JOBS, instance 19 | 20 | def CPLEX_JSSP(NB_JOBS, NB_MACHINES, JOBS): 21 | NB_MACHINES = NB_MACHINES 22 | JOBS = JOBS 23 | NB_JOBS = NB_JOBS 24 | 25 | # Build list of machines. MACHINES[j][s] = id of the machine for the operation s of the job j 26 | MACHINES = [[JOBS[j][2 * s] for s in range(NB_MACHINES)] for j in range(NB_JOBS)] 27 | 28 | # Build list of durations. DURATION[j][s] = duration of the operation s of the job j 29 | DURATION = [[JOBS[j][2 * s + 1] for s in range(NB_MACHINES)] for j in range(NB_JOBS)] 30 | 31 | # Create model 32 | mdl = CpoModel() 33 | 34 | # Create one interval variable per job operation 35 | job_operations = [[interval_var(size=DURATION[j][m], name='O{}-{}'.format(j,m)) for m in range(NB_MACHINES)] 36 | for j in range(NB_JOBS)] 37 | 38 | # Each operation must start after the end of the previous 39 | for j in range(NB_JOBS): 40 | for s in range(1, NB_MACHINES): 41 | mdl.add(end_before_start(job_operations[j][s-1], job_operations[j][s])) 42 | 43 | # Force no overlap for operations executed on a same machine 44 | machine_operations = [[] for m in range(NB_MACHINES)] 45 | for j in range(NB_JOBS): 46 | for s in range(NB_MACHINES): 47 | machine_operations[MACHINES[j][s]].append(job_operations[j][s]) 48 | for mops in machine_operations: 49 | mdl.add(no_overlap(mops)) 50 | 51 | # Minimize termination date 52 | mdl.add(minimize(max(end_of(job_operations[i][NB_MACHINES-1]) for i in range(NB_JOBS)))) 53 | 54 | # Solve model 55 | print('Solving model...') 56 | res = mdl.solve(TimeLimit=10) 57 | print('Solution:') 58 | res.print_solution() 59 | 60 | makespan = res.get_objective_value() 61 | #print(makespan) 62 | #solve_time = docplex.cp.solution.CpoSolveResult.get_solve_time(res) 63 | solve_time = res.get_solve_time() 64 | #print(solve_time) 65 | 66 | return instance, makespan, solve_time 67 | 68 | # Draw solution 69 | '''import docplex.cp.utils_visu as visu 70 | if res and visu.is_visu_enabled(): 71 | visu.timeline('Solution for job-shop ' + filename) 72 | visu.panel('Jobs') 73 | for i in range(NB_JOBS): 74 | visu.sequence(name='J' + str(i), 75 | intervals=[(res.get_var_solution(job_operations[i][j]), MACHINES[i][j], 'M' + str(MACHINES[i][j])) for j in 76 | range(NB_MACHINES)]) 77 | visu.panel('Machines') 78 | for k in range(NB_MACHINES): 79 | visu.sequence(name='M' + str(k), 80 | intervals=[(res.get_var_solution(machine_operations[k][i]), k, 'J' + str(i)) for i in range(NB_JOBS)]) 81 | visu.show()''' 82 | 83 | 84 | path_of_directories = r'C:\[..]' 85 | cols = ['instance', 'makespan', 'solving time', 'solver'] 86 | files = [] 87 | lst = [] 88 | for names in os.listdir(path_of_directories): 89 | f = os.path.join(path_of_directories, names) 90 | files.append(f) 91 | if os.path.isfile(f): 92 | NB_JOBS, NB_MACHINES, JOBS, instance = read_instance(f) 93 | instance, makespan, solving_time = CPLEX_JSSP(NB_JOBS, NB_MACHINES, JOBS) 94 | solver = 'CPLEX' 95 | lst.append([instance, makespan, solving_time, solver]) 96 | 97 | df1 = pd.DataFrame(lst, columns=cols) 98 | inst_analysis = df1.to_excel('instance_analysis_CPLEX_JSSP.xlsx') 99 | 100 | -------------------------------------------------------------------------------- /CP_solvers/JSSP_ORTOOLS.py: -------------------------------------------------------------------------------- 1 | 2 | import collections 3 | import os 4 | 5 | import pandas as pd 6 | from ortools.sat.python import cp_model 7 | 8 | def read_instance_JSSP(filename): 9 | 10 | with open(filename) as f: 11 | lines = f.readlines() 12 | name = os.path.basename(filename) 13 | name = name.replace('.txt', '') 14 | 15 | jobs = [] 16 | job_data = [] 17 | with open(filename) as file: 18 | for line in file.readlines()[1:]: 19 | strip_lines = line.strip() 20 | jobs_list = strip_lines.split() 21 | jobs_list = list(map(int, jobs_list)) 22 | m = jobs.append(jobs_list) 23 | 24 | for operation in jobs: 25 | tuples = [(operation[i], operation[i+1]) for i in range(0, len(operation),2)] 26 | n = job_data.append(tuples) 27 | 28 | return job_data, name 29 | 30 | def ORTOOLS_JSSP(data): 31 | """OR TOOLS.""" 32 | # Data. 33 | jobs_data = data 34 | print('Read instance data..') 35 | 36 | machines_count = 1 + max(task[0] for job in jobs_data for task in job) 37 | all_machines = range(machines_count) 38 | # Computes horizon dynamically as the sum of all durations. 39 | horizon = sum(task[1] for job in jobs_data for task in job) 40 | 41 | # Create the model. 42 | model = cp_model.CpModel() 43 | 44 | # Named tuple to store information about created variables. 45 | task_type = collections.namedtuple('task_type', 'start end interval') 46 | # Named tuple to manipulate solution information. 47 | assigned_task_type = collections.namedtuple('assigned_task_type', 48 | 'start job index duration') 49 | 50 | # Creates job intervals and add to the corresponding machine lists. 51 | all_tasks = {} 52 | machine_to_intervals = collections.defaultdict(list) 53 | 54 | for job_id, job in enumerate(jobs_data): 55 | for task_id, task in enumerate(job): 56 | machine = task[0] 57 | duration = task[1] 58 | suffix = '_%i_%i' % (job_id, task_id) 59 | start_var = model.NewIntVar(0, horizon, 'start' + suffix) 60 | end_var = model.NewIntVar(0, horizon, 'end' + suffix) 61 | interval_var = model.NewIntervalVar(start_var, duration, end_var, 62 | 'interval' + suffix) 63 | all_tasks[job_id, task_id] = task_type(start=start_var, 64 | end=end_var, 65 | interval=interval_var) 66 | machine_to_intervals[machine].append(interval_var) 67 | 68 | # Create and add disjunctive constraints. 69 | for machine in all_machines: 70 | model.AddNoOverlap(machine_to_intervals[machine]) 71 | 72 | # Precedences inside a job. 73 | for job_id, job in enumerate(jobs_data): 74 | for task_id in range(len(job) - 1): 75 | model.Add(all_tasks[job_id, task_id + 76 | 1].start >= all_tasks[job_id, task_id].end) 77 | 78 | # Makespan objective. 79 | obj_var = model.NewIntVar(0, horizon, 'makespan') 80 | model.AddMaxEquality(obj_var, [ 81 | all_tasks[job_id, len(job) - 1].end 82 | for job_id, job in enumerate(jobs_data) 83 | ]) 84 | model.Minimize(obj_var) 85 | 86 | # Creates the solver and solve. 87 | solver = cp_model.CpSolver() 88 | 89 | #Set time limit 90 | solver.parameters.max_time_in_seconds = 10.0 91 | 92 | status = solver.Solve(model) 93 | 94 | if status == cp_model.OPTIMAL or status == cp_model.FEASIBLE: 95 | print('Solution:') 96 | # Create one list of assigned tasks per machine. 97 | assigned_jobs = collections.defaultdict(list) 98 | for job_id, job in enumerate(jobs_data): 99 | for task_id, task in enumerate(job): 100 | machine = task[0] 101 | assigned_jobs[machine].append( 102 | assigned_task_type(start=solver.Value( 103 | all_tasks[job_id, task_id].start), 104 | job=job_id, 105 | index=task_id, 106 | duration=task[1])) 107 | 108 | # Create per machine output lines. 109 | output = '' 110 | for machine in all_machines: 111 | # Sort by starting time. 112 | assigned_jobs[machine].sort() 113 | sol_line_tasks = 'Machine ' + str(machine) + ': ' 114 | sol_line = ' ' 115 | 116 | for assigned_task in assigned_jobs[machine]: 117 | name = 'job_%i_task_%i' % (assigned_task.job, 118 | assigned_task.index) 119 | # Add spaces to output to align columns. 120 | sol_line_tasks += '%-15s' % name 121 | 122 | start = assigned_task.start 123 | duration = assigned_task.duration 124 | sol_tmp = '[%i,%i]' % (start, start + duration) 125 | # Add spaces to output to align columns. 126 | sol_line += '%-15s' % sol_tmp 127 | 128 | sol_line += '\n' 129 | sol_line_tasks += '\n' 130 | output += sol_line_tasks 131 | output += sol_line 132 | 133 | # Finally print the solution found. 134 | print(f'Optimal Schedule Length: {solver.ObjectiveValue()}') 135 | print(output) 136 | else: 137 | print('No solution found.') 138 | 139 | # Statistics. 140 | print('\nStatistics') 141 | print(' - conflicts: %i' % solver.NumConflicts()) 142 | print(' - branches : %i' % solver.NumBranches()) 143 | print(' - wall time: %f s' % solver.WallTime()) 144 | 145 | makespan = solver.ObjectiveValue() 146 | solving_time = solver.WallTime() 147 | 148 | return makespan, solving_time 149 | 150 | 151 | path_of_directories = r'C:\[..]' 152 | cols = ['instance', 'makespan', 'solving time', 'solver'] 153 | files = [] 154 | lst = [] 155 | for names in os.listdir(path_of_directories): 156 | f = os.path.join(path_of_directories, names) 157 | files.append(f) 158 | if os.path.isfile(f): 159 | data, name = read_instance_JSSP(f) 160 | makespan, solving_time = ORTOOLS_JSSP(data) 161 | solver = 'ORTOOLS' 162 | lst.append([name, makespan, solving_time, solver]) 163 | 164 | df1 = pd.DataFrame(lst, columns=cols) 165 | inst_analysis = df1.to_excel('instance_analysis_ORTOOLS_JSSP.xlsx') 166 | 167 | 168 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # algorithm selector for AGV scheduling 2 | This repository stores code about JSSP and FJSSP scheduling problems solved with two constraint programming solvers: IBM CPLEX CP Optimizer and Google's OR-Tools. Additionally, machine learning algorithms serve to make future predictions on the most suitable algorithm for incoming scheduling problems. The datasets were created based on the performance of the CP solvers. 3 | 4 | The data input is aligned with benchmark test instances available in literature for the JSSP and FJSSP. The JSSP files are available at the JSSP instance collection: http://jobshop.jjvh.nl/ 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /data/instance_features_FJSSP_300s.csv: -------------------------------------------------------------------------------- 1 | ;instance;jobs;AGVs;Operations;Job_AGV_ratio;Skewness;Total_job_mean;Max_transport_duration;Min_transport_duration;Max_job_duration;Min_job;Horizon;Algorithm 2 | 0;01a;10;5;196;2;2;567,7589254;100;10;1392;722;11137;CPO 3 | 1;02a;10;5;196;2;2;567,7589254;100;10;1392;722;11137;CPO 4 | 2;03a;10;5;196;2;2;567,7589254;100;10;1392;722;11137;CPO 5 | 3;04a;10;5;196;2;2;567,8786046;98;15;1382;757;11137;CPO 6 | 4;05a;10;5;196;2;2;573,4316794;99;11;1398;736;11252;CPO 7 | 5;06a;10;5;196;2;2;580,8589953;98;16;1395;754;11392;CPO 8 | 6;07a;15;8;293;1,875;1,875;849,3196905;100;10;1400;814;16485;CPO 9 | 7;08a;15;8;293;1,875;1,875;849,3196905;100;10;1400;814;16485;CPO 10 | 8;09a;15;8;293;1,875;1,875;849,3196905;100;10;1400;814;16485;CPO 11 | 9;10a;15;8;293;1,875;1,875;853,9448925;98;12;1394;824;16595;CPO 12 | 10;11a;15;8;293;1,875;1,875;871,2018467;100;14;1408;851;16918;CPO 13 | 11;12a;15;8;293;1,875;1,875;880,4084564;99;13;1402;852;17101;CPO 14 | 12;13a;20;10;387;2;2;1124,056641;100;10;1354;764;21610;CPO 15 | 13;14a;20;10;387;2;2;1124,056641;100;10;1354;764;21610;CPO 16 | 14;15a;20;10;387;2;2;1124,056641;100;10;1354;764;21610;CPO 17 | 15;16a;20;10;387;2;2;1130,901031;99;12;1349;768;21761;CPO 18 | 16;17a;20;10;387;2;2;1156,252423;98;12;1367;801;22249;CPO 19 | 17;18a;20;10;387;2;2;1175,927855;99;15;1390;834;22620;CPO 20 | 18;edata_abz5;10;10;100;1;1;777,3;99;50;859;704;7773;ORTOOLS 21 | 19;edata_abz6;10;10;100;1;1;594,6;98;20;742;486;5946;ORTOOLS 22 | 20;edata_abz7;20;15;300;1,333333333;1,333333333;491,0666667;40;11;410;322;7366;ORTOOLS 23 | 21;edata_abz8;20;15;300;1,333333333;1,333333333;505,7333333;40;11;443;307;7586;CPO 24 | 22;edata_abz9;20;15;300;1,333333333;1,333333333;496,1333333;40;11;467;268;7442;ORTOOLS 25 | 23;edata_car1;11;5;55;2,2;2,2;5005;999;12;3088;1186;25025;ORTOOLS 26 | 24;edata_car2;13;4;52;3,25;3,25;5928,75;996;12;2847;780;23715;ORTOOLS 27 | 25;edata_car3;12;5;60;2,4;2,4;5596,8;966;100;3448;1564;27984;CPO 28 | 26;edata_car4;14;4;56;3,5;3,5;6513,5;999;12;2971;1248;26054;CPO 29 | 27;edata_car5;10;6;60;1,666666667;1,666666667;4908,666667;999;12;4037;1683;29452;ORTOOLS 30 | 28;edata_car6;8;9;72;0,888888889;1,125;3868,777778;999;21;5486;3410;34819;ORTOOLS 31 | 29;edata_car7;7;7;49;1;1;3412;963;2;4216;2948;23884;ORTOOLS 32 | 30;edata_car8;8;8;64;1;1;3985,375;965;12;4613;2870;31883;ORTOOLS 33 | 31;edata_la01;10;5;50;2;2;569,8;98;12;413;186;2849;CPO 34 | 32;edata_la02;10;5;50;2;2;528,6;99;12;394;180;2643;ORTOOLS 35 | 33;edata_la03;10;5;50;2;2;476,6;91;7;349;157;2383;ORTOOLS 36 | 34;edata_la04;10;5;50;2;2;501,4;98;5;369;138;2507;ORTOOLS 37 | 35;edata_la05;10;5;50;2;2;456,6;97;5;380;173;2283;ORTOOLS 38 | 36;edata_la06;15;5;75;3;3;798,4;98;7;413;186;3992;CPO 39 | 37;edata_la07;15;5;75;3;3;749;97;8;376;159;3745;ORTOOLS 40 | 38;edata_la08;15;5;75;3;3;765;98;5;369;138;3825;CPO 41 | 39;edata_la09;15;5;75;3;3;852,6;99;7;382;175;4263;CPO 42 | 40;edata_la10;15;5;75;3;3;804;97;5;443;171;4020;CPO 43 | 41;edata_la11;20;5;100;4;4;1070,2;98;7;413;186;5351;CPO 44 | 42;edata_la12;20;5;100;4;4;935,2;98;5;408;88;4676;CPO 45 | 43;edata_la13;20;5;100;4;4;1037,2;97;5;382;173;5186;CPO 46 | 44;edata_la14;20;5;100;4;4;1069,2;97;5;443;171;5346;CPO 47 | 45;edata_la15;20;5;100;4;4;1089;99;6;378;183;5445;CPO 48 | 46;edata_la16;10;10;100;1;1;535,1;98;7;717;423;5351;ORTOOLS 49 | 47;edata_la17;10;10;100;1;1;467,6;98;5;646;366;4676;ORTOOLS 50 | 48;edata_la18;10;10;100;1;1;518,6;97;5;663;412;5186;ORTOOLS 51 | 49;edata_la19;10;10;100;1;1;534,6;97;5;617;464;5346;ORTOOLS 52 | 50;edata_la20;10;10;100;1;1;544,5;99;6;756;400;5445;ORTOOLS 53 | 51;edata_la21;15;10;150;1,5;1,5;799,4;99;7;717;411;7994;CPO 54 | 52;edata_la22;15;10;150;1,5;1,5;732,2;98;5;619;390;7322;CPO 55 | 53;edata_la23;15;10;150;1,5;1,5;808,5;97;5;640;429;8085;ORTOOLS 56 | 54;edata_la24;15;10;150;1,5;1,5;772,7;99;5;704;397;7727;CPO 57 | 55;edata_la25;15;10;150;1,5;1,5;750,9;99;5;723;341;7509;CPO 58 | 56;edata_la26;20;10;200;2;2;1051,5;99;7;717;411;10515;ORTOOLS 59 | 57;edata_la27;20;10;200;2;2;1083,2;99;5;686;412;10832;CPO 60 | 58;edata_la28;20;10;200;2;2;1068,2;99;5;756;397;10682;ORTOOLS 61 | 59;edata_la29;20;10;200;2;2;992,9;99;5;723;341;9929;ORTOOLS 62 | 60;edata_la30;20;10;200;2;2;1068;99;5;726;288;10680;ORTOOLS 63 | 61;edata_la31;30;10;300;3;3;1519,1;99;5;717;366;15191;CPO 64 | 62;edata_la32;30;10;300;3;3;1656,9;99;5;756;400;16569;CPO 65 | 63;edata_la33;30;10;300;3;3;1496,9;99;5;723;341;14969;CPO 66 | 64;edata_la34;30;10;300;3;3;1534,1;99;5;656;404;15341;CPO 67 | 65;edata_la35;30;10;300;3;3;1548,5;99;5;647;358;15485;CPO 68 | 66;edata_la36;15;15;225;1;1;782,6;99;7;948;633;11739;ORTOOLS 69 | 67;edata_la37;15;15;225;1;1;837,9333333;99;5;986;697;12569;CPO 70 | 68;edata_la38;15;15;225;1;1;747,8;99;5;943;431;11217;CPO 71 | 69;edata_la39;15;15;225;1;1;770,2666667;99;5;922;599;11554;ORTOOLS 72 | 70;edata_la40;15;15;225;1;1;764,8;99;5;955;637;11472;CPO 73 | 71;edata_mt06;6;6;36;1;1;32,83333333;10;1;47;25;197;ORTOOLS 74 | 72;edata_mt10;10;10;100;1;1;510,9;99;2;655;393;5109;ORTOOLS 75 | 73;edata_mt20;20;5;100;4;4;1021,8;99;2;387;155;5109;CPO 76 | 74;edata_orb1;10;10;100;1;1;540,9;99;5;695;407;5409;ORTOOLS 77 | 75;edata_orb10;10;10;100;1;1;554,9;99;5;681;444;5549;ORTOOLS 78 | 76;edata_orb2;10;10;100;1;1;525,5;99;6;620;380;5255;ORTOOLS 79 | 77;edata_orb3;10;10;100;1;1;529,2;99;5;648;427;5292;CPO 80 | 78;edata_orb4;10;10;100;1;1;562,8;98;5;753;425;5628;ORTOOLS 81 | 79;edata_orb5;10;10;100;1;1;490,8;99;5;584;374;4908;ORTOOLS 82 | 80;edata_orb6;10;10;100;1;1;561,4;99;6;715;441;5614;CPO 83 | 81;edata_orb7;10;10;100;1;1;240,7;59;0;275;206;2407;ORTOOLS 84 | 82;edata_orb8;10;10;100;1;1;456;97;5;573;347;4560;ORTOOLS 85 | 83;edata_orb9;10;10;100;1;1;518,1;99;5;659;297;5181;ORTOOLS 86 | 84;mt10c1;10;11;100;0,909090909;1,1;510,9;99;2;655;393;5109;CPO 87 | 85;mt10cc;10;12;100;0,833333333;1,2;510,9;99;2;655;393;5109;ORTOOLS 88 | 86;mt10x;10;11;100;0,909090909;1,1;510,9;99;2;655;393;5109;ORTOOLS 89 | 87;mt10xx;10;12;100;0,833333333;1,2;510,9;99;2;655;393;5109;CPO 90 | 88;mt10xxx;10;13;100;0,769230769;1,3;510,9;99;2;655;393;5109;ORTOOLS 91 | 89;mt10xy;10;12;100;0,833333333;1,2;510,9;99;2;655;393;5109;ORTOOLS 92 | 90;mt10xyz;10;13;100;0,769230769;1,3;510,9;99;2;655;393;5109;ORTOOLS 93 | 91;rdata_abz5;10;10;100;1;1;777,3;99;50;859;704;7773;ORTOOLS 94 | 92;rdata_abz6;10;10;100;1;1;594,6;98;20;742;486;5946;CPO 95 | 93;rdata_abz7;20;15;300;1,333333333;1,333333333;491,0666667;40;11;410;322;7366;CPO 96 | 94;rdata_abz8;20;15;300;1,333333333;1,333333333;505,7333333;40;11;443;307;7586;CPO 97 | 95;rdata_abz9;20;15;300;1,333333333;1,333333333;496,1333333;40;11;467;268;7442;CPO 98 | 96;rdata_car1;11;5;55;2,2;2,2;5005;999;12;3088;1186;25025;ORTOOLS 99 | 97;rdata_car2;13;4;52;3,25;3,25;5928,75;996;12;2847;780;23715;ORTOOLS 100 | 98;rdata_car3;12;5;60;2,4;2,4;5596,8;966;100;3448;1564;27984;ORTOOLS 101 | 99;rdata_car4;14;4;56;3,5;3,5;6513,5;999;12;2971;1248;26054;ORTOOLS 102 | 100;rdata_car5;10;6;60;1,666666667;1,666666667;4908,666667;999;12;4037;1683;29452;ORTOOLS 103 | 101;rdata_car6;8;9;72;0,888888889;1,125;3868,777778;999;21;5486;3410;34819;ORTOOLS 104 | 102;rdata_car7;7;7;49;1;1;3412;963;2;4216;2948;23884;ORTOOLS 105 | 103;rdata_car8;8;8;64;1;1;3985,375;965;12;4613;2870;31883;ORTOOLS 106 | 104;rdata_la01;10;5;50;2;2;569,8;98;12;413;186;2849;ORTOOLS 107 | 105;rdata_la02;10;5;50;2;2;528,6;99;12;394;180;2643;ORTOOLS 108 | 106;rdata_la03;10;5;50;2;2;476,6;91;7;349;157;2383;ORTOOLS 109 | 107;rdata_la04;10;5;50;2;2;501,4;98;5;369;138;2507;ORTOOLS 110 | 108;rdata_la05;10;5;50;2;2;456,6;97;5;380;173;2283;ORTOOLS 111 | 109;rdata_la06;15;5;75;3;3;798,4;98;7;413;186;3992;ORTOOLS 112 | 110;rdata_la07;15;5;75;3;3;749;97;8;376;159;3745;ORTOOLS 113 | 111;rdata_la08;15;5;75;3;3;765;98;5;369;138;3825;ORTOOLS 114 | 112;rdata_la09;15;5;75;3;3;852,6;99;7;382;175;4263;ORTOOLS 115 | 113;rdata_la10;15;5;75;3;3;804;97;5;443;171;4020;ORTOOLS 116 | 114;rdata_la11;20;5;100;4;4;1070,2;98;7;413;186;5351;ORTOOLS 117 | 115;rdata_la12;20;5;100;4;4;935,2;98;5;408;88;4676;ORTOOLS 118 | 116;rdata_la13;20;5;100;4;4;1037,2;97;5;382;173;5186;ORTOOLS 119 | 117;rdata_la14;20;5;100;4;4;1069,2;97;5;443;171;5346;ORTOOLS 120 | 118;rdata_la15;20;5;100;4;4;1089;99;6;378;183;5445;ORTOOLS 121 | 119;rdata_la16;10;10;100;1;1;535,1;98;7;717;423;5351;ORTOOLS 122 | 120;rdata_la17;10;10;100;1;1;467,6;98;5;646;366;4676;CPO 123 | 121;rdata_la18;10;10;100;1;1;518,6;97;5;663;412;5186;CPO 124 | 122;rdata_la19;10;10;100;1;1;534,6;97;5;617;464;5346;ORTOOLS 125 | 123;rdata_la20;10;10;100;1;1;544,5;99;6;756;400;5445;ORTOOLS 126 | 124;rdata_la21;15;10;150;1,5;1,5;799,4;99;7;717;411;7994;ORTOOLS 127 | 125;rdata_la22;15;10;150;1,5;1,5;732,2;98;5;619;390;7322;ORTOOLS 128 | 126;rdata_la23;15;10;150;1,5;1,5;808,5;97;5;640;429;8085;CPO 129 | 127;rdata_la24;15;10;150;1,5;1,5;772,7;99;5;704;397;7727;ORTOOLS 130 | 128;rdata_la25;15;10;150;1,5;1,5;750,9;99;5;723;341;7509;ORTOOLS 131 | 129;rdata_la26;20;10;200;2;2;1051,5;99;7;717;411;10515;CPO 132 | 130;rdata_la27;20;10;200;2;2;1083,2;99;5;686;412;10832;CPO 133 | 131;rdata_la28;20;10;200;2;2;1068,2;99;5;756;397;10682;CPO 134 | 132;rdata_la29;20;10;200;2;2;992,9;99;5;723;341;9929;CPO 135 | 133;rdata_la30;20;10;200;2;2;1068;99;5;726;288;10680;ORTOOLS 136 | 134;rdata_la31;30;10;300;3;3;1519,1;99;5;717;366;15191;CPO 137 | 135;rdata_la32;30;10;300;3;3;1656,9;99;5;756;400;16569;CPO 138 | 136;rdata_la33;30;10;300;3;3;1496,9;99;5;723;341;14969;CPO 139 | 137;rdata_la34;30;10;300;3;3;1534,1;99;5;656;404;15341;CPO 140 | 138;rdata_la35;30;10;300;3;3;1548,5;99;5;647;358;15485;CPO 141 | 139;rdata_la36;15;15;225;1;1;782,6;99;7;948;633;11739;ORTOOLS 142 | 140;rdata_la37;15;15;225;1;1;837,9333333;99;5;986;697;12569;ORTOOLS 143 | 141;rdata_la38;15;15;225;1;1;747,8;99;5;943;431;11217;ORTOOLS 144 | 142;rdata_la39;15;15;225;1;1;770,2666667;99;5;922;599;11554;ORTOOLS 145 | 143;rdata_la40;15;15;225;1;1;764,8;99;5;955;637;11472;ORTOOLS 146 | 144;rdata_mt06;6;6;36;1;1;32,83333333;10;1;47;25;197;CPO 147 | 145;rdata_mt10;10;10;100;1;1;510,9;99;2;655;393;5109;CPO 148 | 146;rdata_mt20;20;5;100;4;4;1021,8;99;2;387;155;5109;ORTOOLS 149 | 147;rdata_orb1;10;10;100;1;1;540,9;99;5;695;407;5409;CPO 150 | 148;rdata_orb10;10;10;100;1;1;554,9;99;5;681;444;5549;ORTOOLS 151 | 149;rdata_orb2;10;10;100;1;1;525,5;99;6;620;380;5255;ORTOOLS 152 | 150;rdata_orb3;10;10;100;1;1;529,2;99;5;648;427;5292;ORTOOLS 153 | 151;rdata_orb4;10;10;100;1;1;562,8;98;5;753;425;5628;CPO 154 | 152;rdata_orb5;10;10;100;1;1;490,8;99;5;584;374;4908;CPO 155 | 153;rdata_orb6;10;10;100;1;1;561,4;99;6;715;441;5614;ORTOOLS 156 | 154;rdata_orb7;10;10;100;1;1;240,7;59;0;275;206;2407;ORTOOLS 157 | 155;rdata_orb8;10;10;100;1;1;456;97;5;573;347;4560;ORTOOLS 158 | 156;rdata_orb9;10;10;100;1;1;518,1;99;5;659;297;5181;CPO 159 | 157;sdata_abz5;10;10;100;1;1;777,3;99;50;859;704;7773;ORTOOLS 160 | 158;sdata_abz6;10;10;100;1;1;594,6;98;20;742;486;5946;ORTOOLS 161 | 159;sdata_abz7;20;15;300;1,333333333;1,333333333;491,0666667;40;11;410;322;7366;ORTOOLS 162 | 160;sdata_abz8;20;15;300;1,333333333;1,333333333;505,7333333;40;11;443;307;7586;ORTOOLS 163 | 161;sdata_abz9;20;15;300;1,333333333;1,333333333;496,1333333;40;11;467;268;7442;ORTOOLS 164 | 162;sdata_car1;11;5;55;2,2;2,2;5005;999;12;3088;1186;25025;ORTOOLS 165 | 163;sdata_car2;13;4;52;3,25;3,25;5928,75;996;12;2847;780;23715;ORTOOLS 166 | 164;sdata_car3;12;5;60;2,4;2,4;5596,8;966;100;3448;1564;27984;ORTOOLS 167 | 165;sdata_car4;14;4;56;3,5;3,5;6513,5;999;12;2971;1248;26054;ORTOOLS 168 | 166;sdata_car5;10;6;60;1,666666667;1,666666667;4908,666667;999;12;4037;1683;29452;ORTOOLS 169 | 167;sdata_car6;8;9;72;0,888888889;1,125;3868,777778;999;21;5486;3410;34819;ORTOOLS 170 | 168;sdata_car7;7;7;49;1;1;3412;963;2;4216;2948;23884;ORTOOLS 171 | 169;sdata_car8;8;8;64;1;1;3985,375;965;12;4613;2870;31883;ORTOOLS 172 | 170;sdata_la01;10;5;50;2;2;569,8;98;12;413;186;2849;CPO 173 | 171;sdata_la02;10;5;50;2;2;528,6;99;12;394;180;2643;ORTOOLS 174 | 172;sdata_la03;10;5;50;2;2;476,6;91;7;349;157;2383;ORTOOLS 175 | 173;sdata_la04;10;5;50;2;2;501,4;98;5;369;138;2507;ORTOOLS 176 | 174;sdata_la05;10;5;50;2;2;456,6;97;5;380;173;2283;CPO 177 | 175;sdata_la06;15;5;75;3;3;798,4;98;7;413;186;3992;CPO 178 | 176;sdata_la07;15;5;75;3;3;749;97;8;376;159;3745;CPO 179 | 177;sdata_la08;15;5;75;3;3;765;98;5;369;138;3825;CPO 180 | 178;sdata_la09;15;5;75;3;3;852,6;99;7;382;175;4263;CPO 181 | 179;sdata_la10;15;5;75;3;3;804;97;5;443;171;4020;CPO 182 | 180;sdata_la11;20;5;100;4;4;1070,2;98;7;413;186;5351;CPO 183 | 181;sdata_la12;20;5;100;4;4;935,2;98;5;408;88;4676;CPO 184 | 182;sdata_la13;20;5;100;4;4;1037,2;97;5;382;173;5186;CPO 185 | 183;sdata_la14;20;5;100;4;4;1069,2;97;5;443;171;5346;CPO 186 | 184;sdata_la15;20;5;100;4;4;1089;99;6;378;183;5445;CPO 187 | 185;sdata_la16;10;10;100;1;1;535,1;98;7;717;423;5351;ORTOOLS 188 | 186;sdata_la17;10;10;100;1;1;467,6;98;5;646;366;4676;ORTOOLS 189 | 187;sdata_la18;10;10;100;1;1;518,6;97;5;663;412;5186;ORTOOLS 190 | 188;sdata_la19;10;10;100;1;1;534,6;97;5;617;464;5346;ORTOOLS 191 | 189;sdata_la20;10;10;100;1;1;544,5;99;6;756;400;5445;ORTOOLS 192 | 190;sdata_la21;15;10;150;1,5;1,5;799,4;99;7;717;411;7994;CPO 193 | 191;sdata_la22;15;10;150;1,5;1,5;732,2;98;5;619;390;7322;ORTOOLS 194 | 192;sdata_la23;15;10;150;1,5;1,5;808,5;97;5;640;429;8085;CPO 195 | 193;sdata_la24;15;10;150;1,5;1,5;772,7;99;5;704;397;7727;CPO 196 | 194;sdata_la25;15;10;150;1,5;1,5;750,9;99;5;723;341;7509;CPO 197 | 195;sdata_la26;20;10;200;2;2;1051,5;99;7;717;411;10515;CPO 198 | 196;sdata_la27;20;10;200;2;2;1083,2;99;5;686;412;10832;ORTOOLS 199 | 197;sdata_la28;20;10;200;2;2;1068,2;99;5;756;397;10682;ORTOOLS 200 | 198;sdata_la29;20;10;200;2;2;992,9;99;5;723;341;9929;CPO 201 | 199;sdata_la30;20;10;200;2;2;1068;99;5;726;288;10680;CPO 202 | 200;sdata_la31;30;10;300;3;3;1519,1;99;5;717;366;15191;CPO 203 | 201;sdata_la32;30;10;300;3;3;1656,9;99;5;756;400;16569;CPO 204 | 202;sdata_la33;30;10;300;3;3;1496,9;99;5;723;341;14969;CPO 205 | 203;sdata_la34;30;10;300;3;3;1534,1;99;5;656;404;15341;CPO 206 | 204;sdata_la35;30;10;300;3;3;1548,5;99;5;647;358;15485;CPO 207 | 205;sdata_la36;15;15;225;1;1;782,6;99;7;948;633;11739;ORTOOLS 208 | 206;sdata_la37;15;15;225;1;1;837,9333333;99;5;986;697;12569;ORTOOLS 209 | 207;sdata_la38;15;15;225;1;1;747,8;99;5;943;431;11217;CPO 210 | 208;sdata_la39;15;15;225;1;1;770,2666667;99;5;922;599;11554;ORTOOLS 211 | 209;sdata_la40;15;15;225;1;1;764,8;99;5;955;637;11472;CPO 212 | 210;sdata_mt06;6;6;36;1;1;32,83333333;10;1;47;25;197;CPO 213 | 211;sdata_mt10;10;10;100;1;1;510,9;99;2;655;393;5109;CPO 214 | 212;sdata_mt20;20;5;100;4;4;1021,8;99;2;387;155;5109;CPO 215 | 213;sdata_orb1;10;10;100;1;1;540,9;99;5;695;407;5409;CPO 216 | 214;sdata_orb10;10;10;100;1;1;554,9;99;5;681;444;5549;ORTOOLS 217 | 215;sdata_orb2;10;10;100;1;1;525,5;99;6;620;380;5255;ORTOOLS 218 | 216;sdata_orb3;10;10;100;1;1;529,2;99;5;648;427;5292;CPO 219 | 217;sdata_orb4;10;10;100;1;1;562,8;98;5;753;425;5628;ORTOOLS 220 | 218;sdata_orb5;10;10;100;1;1;490,8;99;5;584;374;4908;ORTOOLS 221 | 219;sdata_orb6;10;10;100;1;1;561,4;99;6;715;441;5614;CPO 222 | 220;sdata_orb7;10;10;100;1;1;240,7;59;0;275;206;2407;CPO 223 | 221;sdata_orb8;10;10;100;1;1;456;97;5;573;347;4560;ORTOOLS 224 | 222;sdata_orb9;10;10;100;1;1;518,1;99;5;659;297;5181;ORTOOLS 225 | 223;setb4c9;15;11;150;1,363636364;1,363636364;772,7;99;5;704;397;7727;CPO 226 | 224;setb4cc;15;12;150;1,25;1,25;772,7;99;5;704;397;7727;CPO 227 | 225;setb4x;15;11;150;1,363636364;1,363636364;772,7;99;5;704;397;7727;ORTOOLS 228 | 226;setb4xx;15;12;150;1,25;1,25;772,7;99;5;704;397;7727;ORTOOLS 229 | 227;setb4xxx;15;13;150;1,153846154;1,153846154;772,7;99;5;704;397;7727;CPO 230 | 228;setb4xy;15;12;150;1,25;1,25;772,7;99;5;704;397;7727;CPO 231 | 229;setb4xyz;15;13;150;1,153846154;1,153846154;772,7;99;5;704;397;7727;ORTOOLS 232 | 230;seti5c12;15;16;225;0,9375;1,066666667;764,8;99;5;955;637;11472;CPO 233 | 231;seti5cc;15;17;225;0,882352941;1,133333333;764,8;99;5;955;637;11472;CPO 234 | 232;seti5x;15;16;225;0,9375;1,066666667;764,8;99;5;955;637;11472;ORTOOLS 235 | 233;seti5xx;15;17;225;0,882352941;1,133333333;764,8;99;5;955;637;11472;ORTOOLS 236 | 234;seti5xxx;15;18;225;0,833333333;1,2;764,8;99;5;955;637;11472;ORTOOLS 237 | 235;seti5xy;15;17;225;0,882352941;1,133333333;764,8;99;5;955;637;11472;CPO 238 | 236;seti5xyz;15;18;225;0,833333333;1,2;764,8;99;5;955;637;11472;CPO 239 | 237;vdata_abz5;10;10;100;1;1;777,3;99;50;859;704;7773;CPO 240 | 238;vdata_abz6;10;10;100;1;1;594,6;98;20;742;486;5946;CPO 241 | 239;vdata_abz7;20;15;300;1,333333333;1,333333333;491,0666667;40;11;410;322;7366;CPO 242 | 240;vdata_abz8;20;15;300;1,333333333;1,333333333;505,7333333;40;11;443;307;7586;CPO 243 | 241;vdata_abz9;20;15;300;1,333333333;1,333333333;496,1333333;40;11;467;268;7442;CPO 244 | 242;vdata_car1;11;5;55;2,2;2,2;5005;999;12;3088;1186;25025;ORTOOLS 245 | 243;vdata_car2;13;4;52;3,25;3,25;5928,75;996;12;2847;780;23715;ORTOOLS 246 | 244;vdata_car3;12;5;60;2,4;2,4;5596,8;966;100;3448;1564;27984;ORTOOLS 247 | 245;vdata_car4;14;4;56;3,5;3,5;6513,5;999;12;2971;1248;26054;ORTOOLS 248 | 246;vdata_car5;10;6;60;1,666666667;1,666666667;4908,666667;999;12;4037;1683;29452;ORTOOLS 249 | 247;vdata_car6;8;9;72;0,888888889;1,125;3868,777778;999;21;5486;3410;34819;CPO 250 | 248;vdata_car7;7;7;49;1;1;3412;963;2;4216;2948;23884;CPO 251 | 249;vdata_car8;8;8;64;1;1;3985,375;965;12;4613;2870;31883;CPO 252 | 250;vdata_la01;10;5;50;2;2;569,8;98;12;413;186;2849;ORTOOLS 253 | 251;vdata_la02;10;5;50;2;2;528,6;99;12;394;180;2643;ORTOOLS 254 | 252;vdata_la03;10;5;50;2;2;476,6;91;7;349;157;2383;ORTOOLS 255 | 253;vdata_la04;10;5;50;2;2;501,4;98;5;369;138;2507;ORTOOLS 256 | 254;vdata_la05;10;5;50;2;2;456,6;97;5;380;173;2283;ORTOOLS 257 | 255;vdata_la06;15;5;75;3;3;798,4;98;7;413;186;3992;ORTOOLS 258 | 256;vdata_la07;15;5;75;3;3;749;97;8;376;159;3745;ORTOOLS 259 | 257;vdata_la08;15;5;75;3;3;765;98;5;369;138;3825;ORTOOLS 260 | 258;vdata_la09;15;5;75;3;3;852,6;99;7;382;175;4263;ORTOOLS 261 | 259;vdata_la10;15;5;75;3;3;804;97;5;443;171;4020;ORTOOLS 262 | 260;vdata_la11;20;5;100;4;4;1070,2;98;7;413;186;5351;ORTOOLS 263 | 261;vdata_la12;20;5;100;4;4;935,2;98;5;408;88;4676;ORTOOLS 264 | 262;vdata_la13;20;5;100;4;4;1037,2;97;5;382;173;5186;ORTOOLS 265 | 263;vdata_la14;20;5;100;4;4;1069,2;97;5;443;171;5346;ORTOOLS 266 | 264;vdata_la15;20;5;100;4;4;1089;99;6;378;183;5445;ORTOOLS 267 | 265;vdata_la16;10;10;100;1;1;535,1;98;7;717;423;5351;CPO 268 | 266;vdata_la17;10;10;100;1;1;467,6;98;5;646;366;4676;CPO 269 | 267;vdata_la18;10;10;100;1;1;518,6;97;5;663;412;5186;CPO 270 | 268;vdata_la19;10;10;100;1;1;534,6;97;5;617;464;5346;CPO 271 | 269;vdata_la20;10;10;100;1;1;544,5;99;6;756;400;5445;CPO 272 | 270;vdata_la21;15;10;150;1,5;1,5;799,4;99;7;717;411;7994;CPO 273 | 271;vdata_la22;15;10;150;1,5;1,5;732,2;98;5;619;390;7322;CPO 274 | 272;vdata_la23;15;10;150;1,5;1,5;808,5;97;5;640;429;8085;CPO 275 | 273;vdata_la24;15;10;150;1,5;1,5;772,7;99;5;704;397;7727;CPO 276 | 274;vdata_la25;15;10;150;1,5;1,5;750,9;99;5;723;341;7509;CPO 277 | 275;vdata_la26;20;10;200;2;2;1051,5;99;7;717;411;10515;CPO 278 | 276;vdata_la27;20;10;200;2;2;1083,2;99;5;686;412;10832;CPO 279 | 277;vdata_la28;20;10;200;2;2;1068,2;99;5;756;397;10682;CPO 280 | 278;vdata_la29;20;10;200;2;2;992,9;99;5;723;341;9929;CPO 281 | 279;vdata_la30;20;10;200;2;2;1068;99;5;726;288;10680;CPO 282 | 280;vdata_la31;30;10;300;3;3;1519,1;99;5;717;366;15191;CPO 283 | 281;vdata_la32;30;10;300;3;3;1656,9;99;5;756;400;16569;CPO 284 | 282;vdata_la33;30;10;300;3;3;1496,9;99;5;723;341;14969;CPO 285 | 283;vdata_la34;30;10;300;3;3;1534,1;99;5;656;404;15341;CPO 286 | 284;vdata_la35;30;10;300;3;3;1548,5;99;5;647;358;15485;CPO 287 | 285;vdata_la36;15;15;225;1;1;782,6;99;7;948;633;11739;CPO 288 | 286;vdata_la37;15;15;225;1;1;837,9333333;99;5;986;697;12569;CPO 289 | 287;vdata_la38;15;15;225;1;1;747,8;99;5;943;431;11217;CPO 290 | 288;vdata_la39;15;15;225;1;1;770,2666667;99;5;922;599;11554;CPO 291 | 289;vdata_la40;15;15;225;1;1;764,8;99;5;955;637;11472;CPO 292 | 290;vdata_mt06;6;6;36;1;1;32,83333333;10;1;47;25;197;CPO 293 | 291;vdata_mt10;10;10;100;1;1;510,9;99;2;655;393;5109;CPO 294 | 292;vdata_mt20;20;5;100;4;4;1021,8;99;2;387;155;5109;ORTOOLS 295 | 293;vdata_orb1;10;10;100;1;1;540,9;99;5;695;407;5409;CPO 296 | 294;vdata_orb10;10;10;100;1;1;554,9;99;5;681;444;5549;CPO 297 | 295;vdata_orb2;10;10;100;1;1;525,5;99;6;620;380;5255;CPO 298 | 296;vdata_orb3;10;10;100;1;1;529,2;99;5;648;427;5292;CPO 299 | 297;vdata_orb4;10;10;100;1;1;562,8;98;5;753;425;5628;CPO 300 | 298;vdata_orb5;10;10;100;1;1;490,8;99;5;584;374;4908;CPO 301 | 299;vdata_orb6;10;10;100;1;1;561,4;99;6;715;441;5614;CPO 302 | 300;vdata_orb7;10;10;100;1;1;240,7;59;0;275;206;2407;CPO 303 | 301;vdata_orb8;10;10;100;1;1;456;97;5;573;347;4560;CPO 304 | 302;vdata_orb9;10;10;100;1;1;518,1;99;5;659;297;5181;CPO 305 | -------------------------------------------------------------------------------- /data/instance_features_FJSSP_30s.csv: -------------------------------------------------------------------------------- 1 | ;instance;jobs;AGVs;Operations;Job_AGV_ratio;Skewness;Total_job_mean;Max_transport_duration;Min_transport_duration;Max_job_duration;Min_job;Horizon;Algorithm 2 | 0;01a;10;5;196;2;2;567,7589254;100;10;1392;722;11137;CPO 3 | 1;02a;10;5;196;2;2;567,7589254;100;10;1392;722;11137;CPO 4 | 2;03a;10;5;196;2;2;567,7589254;100;10;1392;722;11137;CPO 5 | 3;04a;10;5;196;2;2;567,8786046;98;15;1382;757;11137;CPO 6 | 4;05a;10;5;196;2;2;573,4316794;99;11;1398;736;11252;CPO 7 | 5;06a;10;5;196;2;2;580,8589953;98;16;1395;754;11392;CPO 8 | 6;07a;15;8;293;1,875;1,875;849,3196905;100;10;1400;814;16485;CPO 9 | 7;08a;15;8;293;1,875;1,875;849,3196905;100;10;1400;814;16485;CPO 10 | 8;09a;15;8;293;1,875;1,875;849,3196905;100;10;1400;814;16485;CPO 11 | 9;10a;15;8;293;1,875;1,875;853,9448925;98;12;1394;824;16595;CPO 12 | 10;11a;15;8;293;1,875;1,875;871,2018467;100;14;1408;851;16918;CPO 13 | 11;12a;15;8;293;1,875;1,875;880,4084564;99;13;1402;852;17101;CPO 14 | 12;13a;20;10;387;2;2;1124,056641;100;10;1354;764;21610;CPO 15 | 13;14a;20;10;387;2;2;1124,056641;100;10;1354;764;21610;CPO 16 | 14;15a;20;10;387;2;2;1124,056641;100;10;1354;764;21610;CPO 17 | 15;16a;20;10;387;2;2;1130,901031;99;12;1349;768;21761;CPO 18 | 16;17a;20;10;387;2;2;1156,252423;98;12;1367;801;22249;CPO 19 | 17;18a;20;10;387;2;2;1175,927855;99;15;1390;834;22620;CPO 20 | 18;edata_abz5;10;10;100;1;1;777,3;99;50;859;704;7773;ORTOOLS 21 | 19;edata_abz6;10;10;100;1;1;594,6;98;20;742;486;5946;ORTOOLS 22 | 20;edata_abz7;20;15;300;1,333333333;1,333333333;491,0666667;40;11;410;322;7366;ORTOOLS 23 | 21;edata_abz8;20;15;300;1,333333333;1,333333333;505,7333333;40;11;443;307;7586;CPO 24 | 22;edata_abz9;20;15;300;1,333333333;1,333333333;496,1333333;40;11;467;268;7442;ORTOOLS 25 | 23;edata_car1;11;5;55;2,2;2,2;5005;999;12;3088;1186;25025;ORTOOLS 26 | 24;edata_car2;13;4;52;3,25;3,25;5928,75;996;12;2847;780;23715;ORTOOLS 27 | 25;edata_car3;12;5;60;2,4;2,4;5596,8;966;100;3448;1564;27984;ORTOOLS 28 | 26;edata_car4;14;4;56;3,5;3,5;6513,5;999;12;2971;1248;26054;ORTOOLS 29 | 27;edata_car5;10;6;60;1,666666667;1,666666667;4908,666667;999;12;4037;1683;29452;ORTOOLS 30 | 28;edata_car6;8;9;72;0,888888889;1,125;3868,777778;999;21;5486;3410;34819;ORTOOLS 31 | 29;edata_car7;7;7;49;1;1;3412;963;2;4216;2948;23884;ORTOOLS 32 | 30;edata_car8;8;8;64;1;1;3985,375;965;12;4613;2870;31883;ORTOOLS 33 | 31;edata_la01;10;5;50;2;2;569,8;98;12;413;186;2849;ORTOOLS 34 | 32;edata_la02;10;5;50;2;2;528,6;99;12;394;180;2643;ORTOOLS 35 | 33;edata_la03;10;5;50;2;2;476,6;91;7;349;157;2383;ORTOOLS 36 | 34;edata_la04;10;5;50;2;2;501,4;98;5;369;138;2507;ORTOOLS 37 | 35;edata_la05;10;5;50;2;2;456,6;97;5;380;173;2283;ORTOOLS 38 | 36;edata_la06;15;5;75;3;3;798,4;98;7;413;186;3992;CPO 39 | 37;edata_la07;15;5;75;3;3;749;97;8;376;159;3745;ORTOOLS 40 | 38;edata_la08;15;5;75;3;3;765;98;5;369;138;3825;CPO 41 | 39;edata_la09;15;5;75;3;3;852,6;99;7;382;175;4263;CPO 42 | 40;edata_la10;15;5;75;3;3;804;97;5;443;171;4020;CPO 43 | 41;edata_la11;20;5;100;4;4;1070,2;98;7;413;186;5351;CPO 44 | 42;edata_la12;20;5;100;4;4;935,2;98;5;408;88;4676;ORTOOLS 45 | 43;edata_la13;20;5;100;4;4;1037,2;97;5;382;173;5186;CPO 46 | 44;edata_la14;20;5;100;4;4;1069,2;97;5;443;171;5346;CPO 47 | 45;edata_la15;20;5;100;4;4;1089;99;6;378;183;5445;ORTOOLS 48 | 46;edata_la16;10;10;100;1;1;535,1;98;7;717;423;5351;ORTOOLS 49 | 47;edata_la17;10;10;100;1;1;467,6;98;5;646;366;4676;ORTOOLS 50 | 48;edata_la18;10;10;100;1;1;518,6;97;5;663;412;5186;ORTOOLS 51 | 49;edata_la19;10;10;100;1;1;534,6;97;5;617;464;5346;ORTOOLS 52 | 50;edata_la20;10;10;100;1;1;544,5;99;6;756;400;5445;ORTOOLS 53 | 51;edata_la21;15;10;150;1,5;1,5;799,4;99;7;717;411;7994;ORTOOLS 54 | 52;edata_la22;15;10;150;1,5;1,5;732,2;98;5;619;390;7322;CPO 55 | 53;edata_la23;15;10;150;1,5;1,5;808,5;97;5;640;429;8085;ORTOOLS 56 | 54;edata_la24;15;10;150;1,5;1,5;772,7;99;5;704;397;7727;ORTOOLS 57 | 55;edata_la25;15;10;150;1,5;1,5;750,9;99;5;723;341;7509;CPO 58 | 56;edata_la26;20;10;200;2;2;1051,5;99;7;717;411;10515;CPO 59 | 57;edata_la27;20;10;200;2;2;1083,2;99;5;686;412;10832;CPO 60 | 58;edata_la28;20;10;200;2;2;1068,2;99;5;756;397;10682;CPO 61 | 59;edata_la29;20;10;200;2;2;992,9;99;5;723;341;9929;CPO 62 | 60;edata_la30;20;10;200;2;2;1068;99;5;726;288;10680;CPO 63 | 61;edata_la31;30;10;300;3;3;1519,1;99;5;717;366;15191;CPO 64 | 62;edata_la32;30;10;300;3;3;1656,9;99;5;756;400;16569;CPO 65 | 63;edata_la33;30;10;300;3;3;1496,9;99;5;723;341;14969;CPO 66 | 64;edata_la34;30;10;300;3;3;1534,1;99;5;656;404;15341;CPO 67 | 65;edata_la35;30;10;300;3;3;1548,5;99;5;647;358;15485;CPO 68 | 66;edata_la36;15;15;225;1;1;782,6;99;7;948;633;11739;ORTOOLS 69 | 67;edata_la37;15;15;225;1;1;837,9333333;99;5;986;697;12569;CPO 70 | 68;edata_la38;15;15;225;1;1;747,8;99;5;943;431;11217;CPO 71 | 69;edata_la39;15;15;225;1;1;770,2666667;99;5;922;599;11554;ORTOOLS 72 | 70;edata_la40;15;15;225;1;1;764,8;99;5;955;637;11472;ORTOOLS 73 | 71;edata_mt06;6;6;36;1;1;32,83333333;10;1;47;25;197;ORTOOLS 74 | 72;edata_mt10;10;10;100;1;1;510,9;99;2;655;393;5109;ORTOOLS 75 | 73;edata_mt20;20;5;100;4;4;1021,8;99;2;387;155;5109;CPO 76 | 74;edata_orb1;10;10;100;1;1;540,9;99;5;695;407;5409;CPO 77 | 75;edata_orb10;10;10;100;1;1;554,9;99;5;681;444;5549;ORTOOLS 78 | 76;edata_orb2;10;10;100;1;1;525,5;99;6;620;380;5255;ORTOOLS 79 | 77;edata_orb3;10;10;100;1;1;529,2;99;5;648;427;5292;CPO 80 | 78;edata_orb4;10;10;100;1;1;562,8;98;5;753;425;5628;ORTOOLS 81 | 79;edata_orb5;10;10;100;1;1;490,8;99;5;584;374;4908;ORTOOLS 82 | 80;edata_orb6;10;10;100;1;1;561,4;99;6;715;441;5614;ORTOOLS 83 | 81;edata_orb7;10;10;100;1;1;240,7;59;0;275;206;2407;ORTOOLS 84 | 82;edata_orb8;10;10;100;1;1;456;97;5;573;347;4560;ORTOOLS 85 | 83;edata_orb9;10;10;100;1;1;518,1;99;5;659;297;5181;ORTOOLS 86 | 84;mt10c1;10;11;100;0,909090909;1,1;510,9;99;2;655;393;5109;CPO 87 | 85;mt10cc;10;12;100;0,833333333;1,2;510,9;99;2;655;393;5109;ORTOOLS 88 | 86;mt10x;10;11;100;0,909090909;1,1;510,9;99;2;655;393;5109;ORTOOLS 89 | 87;mt10xx;10;12;100;0,833333333;1,2;510,9;99;2;655;393;5109;ORTOOLS 90 | 88;mt10xxx;10;13;100;0,769230769;1,3;510,9;99;2;655;393;5109;ORTOOLS 91 | 89;mt10xy;10;12;100;0,833333333;1,2;510,9;99;2;655;393;5109;ORTOOLS 92 | 90;mt10xyz;10;13;100;0,769230769;1,3;510,9;99;2;655;393;5109;ORTOOLS 93 | 91;rdata_abz5;10;10;100;1;1;777,3;99;50;859;704;7773;CPO 94 | 92;rdata_abz6;10;10;100;1;1;594,6;98;20;742;486;5946;CPO 95 | 93;rdata_abz7;20;15;300;1,333333333;1,333333333;491,0666667;40;11;410;322;7366;CPO 96 | 94;rdata_abz8;20;15;300;1,333333333;1,333333333;505,7333333;40;11;443;307;7586;CPO 97 | 95;rdata_abz9;20;15;300;1,333333333;1,333333333;496,1333333;40;11;467;268;7442;CPO 98 | 96;rdata_car1;11;5;55;2,2;2,2;5005;999;12;3088;1186;25025;ORTOOLS 99 | 97;rdata_car2;13;4;52;3,25;3,25;5928,75;996;12;2847;780;23715;ORTOOLS 100 | 98;rdata_car3;12;5;60;2,4;2,4;5596,8;966;100;3448;1564;27984;ORTOOLS 101 | 99;rdata_car4;14;4;56;3,5;3,5;6513,5;999;12;2971;1248;26054;ORTOOLS 102 | 100;rdata_car5;10;6;60;1,666666667;1,666666667;4908,666667;999;12;4037;1683;29452;ORTOOLS 103 | 101;rdata_car6;8;9;72;0,888888889;1,125;3868,777778;999;21;5486;3410;34819;ORTOOLS 104 | 102;rdata_car7;7;7;49;1;1;3412;963;2;4216;2948;23884;ORTOOLS 105 | 103;rdata_car8;8;8;64;1;1;3985,375;965;12;4613;2870;31883;ORTOOLS 106 | 104;rdata_la01;10;5;50;2;2;569,8;98;12;413;186;2849;ORTOOLS 107 | 105;rdata_la02;10;5;50;2;2;528,6;99;12;394;180;2643;CPO 108 | 106;rdata_la03;10;5;50;2;2;476,6;91;7;349;157;2383;ORTOOLS 109 | 107;rdata_la04;10;5;50;2;2;501,4;98;5;369;138;2507;ORTOOLS 110 | 108;rdata_la05;10;5;50;2;2;456,6;97;5;380;173;2283;ORTOOLS 111 | 109;rdata_la06;15;5;75;3;3;798,4;98;7;413;186;3992;ORTOOLS 112 | 110;rdata_la07;15;5;75;3;3;749;97;8;376;159;3745;ORTOOLS 113 | 111;rdata_la08;15;5;75;3;3;765;98;5;369;138;3825;ORTOOLS 114 | 112;rdata_la09;15;5;75;3;3;852,6;99;7;382;175;4263;ORTOOLS 115 | 113;rdata_la10;15;5;75;3;3;804;97;5;443;171;4020;ORTOOLS 116 | 114;rdata_la11;20;5;100;4;4;1070,2;98;7;413;186;5351;ORTOOLS 117 | 115;rdata_la12;20;5;100;4;4;935,2;98;5;408;88;4676;ORTOOLS 118 | 116;rdata_la13;20;5;100;4;4;1037,2;97;5;382;173;5186;ORTOOLS 119 | 117;rdata_la14;20;5;100;4;4;1069,2;97;5;443;171;5346;ORTOOLS 120 | 118;rdata_la15;20;5;100;4;4;1089;99;6;378;183;5445;ORTOOLS 121 | 119;rdata_la16;10;10;100;1;1;535,1;98;7;717;423;5351;ORTOOLS 122 | 120;rdata_la17;10;10;100;1;1;467,6;98;5;646;366;4676;CPO 123 | 121;rdata_la18;10;10;100;1;1;518,6;97;5;663;412;5186;ORTOOLS 124 | 122;rdata_la19;10;10;100;1;1;534,6;97;5;617;464;5346;ORTOOLS 125 | 123;rdata_la20;10;10;100;1;1;544,5;99;6;756;400;5445;ORTOOLS 126 | 124;rdata_la21;15;10;150;1,5;1,5;799,4;99;7;717;411;7994;ORTOOLS 127 | 125;rdata_la22;15;10;150;1,5;1,5;732,2;98;5;619;390;7322;ORTOOLS 128 | 126;rdata_la23;15;10;150;1,5;1,5;808,5;97;5;640;429;8085;CPO 129 | 127;rdata_la24;15;10;150;1,5;1,5;772,7;99;5;704;397;7727;CPO 130 | 128;rdata_la25;15;10;150;1,5;1,5;750,9;99;5;723;341;7509;CPO 131 | 129;rdata_la26;20;10;200;2;2;1051,5;99;7;717;411;10515;CPO 132 | 130;rdata_la27;20;10;200;2;2;1083,2;99;5;686;412;10832;CPO 133 | 131;rdata_la28;20;10;200;2;2;1068,2;99;5;756;397;10682;CPO 134 | 132;rdata_la29;20;10;200;2;2;992,9;99;5;723;341;9929;CPO 135 | 133;rdata_la30;20;10;200;2;2;1068;99;5;726;288;10680;CPO 136 | 134;rdata_la31;30;10;300;3;3;1519,1;99;5;717;366;15191;CPO 137 | 135;rdata_la32;30;10;300;3;3;1656,9;99;5;756;400;16569;CPO 138 | 136;rdata_la33;30;10;300;3;3;1496,9;99;5;723;341;14969;CPO 139 | 137;rdata_la34;30;10;300;3;3;1534,1;99;5;656;404;15341;CPO 140 | 138;rdata_la35;30;10;300;3;3;1548,5;99;5;647;358;15485;CPO 141 | 139;rdata_la36;15;15;225;1;1;782,6;99;7;948;633;11739;ORTOOLS 142 | 140;rdata_la37;15;15;225;1;1;837,9333333;99;5;986;697;12569;CPO 143 | 141;rdata_la38;15;15;225;1;1;747,8;99;5;943;431;11217;ORTOOLS 144 | 142;rdata_la39;15;15;225;1;1;770,2666667;99;5;922;599;11554;ORTOOLS 145 | 143;rdata_la40;15;15;225;1;1;764,8;99;5;955;637;11472;ORTOOLS 146 | 144;rdata_mt06;6;6;36;1;1;32,83333333;10;1;47;25;197;ORTOOLS 147 | 145;rdata_mt10;10;10;100;1;1;510,9;99;2;655;393;5109;CPO 148 | 146;rdata_mt20;20;5;100;4;4;1021,8;99;2;387;155;5109;ORTOOLS 149 | 147;rdata_orb1;10;10;100;1;1;540,9;99;5;695;407;5409;CPO 150 | 148;rdata_orb10;10;10;100;1;1;554,9;99;5;681;444;5549;ORTOOLS 151 | 149;rdata_orb2;10;10;100;1;1;525,5;99;6;620;380;5255;ORTOOLS 152 | 150;rdata_orb3;10;10;100;1;1;529,2;99;5;648;427;5292;CPO 153 | 151;rdata_orb4;10;10;100;1;1;562,8;98;5;753;425;5628;CPO 154 | 152;rdata_orb5;10;10;100;1;1;490,8;99;5;584;374;4908;CPO 155 | 153;rdata_orb6;10;10;100;1;1;561,4;99;6;715;441;5614;ORTOOLS 156 | 154;rdata_orb7;10;10;100;1;1;240,7;59;0;275;206;2407;ORTOOLS 157 | 155;rdata_orb8;10;10;100;1;1;456;97;5;573;347;4560;ORTOOLS 158 | 156;rdata_orb9;10;10;100;1;1;518,1;99;5;659;297;5181;CPO 159 | 157;sdata_abz5;10;10;100;1;1;777,3;99;50;859;704;7773;ORTOOLS 160 | 158;sdata_abz6;10;10;100;1;1;594,6;98;20;742;486;5946;ORTOOLS 161 | 159;sdata_abz7;20;15;300;1,333333333;1,333333333;491,0666667;40;11;410;322;7366;ORTOOLS 162 | 160;sdata_abz8;20;15;300;1,333333333;1,333333333;505,7333333;40;11;443;307;7586;CPO 163 | 161;sdata_abz9;20;15;300;1,333333333;1,333333333;496,1333333;40;11;467;268;7442;ORTOOLS 164 | 162;sdata_car1;11;5;55;2,2;2,2;5005;999;12;3088;1186;25025;CPO 165 | 163;sdata_car2;13;4;52;3,25;3,25;5928,75;996;12;2847;780;23715;CPO 166 | 164;sdata_car3;12;5;60;2,4;2,4;5596,8;966;100;3448;1564;27984;ORTOOLS 167 | 165;sdata_car4;14;4;56;3,5;3,5;6513,5;999;12;2971;1248;26054;CPO 168 | 166;sdata_car5;10;6;60;1,666666667;1,666666667;4908,666667;999;12;4037;1683;29452;ORTOOLS 169 | 167;sdata_car6;8;9;72;0,888888889;1,125;3868,777778;999;21;5486;3410;34819;ORTOOLS 170 | 168;sdata_car7;7;7;49;1;1;3412;963;2;4216;2948;23884;ORTOOLS 171 | 169;sdata_car8;8;8;64;1;1;3985,375;965;12;4613;2870;31883;CPO 172 | 170;sdata_la01;10;5;50;2;2;569,8;98;12;413;186;2849;CPO 173 | 171;sdata_la02;10;5;50;2;2;528,6;99;12;394;180;2643;ORTOOLS 174 | 172;sdata_la03;10;5;50;2;2;476,6;91;7;349;157;2383;CPO 175 | 173;sdata_la04;10;5;50;2;2;501,4;98;5;369;138;2507;ORTOOLS 176 | 174;sdata_la05;10;5;50;2;2;456,6;97;5;380;173;2283;CPO 177 | 175;sdata_la06;15;5;75;3;3;798,4;98;7;413;186;3992;CPO 178 | 176;sdata_la07;15;5;75;3;3;749;97;8;376;159;3745;CPO 179 | 177;sdata_la08;15;5;75;3;3;765;98;5;369;138;3825;CPO 180 | 178;sdata_la09;15;5;75;3;3;852,6;99;7;382;175;4263;CPO 181 | 179;sdata_la10;15;5;75;3;3;804;97;5;443;171;4020;CPO 182 | 180;sdata_la11;20;5;100;4;4;1070,2;98;7;413;186;5351;CPO 183 | 181;sdata_la12;20;5;100;4;4;935,2;98;5;408;88;4676;CPO 184 | 182;sdata_la13;20;5;100;4;4;1037,2;97;5;382;173;5186;CPO 185 | 183;sdata_la14;20;5;100;4;4;1069,2;97;5;443;171;5346;CPO 186 | 184;sdata_la15;20;5;100;4;4;1089;99;6;378;183;5445;CPO 187 | 185;sdata_la16;10;10;100;1;1;535,1;98;7;717;423;5351;ORTOOLS 188 | 186;sdata_la17;10;10;100;1;1;467,6;98;5;646;366;4676;ORTOOLS 189 | 187;sdata_la18;10;10;100;1;1;518,6;97;5;663;412;5186;ORTOOLS 190 | 188;sdata_la19;10;10;100;1;1;534,6;97;5;617;464;5346;ORTOOLS 191 | 189;sdata_la20;10;10;100;1;1;544,5;99;6;756;400;5445;ORTOOLS 192 | 190;sdata_la21;15;10;150;1,5;1,5;799,4;99;7;717;411;7994;CPO 193 | 191;sdata_la22;15;10;150;1,5;1,5;732,2;98;5;619;390;7322;ORTOOLS 194 | 192;sdata_la23;15;10;150;1,5;1,5;808,5;97;5;640;429;8085;CPO 195 | 193;sdata_la24;15;10;150;1,5;1,5;772,7;99;5;704;397;7727;CPO 196 | 194;sdata_la25;15;10;150;1,5;1,5;750,9;99;5;723;341;7509;CPO 197 | 195;sdata_la26;20;10;200;2;2;1051,5;99;7;717;411;10515;CPO 198 | 196;sdata_la27;20;10;200;2;2;1083,2;99;5;686;412;10832;CPO 199 | 197;sdata_la28;20;10;200;2;2;1068,2;99;5;756;397;10682;ORTOOLS 200 | 198;sdata_la29;20;10;200;2;2;992,9;99;5;723;341;9929;CPO 201 | 199;sdata_la30;20;10;200;2;2;1068;99;5;726;288;10680;CPO 202 | 200;sdata_la31;30;10;300;3;3;1519,1;99;5;717;366;15191;CPO 203 | 201;sdata_la32;30;10;300;3;3;1656,9;99;5;756;400;16569;CPO 204 | 202;sdata_la33;30;10;300;3;3;1496,9;99;5;723;341;14969;CPO 205 | 203;sdata_la34;30;10;300;3;3;1534,1;99;5;656;404;15341;CPO 206 | 204;sdata_la35;30;10;300;3;3;1548,5;99;5;647;358;15485;CPO 207 | 205;sdata_la36;15;15;225;1;1;782,6;99;7;948;633;11739;ORTOOLS 208 | 206;sdata_la37;15;15;225;1;1;837,9333333;99;5;986;697;12569;ORTOOLS 209 | 207;sdata_la38;15;15;225;1;1;747,8;99;5;943;431;11217;ORTOOLS 210 | 208;sdata_la39;15;15;225;1;1;770,2666667;99;5;922;599;11554;ORTOOLS 211 | 209;sdata_la40;15;15;225;1;1;764,8;99;5;955;637;11472;ORTOOLS 212 | 210;sdata_mt06;6;6;36;1;1;32,83333333;10;1;47;25;197;ORTOOLS 213 | 211;sdata_mt10;10;10;100;1;1;510,9;99;2;655;393;5109;ORTOOLS 214 | 212;sdata_mt20;20;5;100;4;4;1021,8;99;2;387;155;5109;CPO 215 | 213;sdata_orb1;10;10;100;1;1;540,9;99;5;695;407;5409;CPO 216 | 214;sdata_orb10;10;10;100;1;1;554,9;99;5;681;444;5549;ORTOOLS 217 | 215;sdata_orb2;10;10;100;1;1;525,5;99;6;620;380;5255;ORTOOLS 218 | 216;sdata_orb3;10;10;100;1;1;529,2;99;5;648;427;5292;CPO 219 | 217;sdata_orb4;10;10;100;1;1;562,8;98;5;753;425;5628;ORTOOLS 220 | 218;sdata_orb5;10;10;100;1;1;490,8;99;5;584;374;4908;ORTOOLS 221 | 219;sdata_orb6;10;10;100;1;1;561,4;99;6;715;441;5614;ORTOOLS 222 | 220;sdata_orb7;10;10;100;1;1;240,7;59;0;275;206;2407;ORTOOLS 223 | 221;sdata_orb8;10;10;100;1;1;456;97;5;573;347;4560;ORTOOLS 224 | 222;sdata_orb9;10;10;100;1;1;518,1;99;5;659;297;5181;ORTOOLS 225 | 223;setb4c9;15;11;150;1,363636364;1,363636364;772,7;99;5;704;397;7727;CPO 226 | 224;setb4cc;15;12;150;1,25;1,25;772,7;99;5;704;397;7727;ORTOOLS 227 | 225;setb4x;15;11;150;1,363636364;1,363636364;772,7;99;5;704;397;7727;ORTOOLS 228 | 226;setb4xx;15;12;150;1,25;1,25;772,7;99;5;704;397;7727;ORTOOLS 229 | 227;setb4xxx;15;13;150;1,153846154;1,153846154;772,7;99;5;704;397;7727;CPO 230 | 228;setb4xy;15;12;150;1,25;1,25;772,7;99;5;704;397;7727;ORTOOLS 231 | 229;setb4xyz;15;13;150;1,153846154;1,153846154;772,7;99;5;704;397;7727;ORTOOLS 232 | 230;seti5c12;15;16;225;0,9375;1,066666667;764,8;99;5;955;637;11472;CPO 233 | 231;seti5cc;15;17;225;0,882352941;1,133333333;764,8;99;5;955;637;11472;CPO 234 | 232;seti5x;15;16;225;0,9375;1,066666667;764,8;99;5;955;637;11472;ORTOOLS 235 | 233;seti5xx;15;17;225;0,882352941;1,133333333;764,8;99;5;955;637;11472;ORTOOLS 236 | 234;seti5xxx;15;18;225;0,833333333;1,2;764,8;99;5;955;637;11472;ORTOOLS 237 | 235;seti5xy;15;17;225;0,882352941;1,133333333;764,8;99;5;955;637;11472;CPO 238 | 236;seti5xyz;15;18;225;0,833333333;1,2;764,8;99;5;955;637;11472;ORTOOLS 239 | 237;vdata_abz5;10;10;100;1;1;777,3;99;50;859;704;7773;CPO 240 | 238;vdata_abz6;10;10;100;1;1;594,6;98;20;742;486;5946;CPO 241 | 239;vdata_abz7;20;15;300;1,333333333;1,333333333;491,0666667;40;11;410;322;7366;CPO 242 | 240;vdata_abz8;20;15;300;1,333333333;1,333333333;505,7333333;40;11;443;307;7586;CPO 243 | 241;vdata_abz9;20;15;300;1,333333333;1,333333333;496,1333333;40;11;467;268;7442;CPO 244 | 242;vdata_car1;11;5;55;2,2;2,2;5005;999;12;3088;1186;25025;ORTOOLS 245 | 243;vdata_car2;13;4;52;3,25;3,25;5928,75;996;12;2847;780;23715;ORTOOLS 246 | 244;vdata_car3;12;5;60;2,4;2,4;5596,8;966;100;3448;1564;27984;ORTOOLS 247 | 245;vdata_car4;14;4;56;3,5;3,5;6513,5;999;12;2971;1248;26054;ORTOOLS 248 | 246;vdata_car5;10;6;60;1,666666667;1,666666667;4908,666667;999;12;4037;1683;29452;ORTOOLS 249 | 247;vdata_car6;8;9;72;0,888888889;1,125;3868,777778;999;21;5486;3410;34819;CPO 250 | 248;vdata_car7;7;7;49;1;1;3412;963;2;4216;2948;23884;CPO 251 | 249;vdata_car8;8;8;64;1;1;3985,375;965;12;4613;2870;31883;CPO 252 | 250;vdata_la01;10;5;50;2;2;569,8;98;12;413;186;2849;ORTOOLS 253 | 251;vdata_la02;10;5;50;2;2;528,6;99;12;394;180;2643;ORTOOLS 254 | 252;vdata_la03;10;5;50;2;2;476,6;91;7;349;157;2383;ORTOOLS 255 | 253;vdata_la04;10;5;50;2;2;501,4;98;5;369;138;2507;ORTOOLS 256 | 254;vdata_la05;10;5;50;2;2;456,6;97;5;380;173;2283;ORTOOLS 257 | 255;vdata_la06;15;5;75;3;3;798,4;98;7;413;186;3992;ORTOOLS 258 | 256;vdata_la07;15;5;75;3;3;749;97;8;376;159;3745;ORTOOLS 259 | 257;vdata_la08;15;5;75;3;3;765;98;5;369;138;3825;ORTOOLS 260 | 258;vdata_la09;15;5;75;3;3;852,6;99;7;382;175;4263;ORTOOLS 261 | 259;vdata_la10;15;5;75;3;3;804;97;5;443;171;4020;ORTOOLS 262 | 260;vdata_la11;20;5;100;4;4;1070,2;98;7;413;186;5351;ORTOOLS 263 | 261;vdata_la12;20;5;100;4;4;935,2;98;5;408;88;4676;ORTOOLS 264 | 262;vdata_la13;20;5;100;4;4;1037,2;97;5;382;173;5186;ORTOOLS 265 | 263;vdata_la14;20;5;100;4;4;1069,2;97;5;443;171;5346;ORTOOLS 266 | 264;vdata_la15;20;5;100;4;4;1089;99;6;378;183;5445;ORTOOLS 267 | 265;vdata_la16;10;10;100;1;1;535,1;98;7;717;423;5351;CPO 268 | 266;vdata_la17;10;10;100;1;1;467,6;98;5;646;366;4676;CPO 269 | 267;vdata_la18;10;10;100;1;1;518,6;97;5;663;412;5186;CPO 270 | 268;vdata_la19;10;10;100;1;1;534,6;97;5;617;464;5346;CPO 271 | 269;vdata_la20;10;10;100;1;1;544,5;99;6;756;400;5445;CPO 272 | 270;vdata_la21;15;10;150;1,5;1,5;799,4;99;7;717;411;7994;CPO 273 | 271;vdata_la22;15;10;150;1,5;1,5;732,2;98;5;619;390;7322;CPO 274 | 272;vdata_la23;15;10;150;1,5;1,5;808,5;97;5;640;429;8085;CPO 275 | 273;vdata_la24;15;10;150;1,5;1,5;772,7;99;5;704;397;7727;CPO 276 | 274;vdata_la25;15;10;150;1,5;1,5;750,9;99;5;723;341;7509;CPO 277 | 275;vdata_la26;20;10;200;2;2;1051,5;99;7;717;411;10515;CPO 278 | 276;vdata_la27;20;10;200;2;2;1083,2;99;5;686;412;10832;CPO 279 | 277;vdata_la28;20;10;200;2;2;1068,2;99;5;756;397;10682;CPO 280 | 278;vdata_la29;20;10;200;2;2;992,9;99;5;723;341;9929;CPO 281 | 279;vdata_la30;20;10;200;2;2;1068;99;5;726;288;10680;CPO 282 | 280;vdata_la31;30;10;300;3;3;1519,1;99;5;717;366;15191;CPO 283 | 281;vdata_la32;30;10;300;3;3;1656,9;99;5;756;400;16569;CPO 284 | 282;vdata_la33;30;10;300;3;3;1496,9;99;5;723;341;14969;CPO 285 | 283;vdata_la34;30;10;300;3;3;1534,1;99;5;656;404;15341;CPO 286 | 284;vdata_la35;30;10;300;3;3;1548,5;99;5;647;358;15485;CPO 287 | 285;vdata_la36;15;15;225;1;1;782,6;99;7;948;633;11739;CPO 288 | 286;vdata_la37;15;15;225;1;1;837,9333333;99;5;986;697;12569;CPO 289 | 287;vdata_la38;15;15;225;1;1;747,8;99;5;943;431;11217;CPO 290 | 288;vdata_la39;15;15;225;1;1;770,2666667;99;5;922;599;11554;CPO 291 | 289;vdata_la40;15;15;225;1;1;764,8;99;5;955;637;11472;CPO 292 | 290;vdata_mt06;6;6;36;1;1;32,83333333;10;1;47;25;197;CPO 293 | 291;vdata_mt10;10;10;100;1;1;510,9;99;2;655;393;5109;CPO 294 | 292;vdata_mt20;20;5;100;4;4;1021,8;99;2;387;155;5109;ORTOOLS 295 | 293;vdata_orb1;10;10;100;1;1;540,9;99;5;695;407;5409;CPO 296 | 294;vdata_orb10;10;10;100;1;1;554,9;99;5;681;444;5549;CPO 297 | 295;vdata_orb2;10;10;100;1;1;525,5;99;6;620;380;5255;CPO 298 | 296;vdata_orb3;10;10;100;1;1;529,2;99;5;648;427;5292;CPO 299 | 297;vdata_orb4;10;10;100;1;1;562,8;98;5;753;425;5628;CPO 300 | 298;vdata_orb5;10;10;100;1;1;490,8;99;5;584;374;4908;CPO 301 | 299;vdata_orb6;10;10;100;1;1;561,4;99;6;715;441;5614;CPO 302 | 300;vdata_orb7;10;10;100;1;1;240,7;59;0;275;206;2407;CPO 303 | 301;vdata_orb8;10;10;100;1;1;456;97;5;573;347;4560;CPO 304 | 302;vdata_orb9;10;10;100;1;1;518,1;99;5;659;297;5181;CPO 305 | -------------------------------------------------------------------------------- /data/instance_features_JSSP_300s.csv: -------------------------------------------------------------------------------- 1 | ;instance;jobs;AGVs;Operations;Job_AGV_ratio;Skewness;Mean operation duration per job;Max job duration;Min job duration;Max_operation_duration;Min_operation_duration;Algorithm 2 | 0;abz5;10;10;100;1;1;77,73;859;704;99;50;ORTOOLS 3 | 1;abz6;10;10;100;1;1;59,46;742;486;98;20;ORTOOLS 4 | 2;abz7;20;15;225;1,333333333;1,333333333;24,55333333;410;322;40;11;ORTOOLS 5 | 3;abz8;20;15;225;1,333333333;1,333333333;25,28666667;443;307;40;11;ORTOOLS 6 | 4;abz9;20;15;225;1,333333333;1,333333333;24,80666667;467;268;40;11;ORTOOLS 7 | 5;dmu01;20;15;225;1,333333333;1,333333333;94,21333333;1753;1012;199;1;ORTOOLS 8 | 6;dmu02;20;15;225;1,333333333;1,333333333;99,86;2167;954;198;4;CPO 9 | 7;dmu03;20;15;225;1,333333333;1,333333333;99,22;1872;1000;199;1;ORTOOLS 10 | 8;dmu04;20;15;225;1,333333333;1,333333333;101,3533333;1908;1145;199;1;ORTOOLS 11 | 9;dmu05;20;15;225;1,333333333;1,333333333;101,84;1827;980;200;1;ORTOOLS 12 | 10;dmu06;20;20;400;1;1;104,9325;2585;1537;200;1;CPO 13 | 11;dmu07;20;20;400;1;1;98,0775;2545;1496;200;1;CPO 14 | 12;dmu08;20;20;400;1;1;102,6325;2493;1602;200;2;CPO 15 | 13;dmu09;20;20;400;1;1;98,675;2544;1637;200;1;CPO 16 | 14;dmu10;20;20;400;1;1;99,7325;2394;1681;200;1;ORTOOLS 17 | 15;dmu11;30;15;225;2;2;100,1377778;1913;1095;199;1;CPO 18 | 16;dmu12;30;15;225;2;2;102,2933333;1902;917;199;1;CPO 19 | 17;dmu13;30;15;225;2;2;101,2422222;1945;1037;200;2;ORTOOLS 20 | 18;dmu14;30;15;225;2;2;95,22;1798;1214;200;1;CPO 21 | 19;dmu15;30;15;225;2;2;96,44;1945;939;200;1;CPO 22 | 20;dmu16;30;20;400;1,5;1,5;99,53833333;2351;1598;200;1;CPO 23 | 21;dmu17;30;20;400;1,5;1,5;101,9983333;2491;1534;200;1;CPO 24 | 22;dmu18;30;20;400;1,5;1,5;100,885;2546;1475;200;1;CPO 25 | 23;dmu19;30;20;400;1,5;1,5;98,47666667;2315;1605;200;1;CPO 26 | 24;dmu20;30;20;400;1,5;1,5;98,71666667;2586;1556;200;1;CPO 27 | 25;dmu21;40;15;225;2,666666667;2,666666667;100,515;1873;1009;200;1;CPO 28 | 26;dmu22;40;15;225;2,666666667;2,666666667;104,0016667;1965;1093;200;1;CPO 29 | 27;dmu23;40;15;225;2,666666667;2,666666667;102,03;2038;1005;199;1;CPO 30 | 28;dmu24;40;15;225;2,666666667;2,666666667;102,6883333;2120;1015;200;1;CPO 31 | 29;dmu25;40;15;225;2,666666667;2,666666667;92,71166667;1861;990;200;1;CPO 32 | 30;dmu26;40;20;400;2;2;100,045;2627;1370;200;1;CPO 33 | 31;dmu27;40;20;400;2;2;105,2175;2590;1740;200;1;CPO 34 | 32;dmu28;40;20;400;2;2;97,64875;2537;1306;200;1;CPO 35 | 33;dmu29;40;20;400;2;2;99,28375;2505;1390;200;1;CPO 36 | 34;dmu30;40;20;400;2;2;101,315;2606;1486;200;1;CPO 37 | 35;dmu31;50;15;225;3,333333333;3,333333333;105,86;2159;1134;200;1;CPO 38 | 36;dmu32;50;15;225;3,333333333;3,333333333;97,09466667;2134;905;200;1;CPO 39 | 37;dmu33;50;15;225;3,333333333;3,333333333;101,28;1828;1168;200;1;CPO 40 | 38;dmu34;50;15;225;3,333333333;3,333333333;98,85333333;2040;947;200;1;CPO 41 | 39;dmu35;50;15;225;3,333333333;3,333333333;102,6053333;2241;1058;200;1;CPO 42 | 40;dmu36;50;20;400;2,5;2,5;100,947;2705;1467;200;1;CPO 43 | 41;dmu37;50;20;400;2,5;2,5;101,289;2616;1361;200;1;CPO 44 | 42;dmu38;50;20;400;2,5;2,5;100,259;2436;1378;200;1;CPO 45 | 43;dmu39;50;20;400;2,5;2,5;102,113;2607;1490;200;1;CPO 46 | 44;dmu40;50;20;400;2,5;2,5;99,163;2548;1362;200;1;CPO 47 | 45;dmu41;20;15;225;1,333333333;1,333333333;97,55666667;1842;1005;200;1;ORTOOLS 48 | 46;dmu42;20;15;225;1,333333333;1,333333333;103,62;1810;1026;200;1;ORTOOLS 49 | 47;dmu43;20;15;225;1,333333333;1,333333333;100,0633333;1915;1111;200;1;ORTOOLS 50 | 48;dmu44;20;15;225;1,333333333;1,333333333;104,0733333;1975;1192;200;1;ORTOOLS 51 | 49;dmu45;20;15;225;1,333333333;1,333333333;99,31666667;1768;1148;200;1;ORTOOLS 52 | 50;dmu46;20;20;400;1;1;104,715;2664;1494;200;1;ORTOOLS 53 | 51;dmu47;20;20;400;1;1;103,3025;2689;1493;199;2;CPO 54 | 52;dmu48;20;20;400;1;1;99,79;2516;1601;200;1;ORTOOLS 55 | 53;dmu49;20;20;400;1;1;96,68;2403;1490;199;1;ORTOOLS 56 | 54;dmu50;20;20;400;1;1;96,4075;2494;1296;200;1;ORTOOLS 57 | 55;dmu51;30;15;225;2;2;99,02444444;1825;1149;200;1;ORTOOLS 58 | 56;dmu52;30;15;225;2;2;100,6155556;1989;1081;200;1;CPO 59 | 57;dmu53;30;15;225;2;2;102,7488889;2229;903;200;1;ORTOOLS 60 | 58;dmu54;30;15;225;2;2;102,6133333;1990;1075;200;2;CPO 61 | 59;dmu55;30;15;225;2;2;98,26666667;1959;1066;200;1;CPO 62 | 60;dmu56;30;20;400;1,5;1,5;103,6466667;2778;1491;200;1;CPO 63 | 61;dmu57;30;20;400;1,5;1,5;98,095;2529;1358;200;2;CPO 64 | 62;dmu58;30;20;400;1,5;1,5;98,76666667;2625;1570;200;1;CPO 65 | 63;dmu59;30;20;400;1,5;1,5;95,62;2546;1268;200;1;CPO 66 | 64;dmu60;30;20;400;1,5;1,5;98,23166667;2547;1288;200;1;CPO 67 | 65;dmu61;40;15;225;2,666666667;2,666666667;99,61;1995;598;200;1;CPO 68 | 66;dmu62;40;15;225;2,666666667;2,666666667;97,50333333;2079;1066;200;1;CPO 69 | 67;dmu63;40;15;225;2,666666667;2,666666667;100,7533333;1877;1168;200;1;CPO 70 | 68;dmu64;40;15;225;2,666666667;2,666666667;100,6066667;2134;1037;200;1;CPO 71 | 69;dmu65;40;15;225;2,666666667;2,666666667;96,84833333;1892;791;200;1;CPO 72 | 70;dmu66;40;20;400;2;2;98,18;2416;1443;200;1;CPO 73 | 71;dmu67;40;20;400;2;2;100,9225;2668;1479;200;1;CPO 74 | 72;dmu68;40;20;400;2;2;100,205;2542;1589;200;1;CPO 75 | 73;dmu69;40;20;400;2;2;99,1175;2453;1346;200;1;CPO 76 | 74;dmu70;40;20;400;2;2;103,385;2518;1551;200;1;CPO 77 | 75;dmu71;50;15;225;3,333333333;3,333333333;100,6173333;2029;1073;200;1;CPO 78 | 76;dmu72;50;15;225;3,333333333;3,333333333;102,6613333;2061;781;200;1;CPO 79 | 77;dmu73;50;15;225;3,333333333;3,333333333;98,66533333;2071;996;200;1;CPO 80 | 78;dmu74;50;15;225;3,333333333;3,333333333;99,55333333;2017;1051;200;1;CPO 81 | 79;dmu75;50;15;225;3,333333333;3,333333333;100,5013333;2087;837;200;1;CPO 82 | 80;dmu76;50;20;400;2,5;2,5;100,113;2729;1523;200;1;CPO 83 | 81;dmu77;50;20;400;2,5;2,5;99,697;2542;1376;200;1;CPO 84 | 82;dmu78;50;20;400;2,5;2,5;99,485;2727;1276;200;1;CPO 85 | 83;dmu79;50;20;400;2,5;2,5;102,154;2717;1361;200;1;CPO 86 | 84;dmu80;50;20;400;2,5;2,5;98,419;2642;1491;200;1;CPO 87 | 85;ft06;6;6;36;1;1;5,472222222;47;25;10;1;CPO 88 | 86;ft10;10;10;100;1;1;51,09;655;393;99;2;ORTOOLS 89 | 87;ft20;20;5;25;4;4;51,09;387;155;99;2;CPO 90 | 88;la01;10;5;25;2;2;56,98;413;186;98;12;CPO 91 | 89;la02;10;5;25;2;2;52,86;394;180;99;12;ORTOOLS 92 | 90;la03;10;5;25;2;2;47,66;349;157;91;7;ORTOOLS 93 | 91;la04;10;5;25;2;2;50,14;369;138;98;5;ORTOOLS 94 | 92;la05;10;5;25;2;2;45,66;380;173;97;5;CPO 95 | 93;la06;15;5;25;3;3;53,22666667;413;186;98;7;CPO 96 | 94;la07;15;5;25;3;3;49,93333333;376;159;97;8;CPO 97 | 95;la08;15;5;25;3;3;51;369;138;98;5;CPO 98 | 96;la09;15;5;25;3;3;56,84;382;175;99;7;CPO 99 | 97;la10;15;5;25;3;3;53,6;443;171;97;5;CPO 100 | 98;la11;20;5;25;4;4;53,51;413;186;98;7;CPO 101 | 99;la12;20;5;25;4;4;46,76;408;88;98;5;ORTOOLS 102 | 100;la13;20;5;25;4;4;51,86;382;173;97;5;CPO 103 | 101;la14;20;5;25;4;4;53,46;443;171;97;5;CPO 104 | 102;la15;20;5;25;4;4;54,45;378;183;99;6;CPO 105 | 103;la16;10;10;100;1;1;53,51;717;423;98;7;ORTOOLS 106 | 104;la17;10;10;100;1;1;46,76;646;366;98;5;ORTOOLS 107 | 105;la18;10;10;100;1;1;51,86;663;412;97;5;ORTOOLS 108 | 106;la19;10;10;100;1;1;53,46;617;464;97;5;ORTOOLS 109 | 107;la20;10;10;100;1;1;54,45;756;400;99;6;ORTOOLS 110 | 108;la21;15;10;100;1,5;1,5;53,29333333;717;411;99;7;CPO 111 | 109;la22;15;10;100;1,5;1,5;48,81333333;619;390;98;5;ORTOOLS 112 | 110;la23;15;10;100;1,5;1,5;53,9;640;429;97;5;CPO 113 | 111;la24;15;10;100;1,5;1,5;51,51333333;704;397;99;5;CPO 114 | 112;la25;15;10;100;1,5;1,5;50,06;723;341;99;5;CPO 115 | 113;la26;20;10;100;2;2;52,575;717;411;99;7;CPO 116 | 114;la27;20;10;100;2;2;54,16;686;412;99;5;CPO 117 | 115;la28;20;10;100;2;2;53,41;756;397;99;5;CPO 118 | 116;la29;20;10;100;2;2;49,645;723;341;99;5;ORTOOLS 119 | 117;la30;20;10;100;2;2;53,4;726;288;99;5;CPO 120 | 118;la31;30;10;100;3;3;50,63666667;717;366;99;5;CPO 121 | 119;la32;30;10;100;3;3;55,23;756;400;99;5;CPO 122 | 120;la33;30;10;100;3;3;49,89666667;723;341;99;5;CPO 123 | 121;la34;30;10;100;3;3;51,13666667;656;404;99;5;CPO 124 | 122;la35;30;10;100;3;3;51,61666667;647;358;99;5;CPO 125 | 123;la36;15;15;225;1;1;52,17333333;948;633;99;7;ORTOOLS 126 | 124;la37;15;15;225;1;1;55,86222222;986;697;99;5;ORTOOLS 127 | 125;la38;15;15;225;1;1;49,85333333;943;431;99;5;CPO 128 | 126;la39;15;15;225;1;1;51,35111111;922;599;99;5;ORTOOLS 129 | 127;la40;15;15;225;1;1;50,98666667;955;637;99;5;CPO 130 | 128;orb01;10;10;100;1;1;54,09;695;407;99;5;CPO 131 | 129;orb02;10;10;100;1;1;52,55;620;380;99;6;ORTOOLS 132 | 130;orb03;10;10;100;1;1;52,92;648;427;99;5;CPO 133 | 131;orb04;10;10;100;1;1;56,28;753;425;98;5;ORTOOLS 134 | 132;orb05;10;10;100;1;1;49,08;584;374;99;5;ORTOOLS 135 | 133;orb06;10;10;100;1;1;56,14;715;441;99;6;CPO 136 | 134;orb07;10;10;100;1;1;24,07;275;206;59;0;ORTOOLS 137 | 135;orb08;10;10;100;1;1;45,6;573;347;97;5;ORTOOLS 138 | 136;orb09;10;10;100;1;1;51,81;659;297;99;5;ORTOOLS 139 | 137;orb10;10;10;100;1;1;55,49;681;444;99;5;ORTOOLS 140 | 138;swv01;20;10;100;2;2;48,695;727;316;100;1;CPO 141 | 139;swv02;20;10;100;2;2;50,005;664;324;100;1;ORTOOLS 142 | 140;swv03;20;10;100;2;2;49,475;647;352;100;1;ORTOOLS 143 | 141;swv04;20;10;100;2;2;51,2;642;312;100;1;ORTOOLS 144 | 142;swv05;20;10;100;2;2;50,485;720;337;100;1;ORTOOLS 145 | 143;swv06;20;15;225;1,333333333;1,333333333;50,79666667;974;570;100;1;CPO 146 | 144;swv07;20;15;225;1,333333333;1,333333333;48,54666667;947;459;100;1;ORTOOLS 147 | 145;swv08;20;15;225;1,333333333;1,333333333;52,69;1058;518;100;1;ORTOOLS 148 | 146;swv09;20;15;225;1,333333333;1,333333333;50,08;947;579;100;1;ORTOOLS 149 | 147;swv10;20;15;225;1,333333333;1,333333333;52,45666667;939;627;100;2;ORTOOLS 150 | 148;swv11;50;10;100;5;5;50,798;739;333;100;1;CPO 151 | 149;swv12;50;10;100;5;5;51,052;714;339;100;1;CPO 152 | 150;swv13;50;10;100;5;5;51,72;727;333;100;1;CPO 153 | 151;swv14;50;10;100;5;5;50,034;728;307;100;1;CPO 154 | 152;swv15;50;10;100;5;5;49,978;687;327;100;1;CPO 155 | 153;swv16;50;10;100;5;5;50,666;664;289;100;1;CPO 156 | 154;swv17;50;10;100;5;5;48,918;683;290;100;1;CPO 157 | 155;swv18;50;10;100;5;5;49,342;643;314;100;1;CPO 158 | 156;swv19;50;10;100;5;5;51,19;684;291;100;1;CPO 159 | 157;swv20;50;10;100;5;5;49,234;684;300;100;1;CPO 160 | 158;ta01;15;15;225;1;1;51,87111111;963;582;99;1;ORTOOLS 161 | 159;ta02;15;15;225;1;1;50,47111111;942;537;99;1;CPO 162 | 160;ta03;15;15;225;1;1;49,69333333;921;508;99;1;CPO 163 | 161;ta04;15;15;225;1;1;48,66222222;911;606;98;1;CPO 164 | 162;ta05;15;15;225;1;1;50,00888889;940;548;99;1;CPO 165 | 163;ta06;15;15;225;1;1;50,44888889;849;593;99;1;CPO 166 | 164;ta07;15;15;225;1;1;51,34666667;935;536;99;1;CPO 167 | 165;ta08;15;15;225;1;1;50,67555556;963;485;99;1;CPO 168 | 166;ta09;15;15;225;1;1;52,6;982;664;99;1;CPO 169 | 167;ta10;15;15;225;1;1;50,47111111;896;635;99;1;CPO 170 | 168;ta11;20;15;225;1,333333333;1,333333333;48,15666667;949;449;99;2;CPO 171 | 169;ta12;20;15;225;1,333333333;1,333333333;51,86333333;1012;660;99;1;ORTOOLS 172 | 170;ta13;20;15;225;1,333333333;1,333333333;48,47;919;464;99;1;CPO 173 | 171;ta14;20;15;225;1,333333333;1,333333333;47,7;990;585;99;1;ORTOOLS 174 | 172;ta15;20;15;225;1,333333333;1,333333333;48,63666667;880;545;99;1;CPO 175 | 173;ta16;20;15;225;1,333333333;1,333333333;51,8;932;549;98;1;CPO 176 | 174;ta17;20;15;225;1,333333333;1,333333333;51,81333333;979;640;99;1;CPO 177 | 175;ta18;20;15;225;1,333333333;1,333333333;49,73;900;587;99;1;ORTOOLS 178 | 176;ta19;20;15;225;1,333333333;1,333333333;49,24333333;920;585;99;1;ORTOOLS 179 | 177;ta20;20;15;225;1,333333333;1,333333333;50,44333333;928;604;99;1;ORTOOLS 180 | 178;ta21;20;20;400;1;1;50,4225;1217;763;99;1;ORTOOLS 181 | 179;ta22;20;20;400;1;1;50,3575;1223;815;99;1;ORTOOLS 182 | 180;ta23;20;20;400;1;1;50,215;1164;879;99;1;ORTOOLS 183 | 181;ta24;20;20;400;1;1;51;1151;806;99;1;CPO 184 | 182;ta25;20;20;400;1;1;49,135;1170;774;99;1;ORTOOLS 185 | 183;ta26;20;20;400;1;1;51,4825;1207;797;99;1;ORTOOLS 186 | 184;ta27;20;20;400;1;1;52,7275;1291;852;99;1;CPO 187 | 185;ta28;20;20;400;1;1;50,505;1221;771;99;1;ORTOOLS 188 | 186;ta29;20;20;400;1;1;52,455;1227;783;99;1;ORTOOLS 189 | 187;ta30;20;20;400;1;1;50,13;1212;759;99;1;ORTOOLS 190 | 188;ta31;30;15;225;2;2;50,22222222;990;516;99;1;CPO 191 | 189;ta32;30;15;225;2;2;51,56888889;972;524;99;1;CPO 192 | 190;ta33;30;15;225;2;2;52,65111111;1056;624;99;1;CPO 193 | 191;ta34;30;15;225;2;2;52,09555556;975;581;99;1;CPO 194 | 192;ta35;30;15;225;2;2;49,85111111;969;482;99;1;ORTOOLS 195 | 193;ta36;30;15;225;2;2;51,02;988;529;99;1;CPO 196 | 194;ta37;30;15;225;2;2;52,90444444;1045;541;99;1;CPO 197 | 195;ta38;30;15;225;2;2;49,60666667;952;563;99;1;CPO 198 | 196;ta39;30;15;225;2;2;47,96222222;905;586;99;1;CPO 199 | 197;ta40;30;15;225;2;2;49,57777778;961;538;99;1;CPO 200 | 198;ta41;30;20;400;1,5;1,5;52,13166667;1232;827;99;1;CPO 201 | 199;ta42;30;20;400;1,5;1,5;50,985;1192;850;99;1;CPO 202 | 200;ta43;30;20;400;1,5;1,5;49,29666667;1230;665;99;1;CPO 203 | 201;ta44;30;20;400;1,5;1,5;50,81;1204;703;99;1;CPO 204 | 202;ta45;30;20;400;1,5;1,5;51,07666667;1253;796;99;1;ORTOOLS 205 | 203;ta46;30;20;400;1,5;1,5;51,37166667;1290;772;99;1;CPO 206 | 204;ta47;30;20;400;1,5;1,5;50,37166667;1334;602;99;1;CPO 207 | 205;ta48;30;20;400;1,5;1,5;49,95333333;1282;791;99;1;CPO 208 | 206;ta49;30;20;400;1,5;1,5;49,58666667;1190;756;99;1;CPO 209 | 207;ta50;30;20;400;1,5;1,5;51,095;1251;759;99;1;CPO 210 | 208;ta51;50;15;225;3,333333333;3,333333333;50,55733333;975;540;99;1;CPO 211 | 209;ta52;50;15;225;3,333333333;3,333333333;49,52533333;1007;447;99;1;CPO 212 | 210;ta53;50;15;225;3,333333333;3,333333333;49,84133333;942;547;99;1;CPO 213 | 211;ta54;50;15;225;3,333333333;3,333333333;49,32133333;1144;534;99;1;CPO 214 | 212;ta55;50;15;225;3,333333333;3,333333333;49,15866667;940;534;99;1;CPO 215 | 213;ta56;50;15;225;3,333333333;3,333333333;50,59733333;920;421;99;1;CPO 216 | 214;ta57;50;15;225;3,333333333;3,333333333;51,24266667;1137;543;99;1;CPO 217 | 215;ta58;50;15;225;3,333333333;3,333333333;52,11333333;1042;568;99;1;CPO 218 | 216;ta59;50;15;225;3,333333333;3,333333333;49,152;963;495;99;1;CPO 219 | 217;ta60;50;15;225;3,333333333;3,333333333;50,39466667;1061;425;99;1;CPO 220 | 218;ta61;50;20;400;2,5;2,5;50,964;1284;762;99;1;CPO 221 | 219;ta62;50;20;400;2,5;2,5;51,598;1318;720;99;1;CPO 222 | 220;ta63;50;20;400;2,5;2,5;49,121;1289;699;99;1;CPO 223 | 221;ta64;50;20;400;2,5;2,5;48,462;1229;600;99;1;CPO 224 | 222;ta65;50;20;400;2,5;2,5;49,199;1270;715;99;1;CPO 225 | 223;ta66;50;20;400;2,5;2,5;50,39;1297;685;99;1;CPO 226 | 224;ta67;50;20;400;2,5;2,5;49,553;1273;752;99;1;CPO 227 | 225;ta68;50;20;400;2,5;2,5;49,903;1343;732;99;1;CPO 228 | 226;ta69;50;20;400;2,5;2,5;50,871;1416;734;99;1;CPO 229 | 227;ta70;50;20;400;2,5;2,5;50,878;1225;767;99;1;CPO 230 | 228;ta71;100;20;400;5;5;50,4455;1341;734;99;1;CPO 231 | 229;ta72;100;20;400;5;5;48,6825;1275;705;99;1;CPO 232 | 230;ta73;100;20;400;5;5;50,311;1306;705;99;1;CPO 233 | 231;ta74;100;20;400;5;5;50,0245;1297;718;99;1;CPO 234 | 232;ta75;100;20;400;5;5;49,36;1347;669;99;1;CPO 235 | 233;ta76;100;20;400;5;5;50,1855;1270;754;99;1;CPO 236 | 234;ta77;100;20;400;5;5;50,858;1244;674;99;1;CPO 237 | 235;ta78;100;20;400;5;5;49,55;1299;662;99;1;CPO 238 | 236;ta79;100;20;400;5;5;49,8665;1302;766;99;1;CPO 239 | 237;ta80;100;20;400;5;5;48,3485;1226;739;99;1;CPO 240 | 238;yn01;20;20;400;1;1;29,4;694;427;49;10;ORTOOLS 241 | 239;yn02;20;20;400;1;1;29,41;713;432;49;10;ORTOOLS 242 | 240;yn03;20;20;400;1;1;29,0575;680;492;49;10;ORTOOLS 243 | 241;yn04;20;20;400;1;1;30,205;719;476;49;10;CPO 244 | -------------------------------------------------------------------------------- /data/instance_features_JSSP_30s.csv: -------------------------------------------------------------------------------- 1 | ID;instance;jobs;AGVs;Operations;Job_AGV_ratio;Skewness;Mean operation duration per job;Max job duration;Min job duration;Max_operation_duration;Min_operation_duration;algorithm 2 | 0;abz5;10;10;100;1;1;77,73;859;704;99;50;ORTOOLS 3 | 1;abz6;10;10;100;1;1;59,46;742;486;98;20;ORTOOLS 4 | 2;abz7;20;15;225;1,333333333;1,333333333;24,55333333;410;322;40;11;ORTOOLS 5 | 3;abz8;20;15;225;1,333333333;1,333333333;25,28666667;443;307;40;11;ORTOOLS 6 | 4;abz9;20;15;225;1,333333333;1,333333333;24,80666667;467;268;40;11;ORTOOLS 7 | 5;dmu01;20;15;225;1,333333333;1,333333333;94,21333333;1753;1012;199;1;ORTOOLS 8 | 6;dmu02;20;15;225;1,333333333;1,333333333;99,86;2167;954;198;4;ORTOOLS 9 | 7;dmu03;20;15;225;1,333333333;1,333333333;99,22;1872;1000;199;1;ORTOOLS 10 | 8;dmu04;20;15;225;1,333333333;1,333333333;101,3533333;1908;1145;199;1;ORTOOLS 11 | 9;dmu05;20;15;225;1,333333333;1,333333333;101,84;1827;980;200;1;CPO 12 | 10;dmu06;20;20;400;1;1;104,9325;2585;1537;200;1;CPO 13 | 11;dmu07;20;20;400;1;1;98,0775;2545;1496;200;1;CPO 14 | 12;dmu08;20;20;400;1;1;102,6325;2493;1602;200;2;CPO 15 | 13;dmu09;20;20;400;1;1;98,675;2544;1637;200;1;CPO 16 | 14;dmu10;20;20;400;1;1;99,7325;2394;1681;200;1;ORTOOLS 17 | 15;dmu11;30;15;225;2;2;100,1377778;1913;1095;199;1;CPO 18 | 16;dmu12;30;15;225;2;2;102,2933333;1902;917;199;1;CPO 19 | 17;dmu13;30;15;225;2;2;101,2422222;1945;1037;200;2;CPO 20 | 18;dmu14;30;15;225;2;2;95,22;1798;1214;200;1;CPO 21 | 19;dmu15;30;15;225;2;2;96,44;1945;939;200;1;CPO 22 | 20;dmu16;30;20;400;1,5;1,5;99,53833333;2351;1598;200;1;CPO 23 | 21;dmu17;30;20;400;1,5;1,5;101,9983333;2491;1534;200;1;CPO 24 | 22;dmu18;30;20;400;1,5;1,5;100,885;2546;1475;200;1;CPO 25 | 23;dmu19;30;20;400;1,5;1,5;98,47666667;2315;1605;200;1;CPO 26 | 24;dmu20;30;20;400;1,5;1,5;98,71666667;2586;1556;200;1;CPO 27 | 25;dmu21;40;15;225;2,666666667;2,666666667;100,515;1873;1009;200;1;CPO 28 | 26;dmu22;40;15;225;2,666666667;2,666666667;104,0016667;1965;1093;200;1;CPO 29 | 27;dmu23;40;15;225;2,666666667;2,666666667;102,03;2038;1005;199;1;CPO 30 | 28;dmu24;40;15;225;2,666666667;2,666666667;102,6883333;2120;1015;200;1;CPO 31 | 29;dmu25;40;15;225;2,666666667;2,666666667;92,71166667;1861;990;200;1;CPO 32 | 30;dmu26;40;20;400;2;2;100,045;2627;1370;200;1;CPO 33 | 31;dmu27;40;20;400;2;2;105,2175;2590;1740;200;1;CPO 34 | 32;dmu28;40;20;400;2;2;97,64875;2537;1306;200;1;CPO 35 | 33;dmu29;40;20;400;2;2;99,28375;2505;1390;200;1;CPO 36 | 34;dmu30;40;20;400;2;2;101,315;2606;1486;200;1;CPO 37 | 35;dmu31;50;15;225;3,333333333;3,333333333;105,86;2159;1134;200;1;CPO 38 | 36;dmu32;50;15;225;3,333333333;3,333333333;97,09466667;2134;905;200;1;CPO 39 | 37;dmu33;50;15;225;3,333333333;3,333333333;101,28;1828;1168;200;1;CPO 40 | 38;dmu34;50;15;225;3,333333333;3,333333333;98,85333333;2040;947;200;1;CPO 41 | 39;dmu35;50;15;225;3,333333333;3,333333333;102,6053333;2241;1058;200;1;CPO 42 | 40;dmu36;50;20;400;2,5;2,5;100,947;2705;1467;200;1;CPO 43 | 41;dmu37;50;20;400;2,5;2,5;101,289;2616;1361;200;1;CPO 44 | 42;dmu38;50;20;400;2,5;2,5;100,259;2436;1378;200;1;CPO 45 | 43;dmu39;50;20;400;2,5;2,5;102,113;2607;1490;200;1;CPO 46 | 44;dmu40;50;20;400;2,5;2,5;99,163;2548;1362;200;1;CPO 47 | 45;dmu41;20;15;225;1,333333333;1,333333333;97,55666667;1842;1005;200;1;ORTOOLS 48 | 46;dmu42;20;15;225;1,333333333;1,333333333;103,62;1810;1026;200;1;CPO 49 | 47;dmu43;20;15;225;1,333333333;1,333333333;100,0633333;1915;1111;200;1;CPO 50 | 48;dmu44;20;15;225;1,333333333;1,333333333;104,0733333;1975;1192;200;1;CPO 51 | 49;dmu45;20;15;225;1,333333333;1,333333333;99,31666667;1768;1148;200;1;CPO 52 | 50;dmu46;20;20;400;1;1;104,715;2664;1494;200;1;CPO 53 | 51;dmu47;20;20;400;1;1;103,3025;2689;1493;199;2;CPO 54 | 52;dmu48;20;20;400;1;1;99,79;2516;1601;200;1;CPO 55 | 53;dmu49;20;20;400;1;1;96,68;2403;1490;199;1;CPO 56 | 54;dmu50;20;20;400;1;1;96,4075;2494;1296;200;1;CPO 57 | 55;dmu51;30;15;225;2;2;99,02444444;1825;1149;200;1;CPO 58 | 56;dmu52;30;15;225;2;2;100,6155556;1989;1081;200;1;CPO 59 | 57;dmu53;30;15;225;2;2;102,7488889;2229;903;200;1;CPO 60 | 58;dmu54;30;15;225;2;2;102,6133333;1990;1075;200;2;CPO 61 | 59;dmu55;30;15;225;2;2;98,26666667;1959;1066;200;1;CPO 62 | 60;dmu56;30;20;400;1,5;1,5;103,6466667;2778;1491;200;1;CPO 63 | 61;dmu57;30;20;400;1,5;1,5;98,095;2529;1358;200;2;CPO 64 | 62;dmu58;30;20;400;1,5;1,5;98,76666667;2625;1570;200;1;CPO 65 | 63;dmu59;30;20;400;1,5;1,5;95,62;2546;1268;200;1;CPO 66 | 64;dmu60;30;20;400;1,5;1,5;98,23166667;2547;1288;200;1;CPO 67 | 65;dmu61;40;15;225;2,666666667;2,666666667;99,61;1995;598;200;1;CPO 68 | 66;dmu62;40;15;225;2,666666667;2,666666667;97,50333333;2079;1066;200;1;CPO 69 | 67;dmu63;40;15;225;2,666666667;2,666666667;100,7533333;1877;1168;200;1;CPO 70 | 68;dmu64;40;15;225;2,666666667;2,666666667;100,6066667;2134;1037;200;1;CPO 71 | 69;dmu65;40;15;225;2,666666667;2,666666667;96,84833333;1892;791;200;1;CPO 72 | 70;dmu66;40;20;400;2;2;98,18;2416;1443;200;1;CPO 73 | 71;dmu67;40;20;400;2;2;100,9225;2668;1479;200;1;CPO 74 | 72;dmu68;40;20;400;2;2;100,205;2542;1589;200;1;CPO 75 | 73;dmu69;40;20;400;2;2;99,1175;2453;1346;200;1;CPO 76 | 74;dmu70;40;20;400;2;2;103,385;2518;1551;200;1;CPO 77 | 75;dmu71;50;15;225;3,333333333;3,333333333;100,6173333;2029;1073;200;1;CPO 78 | 76;dmu72;50;15;225;3,333333333;3,333333333;102,6613333;2061;781;200;1;CPO 79 | 77;dmu73;50;15;225;3,333333333;3,333333333;98,66533333;2071;996;200;1;CPO 80 | 78;dmu74;50;15;225;3,333333333;3,333333333;99,55333333;2017;1051;200;1;CPO 81 | 79;dmu75;50;15;225;3,333333333;3,333333333;100,5013333;2087;837;200;1;CPO 82 | 80;dmu76;50;20;400;2,5;2,5;100,113;2729;1523;200;1;CPO 83 | 81;dmu77;50;20;400;2,5;2,5;99,697;2542;1376;200;1;CPO 84 | 82;dmu78;50;20;400;2,5;2,5;99,485;2727;1276;200;1;CPO 85 | 83;dmu79;50;20;400;2,5;2,5;102,154;2717;1361;200;1;CPO 86 | 84;dmu80;50;20;400;2,5;2,5;98,419;2642;1491;200;1;CPO 87 | 85;ft06;6;6;36;1;1;5,472222222;47;25;10;1;ORTOOLS 88 | 86;ft10;10;10;100;1;1;51,09;655;393;99;2;CPO 89 | 87;ft20;20;5;25;4;4;51,09;387;155;99;2;CPO 90 | 88;la01;10;5;25;2;2;56,98;413;186;98;12;CPO 91 | 89;la02;10;5;25;2;2;52,86;394;180;99;12;ORTOOLS 92 | 90;la03;10;5;25;2;2;47,66;349;157;91;7;ORTOOLS 93 | 91;la04;10;5;25;2;2;50,14;369;138;98;5;ORTOOLS 94 | 92;la05;10;5;25;2;2;45,66;380;173;97;5;CPO 95 | 93;la06;15;5;25;3;3;53,22666667;413;186;98;7;CPO 96 | 94;la07;15;5;25;3;3;49,93333333;376;159;97;8;CPO 97 | 95;la08;15;5;25;3;3;51;369;138;98;5;CPO 98 | 96;la09;15;5;25;3;3;56,84;382;175;99;7;CPO 99 | 97;la10;15;5;25;3;3;53,6;443;171;97;5;CPO 100 | 98;la11;20;5;25;4;4;53,51;413;186;98;7;CPO 101 | 99;la12;20;5;25;4;4;46,76;408;88;98;5;ORTOOLS 102 | 100;la13;20;5;25;4;4;51,86;382;173;97;5;CPO 103 | 101;la14;20;5;25;4;4;53,46;443;171;97;5;CPO 104 | 102;la15;20;5;25;4;4;54,45;378;183;99;6;CPO 105 | 103;la16;10;10;100;1;1;53,51;717;423;98;7;ORTOOLS 106 | 104;la17;10;10;100;1;1;46,76;646;366;98;5;ORTOOLS 107 | 105;la18;10;10;100;1;1;51,86;663;412;97;5;ORTOOLS 108 | 106;la19;10;10;100;1;1;53,46;617;464;97;5;ORTOOLS 109 | 107;la20;10;10;100;1;1;54,45;756;400;99;6;ORTOOLS 110 | 108;la21;15;10;100;1,5;1,5;53,29333333;717;411;99;7;CPO 111 | 109;la22;15;10;100;1,5;1,5;48,81333333;619;390;98;5;ORTOOLS 112 | 110;la23;15;10;100;1,5;1,5;53,9;640;429;97;5;CPO 113 | 111;la24;15;10;100;1,5;1,5;51,51333333;704;397;99;5;CPO 114 | 112;la25;15;10;100;1,5;1,5;50,06;723;341;99;5;ORTOOLS 115 | 113;la26;20;10;100;2;2;52,575;717;411;99;7;CPO 116 | 114;la27;20;10;100;2;2;54,16;686;412;99;5;ORTOOLS 117 | 115;la28;20;10;100;2;2;53,41;756;397;99;5;CPO 118 | 116;la29;20;10;100;2;2;49,645;723;341;99;5;CPO 119 | 117;la30;20;10;100;2;2;53,4;726;288;99;5;CPO 120 | 118;la31;30;10;100;3;3;50,63666667;717;366;99;5;CPO 121 | 119;la32;30;10;100;3;3;55,23;756;400;99;5;CPO 122 | 120;la33;30;10;100;3;3;49,89666667;723;341;99;5;CPO 123 | 121;la34;30;10;100;3;3;51,13666667;656;404;99;5;CPO 124 | 122;la35;30;10;100;3;3;51,61666667;647;358;99;5;CPO 125 | 123;la36;15;15;225;1;1;52,17333333;948;633;99;7;CPO 126 | 124;la37;15;15;225;1;1;55,86222222;986;697;99;5;ORTOOLS 127 | 125;la38;15;15;225;1;1;49,85333333;943;431;99;5;ORTOOLS 128 | 126;la39;15;15;225;1;1;51,35111111;922;599;99;5;ORTOOLS 129 | 127;la40;15;15;225;1;1;50,98666667;955;637;99;5;ORTOOLS 130 | 128;orb01;10;10;100;1;1;54,09;695;407;99;5;CPO 131 | 129;orb02;10;10;100;1;1;52,55;620;380;99;6;ORTOOLS 132 | 130;orb03;10;10;100;1;1;52,92;648;427;99;5;CPO 133 | 131;orb04;10;10;100;1;1;56,28;753;425;98;5;ORTOOLS 134 | 132;orb05;10;10;100;1;1;49,08;584;374;99;5;CPO 135 | 133;orb06;10;10;100;1;1;56,14;715;441;99;6;CPO 136 | 134;orb07;10;10;100;1;1;24,07;275;206;59;0;ORTOOLS 137 | 135;orb08;10;10;100;1;1;45,6;573;347;97;5;ORTOOLS 138 | 136;orb09;10;10;100;1;1;51,81;659;297;99;5;ORTOOLS 139 | 137;orb10;10;10;100;1;1;55,49;681;444;99;5;ORTOOLS 140 | 138;swv01;20;10;100;2;2;48,695;727;316;100;1;CPO 141 | 139;swv02;20;10;100;2;2;50,005;664;324;100;1;CPO 142 | 140;swv03;20;10;100;2;2;49,475;647;352;100;1;CPO 143 | 141;swv04;20;10;100;2;2;51,2;642;312;100;1;CPO 144 | 142;swv05;20;10;100;2;2;50,485;720;337;100;1;CPO 145 | 143;swv06;20;15;225;1,333333333;1,333333333;50,79666667;974;570;100;1;CPO 146 | 144;swv07;20;15;225;1,333333333;1,333333333;48,54666667;947;459;100;1;ORTOOLS 147 | 145;swv08;20;15;225;1,333333333;1,333333333;52,69;1058;518;100;1;CPO 148 | 146;swv09;20;15;225;1,333333333;1,333333333;50,08;947;579;100;1;CPO 149 | 147;swv10;20;15;225;1,333333333;1,333333333;52,45666667;939;627;100;2;CPO 150 | 148;swv11;50;10;100;5;5;50,798;739;333;100;1;CPO 151 | 149;swv12;50;10;100;5;5;51,052;714;339;100;1;CPO 152 | 150;swv13;50;10;100;5;5;51,72;727;333;100;1;CPO 153 | 151;swv14;50;10;100;5;5;50,034;728;307;100;1;CPO 154 | 152;swv15;50;10;100;5;5;49,978;687;327;100;1;CPO 155 | 153;swv16;50;10;100;5;5;50,666;664;289;100;1;CPO 156 | 154;swv17;50;10;100;5;5;48,918;683;290;100;1;CPO 157 | 155;swv18;50;10;100;5;5;49,342;643;314;100;1;CPO 158 | 156;swv19;50;10;100;5;5;51,19;684;291;100;1;CPO 159 | 157;swv20;50;10;100;5;5;49,234;684;300;100;1;CPO 160 | 158;ta01;15;15;225;1;1;51,87111111;963;582;99;1;ORTOOLS 161 | 159;ta02;15;15;225;1;1;50,47111111;942;537;99;1;ORTOOLS 162 | 160;ta03;15;15;225;1;1;49,69333333;921;508;99;1;CPO 163 | 161;ta04;15;15;225;1;1;48,66222222;911;606;98;1;ORTOOLS 164 | 162;ta05;15;15;225;1;1;50,00888889;940;548;99;1;CPO 165 | 163;ta06;15;15;225;1;1;50,44888889;849;593;99;1;CPO 166 | 164;ta07;15;15;225;1;1;51,34666667;935;536;99;1;CPO 167 | 165;ta08;15;15;225;1;1;50,67555556;963;485;99;1;ORTOOLS 168 | 166;ta09;15;15;225;1;1;52,6;982;664;99;1;ORTOOLS 169 | 167;ta10;15;15;225;1;1;50,47111111;896;635;99;1;CPO 170 | 168;ta11;20;15;225;1,333333333;1,333333333;48,15666667;949;449;99;2;ORTOOLS 171 | 169;ta12;20;15;225;1,333333333;1,333333333;51,86333333;1012;660;99;1;CPO 172 | 170;ta13;20;15;225;1,333333333;1,333333333;48,47;919;464;99;1;CPO 173 | 171;ta14;20;15;225;1,333333333;1,333333333;47,7;990;585;99;1;CPO 174 | 172;ta15;20;15;225;1,333333333;1,333333333;48,63666667;880;545;99;1;CPO 175 | 173;ta16;20;15;225;1,333333333;1,333333333;51,8;932;549;98;1;CPO 176 | 174;ta17;20;15;225;1,333333333;1,333333333;51,81333333;979;640;99;1;CPO 177 | 175;ta18;20;15;225;1,333333333;1,333333333;49,73;900;587;99;1;CPO 178 | 176;ta19;20;15;225;1,333333333;1,333333333;49,24333333;920;585;99;1;ORTOOLS 179 | 177;ta20;20;15;225;1,333333333;1,333333333;50,44333333;928;604;99;1;ORTOOLS 180 | 178;ta21;20;20;400;1;1;50,4225;1217;763;99;1;ORTOOLS 181 | 179;ta22;20;20;400;1;1;50,3575;1223;815;99;1;CPO 182 | 180;ta23;20;20;400;1;1;50,215;1164;879;99;1;ORTOOLS 183 | 181;ta24;20;20;400;1;1;51;1151;806;99;1;ORTOOLS 184 | 182;ta25;20;20;400;1;1;49,135;1170;774;99;1;CPO 185 | 183;ta26;20;20;400;1;1;51,4825;1207;797;99;1;CPO 186 | 184;ta27;20;20;400;1;1;52,7275;1291;852;99;1;CPO 187 | 185;ta28;20;20;400;1;1;50,505;1221;771;99;1;CPO 188 | 186;ta29;20;20;400;1;1;52,455;1227;783;99;1;CPO 189 | 187;ta30;20;20;400;1;1;50,13;1212;759;99;1;ORTOOLS 190 | 188;ta31;30;15;225;2;2;50,22222222;990;516;99;1;CPO 191 | 189;ta32;30;15;225;2;2;51,56888889;972;524;99;1;CPO 192 | 190;ta33;30;15;225;2;2;52,65111111;1056;624;99;1;CPO 193 | 191;ta34;30;15;225;2;2;52,09555556;975;581;99;1;CPO 194 | 192;ta35;30;15;225;2;2;49,85111111;969;482;99;1;ORTOOLS 195 | 193;ta36;30;15;225;2;2;51,02;988;529;99;1;CPO 196 | 194;ta37;30;15;225;2;2;52,90444444;1045;541;99;1;CPO 197 | 195;ta38;30;15;225;2;2;49,60666667;952;563;99;1;CPO 198 | 196;ta39;30;15;225;2;2;47,96222222;905;586;99;1;CPO 199 | 197;ta40;30;15;225;2;2;49,57777778;961;538;99;1;CPO 200 | 198;ta41;30;20;400;1,5;1,5;52,13166667;1232;827;99;1;CPO 201 | 199;ta42;30;20;400;1,5;1,5;50,985;1192;850;99;1;CPO 202 | 200;ta43;30;20;400;1,5;1,5;49,29666667;1230;665;99;1;CPO 203 | 201;ta44;30;20;400;1,5;1,5;50,81;1204;703;99;1;CPO 204 | 202;ta45;30;20;400;1,5;1,5;51,07666667;1253;796;99;1;CPO 205 | 203;ta46;30;20;400;1,5;1,5;51,37166667;1290;772;99;1;CPO 206 | 204;ta47;30;20;400;1,5;1,5;50,37166667;1334;602;99;1;CPO 207 | 205;ta48;30;20;400;1,5;1,5;49,95333333;1282;791;99;1;CPO 208 | 206;ta49;30;20;400;1,5;1,5;49,58666667;1190;756;99;1;CPO 209 | 207;ta50;30;20;400;1,5;1,5;51,095;1251;759;99;1;CPO 210 | 208;ta51;50;15;225;3,333333333;3,333333333;50,55733333;975;540;99;1;CPO 211 | 209;ta52;50;15;225;3,333333333;3,333333333;49,52533333;1007;447;99;1;CPO 212 | 210;ta53;50;15;225;3,333333333;3,333333333;49,84133333;942;547;99;1;CPO 213 | 211;ta54;50;15;225;3,333333333;3,333333333;49,32133333;1144;534;99;1;CPO 214 | 212;ta55;50;15;225;3,333333333;3,333333333;49,15866667;940;534;99;1;CPO 215 | 213;ta56;50;15;225;3,333333333;3,333333333;50,59733333;920;421;99;1;CPO 216 | 214;ta57;50;15;225;3,333333333;3,333333333;51,24266667;1137;543;99;1;CPO 217 | 215;ta58;50;15;225;3,333333333;3,333333333;52,11333333;1042;568;99;1;CPO 218 | 216;ta59;50;15;225;3,333333333;3,333333333;49,152;963;495;99;1;CPO 219 | 217;ta60;50;15;225;3,333333333;3,333333333;50,39466667;1061;425;99;1;CPO 220 | 218;ta61;50;20;400;2,5;2,5;50,964;1284;762;99;1;CPO 221 | 219;ta62;50;20;400;2,5;2,5;51,598;1318;720;99;1;CPO 222 | 220;ta63;50;20;400;2,5;2,5;49,121;1289;699;99;1;CPO 223 | 221;ta64;50;20;400;2,5;2,5;48,462;1229;600;99;1;CPO 224 | 222;ta65;50;20;400;2,5;2,5;49,199;1270;715;99;1;CPO 225 | 223;ta66;50;20;400;2,5;2,5;50,39;1297;685;99;1;CPO 226 | 224;ta67;50;20;400;2,5;2,5;49,553;1273;752;99;1;CPO 227 | 225;ta68;50;20;400;2,5;2,5;49,903;1343;732;99;1;CPO 228 | 226;ta69;50;20;400;2,5;2,5;50,871;1416;734;99;1;CPO 229 | 227;ta70;50;20;400;2,5;2,5;50,878;1225;767;99;1;CPO 230 | 228;ta71;100;20;400;5;5;50,4455;1341;734;99;1;CPO 231 | 229;ta72;100;20;400;5;5;48,6825;1275;705;99;1;CPO 232 | 230;ta73;100;20;400;5;5;50,311;1306;705;99;1;CPO 233 | 231;ta74;100;20;400;5;5;50,0245;1297;718;99;1;CPO 234 | 232;ta75;100;20;400;5;5;49,36;1347;669;99;1;CPO 235 | 233;ta76;100;20;400;5;5;50,1855;1270;754;99;1;CPO 236 | 234;ta77;100;20;400;5;5;50,858;1244;674;99;1;CPO 237 | 235;ta78;100;20;400;5;5;49,55;1299;662;99;1;CPO 238 | 236;ta79;100;20;400;5;5;49,8665;1302;766;99;1;CPO 239 | 237;ta80;100;20;400;5;5;48,3485;1226;739;99;1;CPO 240 | 238;yn01;20;20;400;1;1;29,4;694;427;49;10;ORTOOLS 241 | 239;yn02;20;20;400;1;1;29,41;713;432;49;10;CPO 242 | 240;yn03;20;20;400;1;1;29,0575;680;492;49;10;ORTOOLS 243 | 241;yn04;20;20;400;1;1;30,205;719;476;49;10;CPO 244 | -------------------------------------------------------------------------------- /selector/New_instance_analysis.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import pandas as pd 3 | import os 4 | 5 | 6 | def read_benchmark_instance_JSSP(filename): 7 | name = os.path.basename(filename) 8 | name = name.replace('.txt', '') 9 | 10 | jobs = [] 11 | operations = [] 12 | 13 | with open(filename) as f: 14 | lines = f.readlines() 15 | 16 | first_line = lines[0].split() 17 | #Number of jobs 18 | nb_jobs = int(first_line[0]) 19 | #Number of AGVs 20 | nb_AGVs = int(first_line[1]) 21 | 22 | with open(filename) as file: 23 | for line in file.readlines()[1:]: 24 | strip_lines = line.strip() 25 | jobs_list = strip_lines.split() 26 | jobs_list = list(map(int, jobs_list)) 27 | jobs.append(jobs_list) 28 | 29 | tasklist = [] 30 | for operation in jobs: 31 | tuple = [(operation[i], operation[i + 1]) for i in range(0, len(operation), 2)] 32 | tasklist.append(tuple) 33 | 34 | operations.append(tasklist) 35 | 36 | x = operations[0][0] 37 | nb_operations_list = [] 38 | for j in x: 39 | length = len(x) 40 | nb_operations_list.append(length) 41 | 42 | nb_operations = sum(nb_operations_list) 43 | 44 | if nb_jobs != len(jobs): 45 | nb_jobs = len(jobs) 46 | 47 | #Job-AGV ratio 48 | job_agv_ratio = nb_jobs/nb_AGVs 49 | #skewness 50 | skewness = max(nb_jobs/nb_AGVs, nb_AGVs/nb_jobs) 51 | 52 | # Transport times for each job on each AGV (given in the processing order) 53 | transport_times = [] 54 | for t in jobs: 55 | times_in_job = [] 56 | for index in range(1, len(t), 2): 57 | times_in_job.append(t[index]) 58 | transport_times.append(times_in_job) 59 | 60 | sum_job_times = [] 61 | for v in transport_times: 62 | job_sum = sum(v) 63 | sum_job_times.append(job_sum) 64 | 65 | max_job_duration = max(sum_job_times) 66 | min_job_duration = min(sum_job_times) 67 | 68 | #Get single transport times 69 | travel_times = [] 70 | for item in transport_times: 71 | for time in item: 72 | travel_times.append(time) 73 | 74 | max_dur_operation = max(travel_times) 75 | min_dur_operation = min(travel_times) 76 | 77 | 78 | #mean of operation times 79 | mean_per_job = [] 80 | for value in transport_times: 81 | operation = np.mean(value) 82 | mean_per_job.append(operation) 83 | #print(mean_per_job) 84 | #total_job_mean = np.mean(mean_per_job) 85 | mean_operation_duration_per_job = np.mean(mean_per_job) 86 | 87 | data = {'Instance': [name], 88 | 'jobs': [nb_jobs], 89 | 'AGVs': [nb_AGVs], 90 | 'Operations': [nb_operations], 91 | 'Job_AGV_ratio': [job_agv_ratio], 92 | 'Skewness': [skewness], 93 | 'Mean operation duration per job': [mean_operation_duration_per_job], 94 | 'Max job duration': [max_job_duration], 95 | 'Min job duration': [min_job_duration], 96 | 'Max_operation_duration': [max_dur_operation], 97 | 'Min_operation_duration': [min_dur_operation]} 98 | 99 | df = pd.DataFrame(data) 100 | 101 | return df 102 | 103 | def analyse_instance_FJSSP(instance): 104 | name = os.path.basename(instance) 105 | name = name.replace('.fjs', '') 106 | 107 | jobs = [] 108 | operations = [] 109 | 110 | with open(instance) as f: 111 | lines = f.readlines() 112 | 113 | first_line = lines[0].split() 114 | # Number of jobs 115 | nb_jobs = int(first_line[0]) 116 | # Number of AGVs 117 | nb_AGVs = int(first_line[1]) 118 | 119 | with open(instance) as file: 120 | for line in file.readlines()[1:]: 121 | strip_lines = line.strip() 122 | jobs_list = strip_lines.split() 123 | jobs_list = list(map(int, jobs_list)) 124 | jobs.append(jobs_list) 125 | 126 | for operation in jobs: 127 | nb_tasks = len(operation) 128 | tasklist = [] 129 | n = 1 130 | while n < nb_tasks: 131 | k = operation[n] # 1 132 | f = n + 1 133 | tuple = [(operation[f], operation[f + 1]) for f in range(f, n+k*2, 2)] 134 | tasklist.append(tuple) 135 | n = (2*k + n) + 1 136 | operations.append(tasklist) 137 | 138 | nb_operations_list = [] 139 | count = 0 140 | for j in operations: 141 | length = operations[count] 142 | leOp = len(length) 143 | nb_operations_list.append(leOp) 144 | count = count+1 145 | 146 | nb_operations = sum(nb_operations_list) 147 | 148 | if nb_jobs != len(jobs): 149 | nb_jobs = len(jobs) 150 | 151 | #Job-AGV ratio 152 | job_agv_ratio = nb_jobs/nb_AGVs 153 | #skewness 154 | skewness = max(nb_jobs/nb_AGVs, nb_AGVs/nb_jobs) 155 | 156 | operation_times = [] 157 | job_times = [] 158 | horizon = 0 159 | for job in operations: 160 | totalJob = [] 161 | for task in job: 162 | max_task_duration = 0 163 | for alternative in task: 164 | max_task_duration = max(max_task_duration, alternative[1]) 165 | horizon += max_task_duration 166 | totalJob.append(max_task_duration) 167 | operation_times.append(max_task_duration) 168 | job_times.append(totalJob) 169 | 170 | #print('Horizon = %i' % horizon) 171 | 172 | max_operation_duration = max(operation_times) 173 | min_operation_duration = min(operation_times) 174 | 175 | operation_mean_per_job = [] 176 | for value in job_times: 177 | oper = np.mean(value) 178 | operation_mean_per_job.append(oper) 179 | 180 | total_job_times = [] 181 | for value in job_times: 182 | job_sum = sum(value) 183 | total_job_times.append(job_sum) 184 | 185 | max_job_duration = max(total_job_times) 186 | min_job_duration = min(total_job_times) 187 | 188 | total_job_mean = sum(operation_mean_per_job) 189 | 190 | data = {'instance': [name], 191 | 'jobs': [nb_jobs], 192 | 'AGVs': [nb_AGVs], 193 | 'Operations': [nb_operations], 194 | 'Job_AGV_ratio': [job_agv_ratio], 195 | 'Skewness': [skewness], 196 | 'Total_job_mean': [total_job_mean], 197 | 'Max_transport_duration': [max_operation_duration], 198 | 'Min_transport_duration': [min_operation_duration], 199 | 'Max_job_duration': [max_job_duration], 200 | 'Min_job_duration': [min_job_duration], 201 | 'Horizon': [horizon]} 202 | 203 | df = pd.DataFrame(data) 204 | 205 | return df 206 | 207 | 208 | -------------------------------------------------------------------------------- /selector/machine_learning_algorithm_selection_FJSSP.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | pd.set_option('display.max_columns', None) 3 | 4 | data = pd.read_csv('instance_features_FJSSP_30s.csv', sep=';') 5 | 6 | data = data.iloc[:,1:] 7 | 8 | #convert object to float 9 | data["Job_AGV_ratio"]=[float(str(i).replace(",", ".")) for i in data["Job_AGV_ratio"]] 10 | data["Skewness"]=[float(str(i).replace(",", ".")) for i in data["Skewness"]] 11 | data["Total_job_mean"]=[float(str(i).replace(",", ".")) for i in data["Total_job_mean"]] 12 | 13 | #delete instance feature 14 | del data["instance"] 15 | 16 | print(data) 17 | 18 | #Check for missing values 19 | #import missingno as msno 20 | #msno.matrix(data) 21 | #matplotlib inline 22 | #print(msno.matrix(data)) 23 | 24 | #Transform categorical to numerical data 25 | import sklearn 26 | from sklearn.preprocessing import LabelEncoder 27 | lbe = LabelEncoder() 28 | data["Algorithm"] = lbe.fit_transform(data["Algorithm"]) 29 | 30 | #Correlation analysis 31 | '''import seaborn as sns 32 | import matplotlib.pyplot as plt 33 | corrm = data.corr() 34 | plt.figure(figsize=(30,25)) 35 | sns.heatmap(corrm, annot=True)''' 36 | #plt.show() 37 | 38 | #--------------------------------------------------------------------------------------------------------------------- 39 | #Start implementing machine learning 40 | #--------------------------------------------------------------------------------------------------------------------- 41 | 42 | #Import the train_test_split 43 | from sklearn.model_selection import train_test_split 44 | 45 | columns_list = list(data.columns) 46 | X = data[columns_list[0:11]] # Input data 47 | y = data[columns_list[-1]] 48 | 49 | #Create the data subsets (Train and Testing) 50 | X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42) #75% train and 25% test 51 | 52 | print("The data is ready for modelling") 53 | 54 | #--------------------------------------------------------------------------------------------------------------------- 55 | #import evaluation metrics 56 | 57 | from sklearn.metrics import f1_score, precision_score, recall_score, accuracy_score 58 | from sklearn.metrics import plot_confusion_matrix # will plot the confusion matrix 59 | import matplotlib.pyplot as plt 60 | 61 | #--------------------------------------------------------------------------------------------------------------------- 62 | 63 | #DECISION TREES 64 | 65 | from sklearn.tree import DecisionTreeClassifier 66 | 67 | #import the metrics functions 68 | from sklearn.metrics import (precision_score, recall_score, accuracy_score, roc_auc_score) 69 | 70 | #create decision tree classifier object 71 | dt_model_FJSSP = DecisionTreeClassifier(max_depth= 100) 72 | 73 | #Train Decision Tree Classifier 74 | dt_model_FJSSP = dt_model_FJSSP.fit(X_train, y_train) 75 | 76 | #Predict the response for test dataset 77 | y_pred_dt = dt_model_FJSSP.predict(X_test) 78 | 79 | accuracy_dt = accuracy_score(y_test, y_pred_dt) 80 | recall_dt = recall_score(y_test, y_pred_dt,average='weighted') 81 | precision_dt = precision_score(y_test, y_pred_dt,average='weighted') 82 | roc_auc_dt = roc_auc_score(y_test, y_pred_dt) 83 | 84 | print("DT Accuracy: "+ str(accuracy_dt)) 85 | print("DT Recall: "+ str(recall_dt)) 86 | print("DT Precision: "+ str(precision_dt)) 87 | print("DT AUC Score: " +str(roc_auc_dt)) 88 | 89 | #--------------------------------------------------------------------------------------------------------------------- 90 | 91 | #RANDOM FOREST 92 | 93 | from sklearn.ensemble import RandomForestClassifier 94 | from sklearn.metrics import f1_score, precision_score, recall_score, accuracy_score, matthews_corrcoef 95 | 96 | rf_model_FJSSP = RandomForestClassifier(n_estimators=100) 97 | 98 | rf_model_FJSSP.fit(X_train, y_train) 99 | y_pred_rf = rf_model_FJSSP.predict(X_test) 100 | 101 | recall_rf = recall_score(y_test, y_pred_rf, average='weighted') 102 | matthew_corr_rf = matthews_corrcoef(y_test, y_pred_rf) 103 | accuracy_rf = accuracy_score(y_test, y_pred_rf) 104 | 105 | 106 | print("RF Accuracy: "+ str(accuracy_rf)) 107 | print("RF Recall: "+ str(recall_rf)) 108 | print("RF Matthews Correlation: "+str(matthew_corr_rf)) 109 | 110 | #-------------------------------------------------------------------------------------------------------------------- 111 | #Logistic Regression 112 | from sklearn.linear_model import LogisticRegression 113 | 114 | logisticRegr = LogisticRegression(max_iter=3000) 115 | 116 | logisticRegr.fit(X_train, y_train) 117 | 118 | y_pred_lr = logisticRegr.predict(X_test) 119 | 120 | recall_LR = recall_score(y_test, y_pred_lr, average='weighted') 121 | accuracy_LR = accuracy_score(y_test, y_pred_lr) 122 | precision_LR = precision_score(y_test, y_pred_lr,average='weighted') 123 | f1_score_LR = f1_score(y_test, y_pred_lr) 124 | 125 | 126 | print("LR Recall: "+ str(recall_LR)) 127 | print("LR Accuracy: "+ str(accuracy_LR)) 128 | print("LR Precision: "+ str(precision_LR)) 129 | print("F1 Score: " +str(f1_score_LR)) 130 | 131 | #--------------------------------------------------------------------------------------------------------------------- 132 | 133 | #K NEAREST NEIGHBORS (KNN) 134 | 135 | from sklearn.neighbors import KNeighborsClassifier 136 | from sklearn.metrics import precision_score, recall_score, accuracy_score 137 | 138 | list_neigh = [3, 5, 7, 11] 139 | for n in list_neigh: 140 | knn_model_FJSSP = KNeighborsClassifier(n_neighbors=n) 141 | knn_model_FJSSP.fit(X_train, y_train) 142 | knn_predictions = knn_model_FJSSP.predict(X_test) 143 | knn_accuracy = accuracy_score(y_test, knn_predictions) 144 | knn_precision = precision_score(y_test, knn_predictions, average= 'weighted') 145 | #print("kNN Accuracy: "+ str(n) +" "+ str(knn_accuracy)) 146 | print("kNN Precision: "+ str(n)+" "+ str(knn_precision)) 147 | 148 | # --------------------------------------------------------------------------------------------------------------------- 149 | 150 | #MPL (FEED FORWARD NEURAL NETWORK WITH SCIKIT LEARN 151 | from scipy.sparse.construct import random 152 | from sklearn.neural_network import MLPClassifier 153 | 154 | #calling and training the model in one line 155 | mlp_model_FJSSP = MLPClassifier(random_state=43, hidden_layer_sizes=(50,60), 156 | activation='logistic', 157 | max_iter=1000).fit(X_train, y_train) 158 | 159 | #activation {'identity', 'logistic', 'tanh', 'relu'}, default='relu' 160 | 161 | #The above line can be done as follows: 162 | #mlp_model = MLPClassifier(random_state=1, max_iter=300) 163 | #mlp_model.fit(X_train, y_train) 164 | 165 | predictions = mlp_model_FJSSP.predict(X_test) 166 | 167 | mlp_accuracy = accuracy_score(y_test, predictions) 168 | mlp_recall = recall_score(y_test, predictions, average="weighted") 169 | mlp_precision = precision_score(y_test, predictions, average="weighted") 170 | mlp_f1_score = f1_score(y_test, predictions, average="weighted") 171 | 172 | print("Feed Forward Neural Network Results:") 173 | print("MLP Accuracy: "+str(mlp_accuracy)) 174 | print("MLP Recall: "+str(mlp_recall)) 175 | print("MLP Precision: "+str(mlp_precision)) 176 | print("MLP F1-Score: "+str(mlp_f1_score)) 177 | 178 | #--------------------------------------------------------------------------------------------------------------------- 179 | 180 | #FEED FORWARD NEURAL NETWORK IMPLEMENTATION WITH KERAS 181 | #Import libraries 182 | import keras 183 | from keras.models import Sequential 184 | from keras.layers import Dense, LSTM, GRU 185 | from keras import metrics 186 | import keras_metrics as km 187 | import numpy as np 188 | from numpy import array 189 | 190 | #Build the feed forward neural network model 191 | def build_nn_model(): 192 | model = Sequential() 193 | model.add(Dense(100, input_dim=10, activation='relu')) 194 | model.add(Dense(100, activation='relu')) 195 | model.add(Dense(3, activation='softmax')) #for multiclass classification 196 | #Compile model 197 | model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 198 | return model 199 | 200 | #institate the model 201 | nn_model = build_nn_model() 202 | 203 | #fit the model 204 | nn_model.fit(X_train, y_train, epochs=50, batch_size=5) 205 | 206 | #Evaluate model 207 | nn_model_scores = nn_model.evaluate(X_test, y_test) 208 | 209 | #--------------------------------------------------------------------------------------------------------------------- 210 | 211 | #LSTM IMPLEMENTATION USING KERAS 212 | #Build the feed forward neural network model 213 | def build_lstm_model(): 214 | model = Sequential() 215 | model.add(LSTM(100, return_sequences=True,input_shape=(1,len(X.columns)))) 216 | model.add(LSTM(150, return_sequences=True)) 217 | model.add(LSTM(210)) 218 | model.add(Dense(3, activation='softmax')) #for multiclass classification 219 | #Compile the model 220 | model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', 221 | metrics=['accuracy']) 222 | return model 223 | 224 | #reshape your inputs 225 | #Reshape the inputs. This is important because LSTM take in a 3 dimension input 226 | 227 | #The LSTM input layer must be 3D. 228 | #The meaning of the 3 input dimensions are: samples, time steps, and features. 229 | #reshape input data 230 | X_train_array = array(X_train) #array has been declared in the previous cell 231 | print(len(X_train_array)) 232 | X_train_reshaped = X_train_array.reshape(X_train_array.shape[0],1,len(X.columns)) 233 | 234 | #reshape output data 235 | X_test_array= array(X_test) 236 | X_test_reshaped = X_test_array.reshape(X_test_array.shape[0],1,len(X.columns)) 237 | #institate the model 238 | lstm_model = build_lstm_model() 239 | 240 | #fit the model 241 | lstm_model.fit(X_train_reshaped, y_train, epochs=20, batch_size=5) 242 | 243 | #Evaluate the neural network 244 | lstm_model_scores = lstm_model.evaluate(X_test_reshaped, y_test) 245 | 246 | #--------------------------------------------------------------------------------------------------------------------- 247 | 248 | '''def algorithm_selection_new_instance(file_analysed): 249 | instance_new = file_analysed.iloc[:,2:] 250 | 251 | #Determine algorithm for instance 252 | 253 | algorithm = dt_model_FJSSP.predict(instance_new) 254 | algorithm2 = rf_model_FJSSP.predict(instance_new) 255 | algorithm3 = knn_model_FJSSP.predict(instance_new) 256 | algorithm4 = mlp_model_FJSSP.predict(instance_new) 257 | 258 | algorithm = lbe.inverse_transform(algorithm) 259 | algorithm2 = lbe.inverse_transform(algorithm2) 260 | algorithm3 = lbe.inverse_transform(algorithm3) 261 | algorithm4 = lbe.inverse_transform(algorithm4) 262 | 263 | return algorithm, algorithm2, algorithm3, algorithm4''' 264 | 265 | 266 | #new_instance = pd.read_csv('new_instance_analysed') 267 | 268 | #algorithm, algorithm2, algorithm3, algorithm4 = algorithm_selection_new_instance(new_instance) 269 | 270 | 271 | """ 272 | After selecting the solver, the selector calculates the scheduling with this solver and prints the schedule. 273 | """ 274 | 275 | 276 | -------------------------------------------------------------------------------- /selector/machine_learning_algorithm_selection_JSSP.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | pd.set_option('display.max_columns', None) 3 | 4 | data = pd.read_csv('instance_features_JSSP_30s.csv', sep=';') 5 | 6 | data = data.iloc[:,1:] 7 | 8 | #convert object to float 9 | data["Job_AGV_ratio"]=[float(str(i).replace(",", ".")) for i in data["Job_AGV_ratio"]] 10 | data["Skewness"]=[float(str(i).replace(",", ".")) for i in data["Skewness"]] 11 | data["Mean operation duration per job"]=[float(str(i).replace(",", ".")) for i in data["Mean operation duration per job"]] 12 | 13 | #delete instance feature 14 | del data["instance"] 15 | 16 | print(data) 17 | 18 | #Check for missing values 19 | #import missingno as msno 20 | #msno.matrix(data) 21 | #matplotlib inline 22 | #print(msno.matrix(data)) 23 | 24 | #Transform categorical to numerical data 25 | import sklearn 26 | from sklearn.preprocessing import LabelEncoder 27 | lbe = LabelEncoder() 28 | data["algorithm"] = lbe.fit_transform(data["algorithm"]) 29 | 30 | #Correlation analysis 31 | '''import seaborn as sns 32 | import matplotlib.pyplot as plt 33 | corrm = data.corr() 34 | plt.figure(figsize=(30,25)) 35 | sns.heatmap(corrm, annot=True)''' 36 | #plt.show() 37 | 38 | #--------------------------------------------------------------------------------------------------------------------- 39 | #Start implementing machine learning 40 | #--------------------------------------------------------------------------------------------------------------------- 41 | 42 | #Import the train_test_split 43 | from sklearn.model_selection import train_test_split 44 | 45 | columns_list = list(data.columns) 46 | X = data[columns_list[0:10]] # Input data 47 | y = data[columns_list[-1]] 48 | 49 | #Create the data subsets (Train and Testing) 50 | X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42) #75% train and 25% test 51 | 52 | print("The data is ready for modelling") 53 | 54 | #--------------------------------------------------------------------------------------------------------------------- 55 | #import evaluation metrics 56 | 57 | from sklearn.metrics import f1_score, precision_score, recall_score, accuracy_score 58 | from sklearn.metrics import plot_confusion_matrix # will plot the confusion matrix 59 | import matplotlib.pyplot as plt 60 | 61 | #--------------------------------------------------------------------------------------------------------------------- 62 | 63 | #DECISION TREES 64 | 65 | from sklearn.tree import DecisionTreeClassifier 66 | 67 | #import the metrics functions 68 | from sklearn.metrics import (precision_score, recall_score, accuracy_score, roc_auc_score) 69 | 70 | #create decision tree classifier object 71 | dt_model = DecisionTreeClassifier(max_depth= 100) 72 | 73 | #Train Decision Tree Classifier 74 | dt_model = dt_model.fit(X_train, y_train) 75 | 76 | #Predict the response for test dataset 77 | y_pred_dt = dt_model.predict(X_test) 78 | 79 | accuracy_dt = accuracy_score(y_test, y_pred_dt) 80 | recall_dt = recall_score(y_test, y_pred_dt,average='weighted') 81 | precision_dt = precision_score(y_test, y_pred_dt,average='weighted') 82 | roc_auc_dt = roc_auc_score(y_test, y_pred_dt) 83 | f1_score_dt = f1_score(y_test, y_pred_dt) 84 | 85 | print("DT Accuracy: "+ str(accuracy_dt)) 86 | print("DT Recall: "+ str(recall_dt)) 87 | print("DT Precision: "+ str(precision_dt)) 88 | print("DT AUC Score: " +str(roc_auc_dt)) 89 | print("F1 Score: " +str(f1_score_dt)) 90 | #--------------------------------------------------------------------------------------------------------------------- 91 | 92 | #RANDOM FOREST 93 | 94 | from sklearn.ensemble import RandomForestClassifier 95 | from sklearn.metrics import f1_score, precision_score, recall_score, accuracy_score, matthews_corrcoef 96 | 97 | rf_model = RandomForestClassifier(n_estimators=100) 98 | 99 | rf_model.fit(X_train, y_train) 100 | y_pred_rf = rf_model.predict(X_test) 101 | 102 | recall_rf = recall_score(y_test, y_pred_rf, average='weighted') 103 | matthew_corr_rf = matthews_corrcoef(y_test, y_pred_rf) 104 | accuracy_rf = accuracy_score(y_test, y_pred_rf) 105 | precision_rf = precision_score(y_test, y_pred_rf,average='weighted') 106 | f1_score_rf = f1_score(y_test, y_pred_rf) 107 | 108 | print("RF Accuracy: "+ str(accuracy_rf)) 109 | print("RF Recall: "+ str(recall_rf)) 110 | print("RF Matthews Correlation: "+str(matthew_corr_rf)) 111 | print("RF Precision: "+ str(precision_rf)) 112 | print("F1 Score: " +str(f1_score_rf)) 113 | 114 | #--------------------------------------------------------------------------------------------------------------------- 115 | 116 | #Logistic Regression 117 | from sklearn.linear_model import LogisticRegression 118 | 119 | logisticRegr = LogisticRegression(max_iter=3000) 120 | 121 | logisticRegr.fit(X_train, y_train) 122 | 123 | y_pred_lr = logisticRegr.predict(X_test) 124 | 125 | recall_LR = recall_score(y_test, y_pred_lr, average='weighted') 126 | accuracy_LR = accuracy_score(y_test, y_pred_lr) 127 | precision_LR = precision_score(y_test, y_pred_lr,average='weighted') 128 | f1_score_LR = f1_score(y_test, y_pred_lr) 129 | 130 | 131 | print("LR Recall: "+ str(recall_LR)) 132 | print("LR Accuracy: "+ str(accuracy_LR)) 133 | print("LR Precision: "+ str(precision_LR)) 134 | print("F1 Score: " +str(f1_score_LR)) 135 | 136 | #K NEAREST NEIGHBORS (KNN) 137 | 138 | from sklearn.neighbors import KNeighborsClassifier 139 | from sklearn.metrics import precision_score, recall_score, accuracy_score 140 | 141 | list_neigh = [18] 142 | for n in list_neigh: 143 | knn_model = KNeighborsClassifier(n_neighbors=n) 144 | knn_model.fit(X_train, y_train) 145 | knn_predictions = knn_model.predict(X_test) 146 | 147 | knn_accuracy = accuracy_score(y_test, knn_predictions) 148 | knn_precision = precision_score(y_test, knn_predictions, average= 'weighted') 149 | recall_knn = recall_score(y_test, knn_predictions, average='weighted') 150 | f1_score_knn = f1_score(y_test, knn_predictions) 151 | 152 | print("kNN Accuracy: "+ str(n) +" "+ str(knn_accuracy)) 153 | print("kNN Precision: "+ str(n)+" "+ str(knn_precision)) 154 | print("kNN Recall: "+ str(recall_knn)) 155 | print("F1 Score: " +str(f1_score_knn)) 156 | 157 | 158 | # --------------------------------------------------------------------------------------------------------------------- 159 | 160 | #MPL (FEED FORWARD NEURAL NETWORK WITH SCIKIT LEARN 161 | from scipy.sparse.construct import random 162 | from sklearn.neural_network import MLPClassifier 163 | 164 | mlp_model = MLPClassifier(random_state=43, hidden_layer_sizes=(50,60), 165 | activation='logistic', 166 | max_iter=1000).fit(X_train, y_train) 167 | 168 | #activation {'identity', 'logistic', 'tanh', 'relu'}, default='relu' 169 | 170 | predictions = mlp_model.predict(X_test) 171 | 172 | mlp_accuracy = accuracy_score(y_test, predictions) 173 | mlp_recall = recall_score(y_test, predictions, average="weighted") 174 | mlp_precision = precision_score(y_test, predictions, average="weighted") 175 | mlp_f1_score = f1_score(y_test, predictions, average="weighted") 176 | 177 | print("Feed Forward Neural Network Results:") 178 | print("MLP Accuracy: "+str(mlp_accuracy)) 179 | print("MLP Recall: "+str(mlp_recall)) 180 | print("MLP Precision: "+str(mlp_precision)) 181 | print("MLP F1-Score: "+str(mlp_f1_score)) 182 | 183 | #--------------------------------------------------------------------------------------------------------------------- 184 | 185 | #FEED FORWARD NEURAL NETWORK IMPLEMENTATION WITH KERAS 186 | #Import libraries 187 | import keras 188 | from keras.models import Sequential 189 | from keras.layers import Dense, LSTM, GRU 190 | from keras import metrics 191 | import keras_metrics as km 192 | import numpy as np 193 | from numpy import array 194 | 195 | #Build the feed forward neural network model 196 | def build_nn_model(): 197 | model = Sequential() 198 | model.add(Dense(100, input_dim=10, activation='relu')) 199 | model.add(Dense(100, activation='relu')) 200 | model.add(Dense(3, activation='softmax')) #for multiclass classification 201 | #Compile model 202 | model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 203 | return model 204 | 205 | #institate the model 206 | nn_model = build_nn_model() 207 | 208 | #fit the model 209 | nn_model.fit(X_train, y_train, epochs=50, batch_size=5) 210 | 211 | #Evaluate model 212 | nn_model_scores = nn_model.evaluate(X_test, y_test) 213 | 214 | #--------------------------------------------------------------------------------------------------------------------- 215 | 216 | #LSTM IMPLEMENTATION USING KERAS 217 | #Build the feed forward neural network model 218 | def build_lstm_model(): 219 | model = Sequential() 220 | model.add(LSTM(100, return_sequences=True,input_shape=(1,len(X.columns)))) 221 | model.add(LSTM(150, return_sequences=True)) 222 | model.add(LSTM(210)) 223 | model.add(Dense(3, activation='softmax')) #for multiclass classification 224 | #Compile the model 225 | model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', 226 | metrics=['accuracy']) 227 | return model 228 | 229 | #reshape your inputs 230 | #Reshape the inputs. This is important because LSTM take in a 3 dimension input 231 | 232 | #The LSTM input layer must be 3D. 233 | #The meaning of the 3 input dimensions are: samples, time steps, and features. 234 | #reshape input data 235 | X_train_array = array(X_train) #array has been declared in the previous cell 236 | print(len(X_train_array)) 237 | X_train_reshaped = X_train_array.reshape(X_train_array.shape[0],1,len(X.columns)) 238 | 239 | #reshape output data 240 | X_test_array= array(X_test) 241 | X_test_reshaped = X_test_array.reshape(X_test_array.shape[0],1,len(X.columns)) 242 | #institate the model 243 | lstm_model = build_lstm_model() 244 | 245 | #fit the model 246 | lstm_model.fit(X_train_reshaped, y_train, epochs=20, batch_size=5) 247 | 248 | #Evaluate the neural network 249 | lstm_model_scores = lstm_model.evaluate(X_test_reshaped, y_test) 250 | 251 | #--------------------------------------------------------------------------------------------------------------------- 252 | 253 | '''def algorithm_selection_new_instance(file_analysed): 254 | instance_new = file_analysed.iloc[:,2:] 255 | 256 | #Determine algorithm for instance 257 | 258 | algorithm = dt_model.predict(instance_new) 259 | algorithm2 = rf_model.predict(instance_new) 260 | algorithm3 = knn_model.predict(instance_new) 261 | algorithm4 = mlp_model.predict(instance_new) 262 | 263 | algorithm = lbe.inverse_transform(algorithm) 264 | algorithm2 = lbe.inverse_transform(algorithm2) 265 | algorithm3 = lbe.inverse_transform(algorithm3) 266 | algorithm4 = lbe.inverse_transform(algorithm4) 267 | 268 | return algorithm, algorithm2, algorithm3, algorithm4 269 | 270 | 271 | new_instance = pd.read_csv('new_instance_analysed') 272 | 273 | algorithm, algorithm2, algorithm3, algorithm4 = algorithm_selection_new_instance(new_instance)''' 274 | 275 | 276 | """ 277 | After selecting the solver, the selector calculates the scheduling with this solver and prints the schedule. 278 | """ 279 | 280 | 281 | -------------------------------------------------------------------------------- /selector/scoring.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import numpy as np 3 | 4 | #Exact methods 5 | #CP Optimizer 6 | cpo = pd.read_csv('Validation_FJSSP_CPO_30.csv', sep=";") 7 | #OR Tools 8 | ortools = pd.read_csv('Validation_ORTOOLS_FJSSP_30.csv', sep=";") 9 | 10 | #Dataframe to store winning algorithms per instance 11 | df = cpo.drop(['solve_time', 'cmax', 'solver'], axis=1) 12 | df['solver'] = "" 13 | #Score performance of algorithms 14 | pd.set_option('display.max_columns', None) 15 | 16 | cpo["solve_time"] = cpo["solve_time"].str.replace(',', '.').astype(float) 17 | ortools["solve_time"] = ortools["solve_time"].str.replace(',', '.').astype(float) 18 | cpo["solve_time"] = pd.to_numeric(cpo["solve_time"]) 19 | ortools["solve_time"] = pd.to_numeric(ortools["solve_time"]) 20 | 21 | counter = 0 22 | for x in df['instance']: 23 | if cpo['cmax'][counter] < ortools['cmax'][counter]: 24 | df['solver'][counter] = 'CPO' 25 | elif cpo['cmax'][counter] == ortools['cmax'][counter]: 26 | if cpo['solve_time'][counter] < ortools['solve_time'][counter]: 27 | df['solver'][counter] = 'CPO' 28 | else: 29 | df['solver'][counter] = 'ORTOOLS' 30 | else: 31 | df['solver'][counter] = 'ORTOOLS' 32 | counter += 1 33 | 34 | algorithm_scoring = df.to_csv('scoring_FJSSP_30.csv') 35 | algorithm_scoring_xls = df.to_excel('scoring_FJSSP_30.xlsx') 36 | 37 | 38 | 39 | 40 | 41 | --------------------------------------------------------------------------------