def ATCS_APD(jobs: list, machines: list, setup_times: list, tao: float = 0.5, R: float = 0.8): """ ATCS_APD mette insieme l'ATCS index e l'APD, dato che APD tiene conto in maniera più precisa dei setup times Args: jobs (list): [description] machines (list): [description] setup_times (list): [description] tao (float, optional): [description]. Defaults to 0.5. R (float, optional): [description]. Defaults to 0.8. """ # calcolo s come media dei setup times # calcolo p come media dei processing times s = Spec.get_setup_time_avg(setup_times) p = Job.get_processing_time_avg(jobs) # calcolo parametri di ATCS K1 = 1.2 * np.log(len(jobs) / len(machines)) - R #if tao<0.5 or (nano<0.5 and micro>0.5): if tao < 0.5: K1 -= 0.5 A2 = 1.8 if tao < 0.8 else 2.0 K2 = tao / (A2 * math.sqrt(s / p)) wi = 1 U = deepcopy(jobs) print_schedule_d(machines, 2) # step 0 - Calcolo l'APD per ogni job e setto t=0 apds = APD(U, setup_times) t = 0 # Step 1 - Prendo la macchina libera al tempo t, poi # Per ogni job non schedulato: # a. Calcolo l'ATCS_APD index # b. Assegno alla macchina selezionata il job con ATCS_APD index maggiore # c. Imposto t come il loading machine print_d("Index APD_ATCS:", 3) while U: I_i = dict() # prendo la macchina libera al tempo t k = Machine.free_machine_at_t(machines, t) # job_j è l'ultimo job processato dalla macchina selezionata. Serve per il setup time job_j = k._jobs[-1] if k._jobs else None # a. calcolo l'ATCS_APD index for job_u in U: apd_i = apds[job_u] I_i[job_u] = ((wi / job_u._processing_time) * math.exp( -max(job_u._due_date - job_u._processing_time - t, 0) / (K1 * p)) * math.exp(-Job.get_setup_time(job_j, job_u) / (K2 * s)) * math.exp(-1 / (apd_i * s))) I_i = dict(sorted(I_i.items(), key=lambda item: item[1], reverse=True)) # b. assegno alla macchina il job con index maggiore alla macchina for j in I_i: # c. imposto il tempo t al loading time t = k.get_free_time() + Job.get_setup_time(job_j, j) print_d(j, 3) k._jobs.append(j) U.remove(j) break print_d("Scheduling APD_ATCS:", 3) print_schedule_d(machines, 3)
def ATCS(jobs, machines, setup_times, tao=0.9, R=0.2): """ Calcola l'ATCS index, che tiene conto dei setup times, oltre che il processing time ed il due date Args: jobs (list): [description] machines (list): [description] setup_times (list): [description] tao (float, optional): [description]. Defaults to 0.5. R (float, optional): [description]. Defaults to 0.8. """ # calcolo s come media dei setup times # calcolo p come media dei processing times s = Spec.get_setup_time_avg(setup_times) p = Job.get_processing_time_avg(jobs) # calcolo parametri di ATCS K1 = 1.2 * np.log(len(jobs) / len(machines)) - R #if tao<0.5 or (nano<0.5 and micro>0.5): if tao < 0.5: K1 -= 0.5 A2 = 1.8 if tao < 0.8 else 2.0 K2 = tao / (A2 * math.sqrt(s / p)) wi = 1 U = deepcopy(jobs) print_schedule_d(machines, 2) # Step 1 - Prendo la macchina libera al tempo t, poi # Per ogni job non schedulato: # a. Calcolo l'ATCS index # b. Assegno alla macchina selezionata il job con ATCS_APD index maggiore print_d("Index ATCS:", 2) while U: I_i = dict() # prendo la macchina libera al tempo t k = Machine.first_machine_avaible(machines) # job_j è l'ultimo job processato dalla macchina selezionata. Serve per il setup time job_j = k._jobs[-1] if k._jobs else None # a. calcolo l'ATCS index for job_u in U: tmp_machine = deepcopy(k) tmp_machine._jobs.append(job_u) t = tmp_machine.get_free_time() I_i[job_u] = ((wi / job_u._processing_time) * math.exp( -max(job_u._due_date - job_u._processing_time - t, 0) / (K1 * p)) * math.exp(-Job.get_setup_time(job_j, job_u) / (K2 * s))) I_i = dict(sorted(I_i.items(), key=lambda item: item[1], reverse=True)) # b. assegno alla macchina il job con index maggiore alla macchina for j in I_i: print_d(j, 2) k._jobs.append(j) U.remove(j) break print_d("Scheduling ATCS:", 2) print_schedule_d(machines, 2)