Beispiel #1
0
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)
Beispiel #2
0
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)