# Add minimization objective mdl.add(minimize(max([end_of(OPS[o[0]]) for o in ops]))) ############################################################################## # Model solving ############################################################################## # Solve model print("Solving model....") msol = mdl.solve(FailLimit=100000) print("Solution: ") msol.print_solution() ############################################################################## # Display result ############################################################################## # Draw solution if msol and visu.is_visu_enabled(): visu.timeline("Solution for flexible job-shop " + filename) visu.panel("Machines") for j in range(nb_mchs): visu.sequence(name='M' + str(j)) for v in MACHS[j]: itv = msol.get_var_solution(v) if itv.is_present(): job = Job[v.get_name()] visu.interval(itv, job, 'J' + str(job)) visu.show()
mdl.add(minimize(max([end_of(ITVS[i][nbMchs - 1]) for i in range(nbJobs)]))) ############################################################################## # Model solving ############################################################################## # Solve model print("Solving model....") msol = mdl.solve(FailLimit=10000) print("Solution: ") msol.print_solution() ############################################################################## # Display result ############################################################################## # Draw solution if msol and visu.is_visu_enabled(): visu.timeline("Solution for permutation flow-shop " + filename) visu.panel("Jobs") for i in range(nbJobs): visu.sequence(name='J' + str(i), intervals=[(msol.get_var_solution(ITVS[i][j]), j, 'M' + str(j)) for j in range(nbMchs)]) visu.panel("Machines") for j in range(nbMchs): visu.sequence(name='M' + str(j), intervals=[(msol.get_var_solution(ITVS[i][j]), j, 'J' + str(i)) for i in range(nbJobs)]) visu.show()
print("Solution: ") msol.print_solution() ############################################################################## # Display result ############################################################################## if msol and visu.is_visu_enabled(): import _utils_visu as visu import matplotlib.pyplot as plt makespan_values = [msol.get_var_solution(m).get_value() for m in makespans] plt.hist(makespan_values, color='skyblue') plt.axvline(msol.get_objective_values()[0], color='navy', linestyle='dashed', linewidth=2) plt.title("Makespan histogram") plt.xlabel("Value") plt.ylabel("Frequency") visu.timeline("Solution sequencing for stochastic job-shop " + filename) visu.panel("Machines") for j in range(nb_machines): visu.sequence(name='M' + str(j)) itvs = msol.get_var_solution(ref_sequences[j]).get_value() for v in itvs: k, i, m = v.get_name().split('-') visu.interval(v, int(i), 'O' + i + '-' + m) visu.show()
print("Solving model....") msol = mdl.solve(FailLimit=250000) print("Solution: ") msol.print_solution() ############################################################################## # Display result ############################################################################## if msol and visu.is_visu_enabled(): import _utils_visu as visu import matplotlib.pyplot as plt makespan_values = [msol.get_var_solution(m).get_value() for m in makespans] plt.hist(makespan_values, color='skyblue') plt.axvline(msol.get_objective_values()[0], color='navy', linestyle='dashed', linewidth=2) plt.title("Makespan histogram") plt.xlabel("Value") plt.ylabel("Frequency") visu.timeline("Solution sequencing for stochastic job-shop " + filename) visu.panel("Machines") for j in range(nb_machines): visu.sequence(name='M' + str(j)) itvs = msol.get_var_solution(ref_sequences[j]).get_value() for v in itvs: k, i, m = v.get_name().split('-') visu.interval(v, int(i), 'O' + i + '-' + m) visu.show()
############################################################################## # Solving ############################################################################## print("Solving model....") msol = mdl.solve() print("Solution: ") msol.print_solution() ############################################################################## # Display result ############################################################################## if msol and visu.is_visu_enabled(): visu.timeline("Solution SchedTime", origin=10, horizon=120) visu.panel("Schedule") for t in ALL_TASKS: visu.interval(msol.get_var_solution(tasks[t.id]), t.id, t.name) for t in ALL_TASKS: if t.release_date is not None: visu.panel('Earliness') itvsol = msol.get_var_solution(tasks[t.id]) cost = fearliness[t].get_value(itvsol.get_start()) visu.function(segments=[(itvsol, cost, t.name)], color=t.id, style='interval') visu.function(segments=fearliness[t], color=t.id) if t.due_date is not None: visu.panel('Tardiness') itvsol = msol.get_var_solution(tasks[t.id])
############################################################################## # Solve model print("Solving model....") msol = mdl.solve(FailLimit=100000) print("Solution: ") msol.print_solution() ############################################################################## # Display result ############################################################################## if msol and visu.is_visu_enabled(): load = [CpoStepFunction() for j in range(nbResources)] for i in range(nbTasks): itv = msol.get_var_solution(tasks[i]) for j in range(nbResources): if 0 < demands[i][j]: load[j].add_value(itv.get_start(), itv.get_end(), demands[i][j]) visu.timeline("Solution for RCPSP " + filename) visu.panel("Tasks") for i in range(nbTasks): visu.interval(msol.get_var_solution(tasks[i]), i, tasks[i].get_name()) for j in range(nbResources): visu.panel("R " + str(j + 1)) visu.function(segments=[(INTERVAL_MIN, INTERVAL_MAX, capacities[j])], style='area', color='lightgrey') visu.function(segments=load[j], style='area', color=j) visu.show()
msol.print_solution() ############################################################################## # Display result ############################################################################## def compact(name): # Example: A31_M1_TP1 -> 31 task, foo = name.split('_', 1) return task[1:] def showsequence(s, setup): seq = msol.get_var_solution(s) visu.sequence(name=s.get_name()) vs = seq.get_value() for v in vs: nm = v.get_name() visu.interval(v, tp[id[nm]], compact(nm)) for i in range(len(vs) - 1): end = vs[i].get_end() tp1 = tp[id[vs[i].get_name()]] tp2 = tp[id[vs[i + 1].get_name()]] visu.transition(end, end + setup.get_value(tp1, tp2)) if msol and visu.is_visu_enabled(): visu.timeline("Solution for SchedSetup") showsequence(s1, setup1) showsequence(s2, setup2) visu.show()
msol.print_solution() ############################################################################## # Display result ############################################################################## def compact(name): # Example: A31_M1_TP1 -> 31 task, foo = name.split('_', 1) return task[1:] def showsequence(s, setup): seq = msol.get_var_solution(s) visu.sequence(name=s.get_name()) vs = seq.get_value() for v in vs: nm = v.get_name() visu.interval(v, tp[id[nm]], compact(nm)) for i in range(len(vs) - 1): end = vs[i].get_end() tp1 = tp[id[vs[i].get_name()]] tp2 = tp[id[vs[i + 1].get_name()]] visu.transition(end, end + setup.get_value(tp1, tp2)) if msol and visu.is_visu_enabled(): visu.timeline("Solution for SchedTCost") showsequence(s1, setup1) showsequence(s2, setup2) visu.show()
print("Solution: ") msol.print_solution() ############################################################################## # Display result ############################################################################## def compact(name): # Example: H3-garden -> G3 # ^ ^ loc, task = name[1:].split('-', 1) return task[0].upper() + loc if msol and visu.is_visu_enabled(): workers_function = CpoStepFunction() for v in all_tasks: itv = msol.get_var_solution(v) workers_function.add_value(itv.get_start(), itv.get_end(), 1) visu.timeline('Solution SchedState') visu.panel(name="Schedule") for v in all_tasks: visu.interval(msol.get_var_solution(v), house[v], compact(v.get_name())) visu.panel(name="Houses state") for f in all_state_functions: visu.sequence(name=f.get_name(), segments=msol.get_var_solution(f)) visu.panel(name="Nb of workers") visu.function(segments=workers_function, style='line') visu.show()
print("Solution: ") msol.print_solution() ############################################################################## # Display result ############################################################################## def compact(name): # Example: H3-garden -> G3 # ^ ^ loc, task = name[1:].split('-', 1) return task[0].upper() + loc # Draw solution if msol and visu.is_visu_enabled(): visu.timeline('Solution SchedOptional', 0, deadline) for w in range(nbWorkers): visu.sequence(name=workerNames[w]) for t in worker_tasks[w]: wt = msol.get_var_solution(t) if wt.is_present(): if desc[t].skills[w] == max(desc[t].skills): # Green-like color when task is using the most skilled worker color = 'lightgreen' else: # Red-like color when task does not use the most skilled worker color = 'salmon' visu.interval(wt, color, compact(wt.get_name())) visu.show()
############################################################################## # Model solving ############################################################################## # Solve model print("Solving model....") msol = mdl.solve() print("Solution: ") msol.print_solution() ############################################################################## # Display result ############################################################################## # Draw solution if msol and visu.is_visu_enabled(): visu.timeline("Solution for job-shop " + filename) visu.panel("Jobs") for i in range(nb_jobs): visu.sequence(name='J' + str(i), intervals=[(msol.get_var_solution(ITVS[i][j]), mch[i][j], 'M' + str(mch[i][j])) for j in range(nb_mchs)]) visu.panel("Machines") for k in range(nb_mchs): visu.sequence(name='M' + str(k), intervals=[(msol.get_var_solution(MACH[k][i]), k, 'J' + str(i)) for i in range(nb_jobs)]) visu.show()
mdl.add(minimize(max([end_of(ITVS[i][nbMchs - 1]) for i in range(nbJobs)]))) ############################################################################## # Model solving ############################################################################## # Solve model print("Solving model....") msol = mdl.solve(FailLimit=10000) print("Solution: ") msol.print_solution() ############################################################################## # Display result ############################################################################## # Display solution if msol and visu.is_visu_enabled(): visu.timeline("Solution for flow-shop " + filename) visu.panel("Jobs") for i in range(nbJobs): visu.sequence(name='J' + str(i), intervals=[(msol.get_var_solution(ITVS[i][j]), j, 'M' + str(j)) for j in range(nbMchs)]) visu.panel("Machines") for j in range(nbMchs): visu.sequence(name='M' + str(j), intervals=[(msol.get_var_solution(ITVS[i][j]), j, 'J' + str(i)) for i in range(nbJobs)]) visu.show()
############################################################################## # Display result ############################################################################## def compact(name): # Example: H3-garden -> G3 # ^ ^ loc, task = name[1:].split('-', 1) return task[0].upper() + loc if msol and visu.is_visu_enabled(): workers_function = CpoStepFunction() for v in all_tasks: itv = msol.get_var_solution(v) workers_function.add_value(itv.get_start(), itv.get_end(), 1) visu.timeline('Solution SchedState') visu.panel(name="Schedule") for v in all_tasks: visu.interval(msol.get_var_solution(v), house[v], compact(v.get_name())) visu.panel(name="Houses state") for f in all_state_functions: visu.sequence(name=f.get_name(), segments=msol.get_var_solution(f)) visu.panel(name="Nb of workers") visu.function(segments=workers_function, style='line') visu.show()
############################################################################## # Display result ############################################################################## def compact(name): # Example: H3-garden -> G3 # ^ ^ loc, task = name[1:].split('-', 1) return task[0].upper() + loc if msol and visu.is_visu_enabled(): workersF = CpoStepFunction() cashF = CpoStepFunction() for p in range(5): cashF.add_value(60 * p, INT_MAX, 30000) for task in all_tasks: itv = msol.get_var_solution(task) workersF.add_value(itv.get_start(), itv.get_end(), 1) cashF.add_value(itv.start, INT_MAX, -200 * desc[task].duration) visu.timeline('Solution SchedCumul') visu.panel(name="Schedule") for task in all_tasks: visu.interval(msol.get_var_solution(task), house[task], compact(task.get_name())) visu.panel(name="Workers") visu.function(segments=workersF, style='area') visu.panel(name="Cash") visu.function(segments=cashF, style='area', color='gold') visu.show()
############################################################################## # Solving ############################################################################## print("Solving model....") msol = mdl.solve() print("Solution: ") msol.print_solution() ############################################################################## # Display result ############################################################################## if msol and visu.is_visu_enabled(): visu.timeline("Solution SchedTime", origin=10, horizon=120) visu.panel("Schedule") for t in ALL_TASKS: visu.interval(msol.get_var_solution(tasks[t.id]), t.id, t.name) for t in ALL_TASKS: if t.release_date is not None: visu.panel('Earliness') itvsol = msol.get_var_solution(tasks[t.id]) cost = fearliness[t].get_value(itvsol.get_start()) visu.function(segments=[(itvsol, cost, t.name)], color=t.id, style='interval') visu.function(segments=fearliness[t], color=t.id) if t.due_date is not None: visu.panel('Tardiness') itvsol = msol.get_var_solution(tasks[t.id]) cost = ftardiness[t].get_value(itvsol.get_end()) visu.function(segments=[(itvsol, cost, t.name)], color=t.id, style='interval')
print("Solving model....") msol = mdl.solve() print("Solution: ") msol.print_solution() ############################################################################## # Display result ############################################################################## def compact(name): # Example: H3-garden -> G3 # ^ ^ loc, task = name[1:].split('-', 1) return task[0].upper() + loc if msol and visu.is_visu_enabled(): visu.timeline('Solution SchedCalendar') visu.panel() visu.pause(joe_calendar) visu.sequence(name='Joe', intervals=[(msol.get_var_solution(t), type[t], compact(t.name)) for t in joe_tasks]) visu.panel() visu.pause(jim_calendar) visu.sequence(name='Jim', intervals=[(msol.get_var_solution(t), type[t], compact(t.name)) for t in jim_tasks]) visu.show()
mdl.add(minimize(max([end_of(ITVS[i][j]) for i in range(nbJobs) for j in range(nbMchs)]))) ############################################################################## # Model solving ############################################################################## # Solve model print("Solving model....") msol = mdl.solve(FailLimit=10000) print("Solution: ") msol.print_solution() ############################################################################## # Display result ############################################################################## # Draw solution if msol and visu.is_visu_enabled(): visu.timeline("Solution for open-shop " + filename) visu.panel("Jobs") for i in range(nbJobs): visu.sequence(name='J' + str(i), intervals=[(msol.get_var_solution(ITVS[i][j]), j, 'M' + str(j)) for j in range(nbMchs)]) visu.panel("Machines") for j in range(nbMchs): visu.sequence(name='M' + str(j), intervals=[(msol.get_var_solution(ITVS[i][j]), j, 'J' + str(i)) for i in range(nbJobs)]) visu.show()
# mdl.export_as_cpo() # Solve model print("Solving model....") msol = mdl.solve() print("Solution: ") msol.print_solution() ############################################################################## # Display result ############################################################################## def compact(name): # Example: H3-garden -> G3 # ^ ^ loc, task = name[1:].split('-', 1) return task[0].upper() + loc if msol and visu.is_visu_enabled(): visu.timeline('Solution SchedCalendar') visu.panel() visu.pause(joe_calendar) visu.sequence(name='Joe', intervals=[(msol.get_var_solution(t), type[t], compact(t.name)) for t in joe_tasks]) visu.panel() visu.pause(jim_calendar) visu.sequence(name='Jim', intervals=[(msol.get_var_solution(t), type[t], compact(t.name)) for t in jim_tasks]) visu.show()
for j in range(nbMchs)]))) ############################################################################## # Model solving ############################################################################## # Solve model print("Solving model....") msol = mdl.solve(FailLimit=10000) print("Solution: ") msol.print_solution() ############################################################################## # Display result ############################################################################## # Draw solution if msol and visu.is_visu_enabled(): visu.timeline("Solution for open-shop " + filename) visu.panel("Jobs") for i in range(nbJobs): visu.sequence(name='J' + str(i), intervals=[(msol.get_var_solution(ITVS[i][j]), j, 'M' + str(j)) for j in range(nbMchs)]) visu.panel("Machines") for j in range(nbMchs): visu.sequence(name='M' + str(j), intervals=[(msol.get_var_solution(ITVS[i][j]), j, 'J' + str(i)) for i in range(nbJobs)]) visu.show()
# Solve model print("Solving model....") msol = mdl.solve(FailLimit=100000) print("Solution: ") msol.print_solution() ############################################################################## # Display result ############################################################################## if msol and visu.is_visu_enabled(): load = [CpoStepFunction() for j in range(nbResources)] for i in range(nbTasks): itv = msol.get_var_solution(tasks[i]) for j in range(nbResources): if 0 < demands[i][j]: load[j].add_value(itv.get_start(), itv.get_end(), demands[i][j]) visu.timeline("Solution for RCPSP " + filename) visu.panel("Tasks") for i in range(nbTasks): visu.interval(msol.get_var_solution(tasks[i]), i, tasks[i].get_name()) for j in range(nbResources): visu.panel("R " + str(j + 1)) visu.function(segments=[(INTERVAL_MIN, INTERVAL_MAX, capacities[j])], style='area', color='lightgrey') visu.function(segments=load[j], style='area', color=j) visu.show()
mdl.add(minimize(max([end_of(OPS[o[0]]) for o in ops]))) ############################################################################## # Model solving ############################################################################## # Solve model print("Solving model....") msol = mdl.solve(FailLimit=100000) print("Solution: ") msol.print_solution() ############################################################################## # Display result ############################################################################## # Draw solution if msol and visu.is_visu_enabled(): visu.timeline("Solution for flexible job-shop " + filename) visu.panel("Machines") for j in range(nb_mchs): visu.sequence(name='M' + str(j)) for v in MACHS[j]: itv = msol.get_var_solution(v) if itv.is_present(): job = Job[v.get_name()] visu.interval(itv, job, 'J' + str(job)) visu.show()
msol.print_solution() ############################################################################## # Display result ############################################################################## def compact(name): # Example: H3-garden -> G3 # ^ ^ loc, task = name[1:].split('-', 1) return task[0].upper() + loc # Draw solution if msol and visu.is_visu_enabled(): visu.timeline('Solution SchedOptional', 0, deadline) for w in range(nbWorkers): visu.sequence(name=workerNames[w]) for t in worker_tasks[w]: wt = msol.get_var_solution(t) if wt.is_present(): if desc[t].skills[w] == max(desc[t].skills): # Green-like color when task is using the most skilled worker color = 'lightgreen' else: # Red-like color when task does not use the most skilled worker color = 'salmon' visu.interval(wt, color, compact(wt.get_name())) visu.show()