Esempio n. 1
0
def principal(argv):
    INSTANCIAS = read_data_XLSX()

    num_alphas = 5
    ALPHAS = [round(i * (1 / num_alphas), 3) for i in range(num_alphas + 1)]
    print(ALPHAS)

    for a in ALPHAS:
        workbook = xlsxwriter.Workbook('Results_Tardiness ALPHA(' + str(a) +
                                       ').xlsx')
        ti = time.time()
        for inst in INSTANCIAS:
            ## Parámetros de la instancia
            tp = inst.tiempos_procesamiento
            dd = inst.due_dates
            num_trabajos = len(tp)
            num_maquinas = len(tp[0])

            ## Obtener secuencia de Grasp_Makespan
            ALPHA = a
            t_max = 0.01 * num_trabajos * num_maquinas
            repeticiones = 1
            minimo = 10000000000000
            print("AlPHA: ", a, "; Inst:", INSTANCIAS.index(inst))
            for _ in range(repeticiones):
                t1 = time.time()
                s, s_bl = GRASP_Tardiness(tp, dd, ALPHA, t_max)
                f = fo.calcular_tardanza_blocking_secuencia(s_bl, tp, dd)
                print(f)
                if (f < minimo):
                    minimo = f
                    secuencia = s
                    secuencia_bl = s_bl
                    tiempo_funcion = time.time() - t1

            print("----------------------------")

            ## Indicadores
            makespan = fo.calcular_makespan_blocking_secuencia(secuencia, tp)
            tardanza = fo.calcular_tardanza_blocking_secuencia(
                secuencia, tp, dd)
            makespan_bl, mat_t = fo.mat_calcular_makespan_blocking_secuencia(
                secuencia_bl, tp)
            tardanza_bl, dd_sec = fo.dd_calcular_tardanza_blocking_secuencia(
                secuencia_bl, tp, dd)

            ## Imprimir archivo
            nombre_hoja = "Inst" + str(INSTANCIAS.index(inst) + 1)
            imprimir_XLSX(workbook, nombre_hoja, secuencia, secuencia_bl,
                          makespan, tardanza, makespan_bl, tardanza_bl,
                          tiempo_funcion, mat_t, dd_sec)

        tt = time.time() - ti
        worksheet = workbook.add_worksheet("TIEMPO TOTAL")
        worksheet.merge_range(1, 1, 1, 3, "Tiempo total de ejecución")
        worksheet.merge_range(1, 4, 1, 5, round(tt, 2))
        workbook.close()
        workbook.close()
Esempio n. 2
0
def principal(argv):
    INSTANCIAS = read_data_XLSX()
    for inst in INSTANCIAS:
        workbook = xlsxwriter.Workbook('Results_Tardiness_MO Inst(' +
                                       str(INSTANCIAS.index(inst) + 1) +
                                       ').xlsx')

        print("\n============== Inst: ", INSTANCIAS.index(inst),
              " ===============")
        ## Parámetros de la instancia
        tp = inst.tiempos_procesamiento
        dd = inst.due_dates

        num_trabajos = len(
            tp)  ## Obtener número de trabajos y número de máquinas
        num_maquinas = len(tp[0])

        ## Obtener secuencia de Grasp_Makespan
        ALPHA = 0.4  ## No se está usando
        t_max = 1.5 * num_trabajos * num_maquinas
        ALPHA_make = 0.2
        t_max_make = 0.01 * num_trabajos * num_maquinas

        repeticiones = 3
        for rep in range(repeticiones):
            print("--- Rep: ", rep, " ---")
            t1 = time.time()
            secuencia, secuencia_bl, min_makespan = GRASP_Tardanza_MO(
                tp, dd, ALPHA, t_max, ALPHA_make, t_max_make)
            tiempo_funcion = time.time() - t1

            ## Indicadores
            makespan = fo.calcular_makespan_blocking_secuencia(secuencia, tp)
            tardanza = fo.calcular_tardanza_blocking_secuencia(
                secuencia, tp, dd)
            makespan_bl = fo.calcular_makespan_blocking_secuencia(
                secuencia_bl, tp)
            tardanza_bl = fo.calcular_tardanza_blocking_secuencia(
                secuencia_bl, tp, dd)

            ## Imprimir archivo
            nombre_hoja = "Inst" + str(INSTANCIAS.index(inst) +
                                       1) + "(REP" + str(rep + 1) + ")"
            imprimir_XLSX(workbook, nombre_hoja, secuencia, secuencia_bl,
                          makespan, tardanza, makespan_bl, tardanza_bl,
                          tiempo_funcion, min_makespan)

        workbook.close()
Esempio n. 3
0
def principal(argv):
    INSTANCIAS = read_data_XLSX()

    for inst in INSTANCIAS:
        ## Crear Archuvo de impresión
        workbook = xlsxwriter.Workbook('Results_Tardiness Inst(' +
                                       str(INSTANCIAS.index(inst) + 1) +
                                       ').xlsx')

        ## Parámetros de la instancia
        tp = inst.tiempos_procesamiento
        dd = inst.due_dates
        num_trabajos = len(tp)
        num_maquinas = len(tp[0])

        ## Obtener secuencia de Grasp_Makespan
        ALPHA = 0.5
        t_max = 0.01 * num_trabajos * num_maquinas
        repeticiones = 10
        print("Inst:", INSTANCIAS.index(inst))
        for rep in range(repeticiones):
            t1 = time.time()
            secuencia, secuencia_bl = GRASP_Tardiness(tp, dd, ALPHA, t_max)
            tiempo_funcion = time.time() - t1

            ## Indicadores
            makespan = fo.calcular_makespan_blocking_secuencia(secuencia, tp)
            tardanza = fo.calcular_tardanza_blocking_secuencia(
                secuencia, tp, dd)
            makespan_bl = fo.calcular_makespan_blocking_secuencia(
                secuencia_bl, tp)
            tardanza_bl = fo.calcular_tardanza_blocking_secuencia(
                secuencia_bl, tp, dd)

            ## Imprimir archivo
            nombre_hoja = "Inst" + str(INSTANCIAS.index(inst) +
                                       1) + "(REP" + str(rep + 1) + ")"
            imprimir_XLSX(workbook, nombre_hoja, secuencia, secuencia_bl,
                          makespan, tardanza, makespan_bl, tardanza_bl,
                          tiempo_funcion)

        workbook.close()
Esempio n. 4
0
def busqueda_local_GRASP(secuencia, TP, due_date, num_iteraciones):
    minimo = 100000000000
    for iteraciones in range(num_iteraciones):
        for i in range(len(secuencia)):
            for j in range(i + 1, len(secuencia)):
                s = copy.deepcopy(secuencia)
                aux = s[i]
                s[i] = s[j]
                s[j] = aux
                #print(s, calcular_makespan_blocking_secuencia(s,TP))

                f = fo.calcular_tardanza_blocking_secuencia(s, TP, due_date)
                if (f < minimo):
                    minimo = f
                    secuencia_aux = s

        secuencia = copy.deepcopy(secuencia_aux)
        #print(minimo, secuencia_aux)

    return (secuencia,
            fo.calcular_tardanza_blocking_secuencia(secuencia, TP, due_date))
Esempio n. 5
0
def busqueda_local_GRASP(secuencia, TP, due_date, t_max):
    minimo = fo.calcular_tardanza_blocking_secuencia(secuencia, TP, due_date)
    num_trabajos = len(TP)
    i = 0
    j = 1
    iteraciones = 0
    t_inicial = time.time()
    t_final = time.time() - t_inicial

    while (i < num_trabajos - 1 and t_final <= t_max):
        # print("\n============== ITERACIÓN ", iteraciones," ===============")
        s = copy.deepcopy(secuencia)
        aux = s[i]
        s[i] = s[j]
        s[j] = aux
        # print("Secuencia actual: ", secuencia)
        # print(s, fo.calcular_tardanza_blocking_secuencia(s,TP, due_date))
        # print(i,j)
        # print(t_max)

        f = fo.calcular_tardanza_blocking_secuencia(s, TP, due_date)
        if (f < minimo):
            minimo = f
            secuencia = s
            i = 0
            j = 1
        else:
            if (j < num_trabajos - 1):
                j = j + 1
            elif (i < num_trabajos - 1):
                i = i + 1
                j = i + 1
            else:
                i = i + 1

        iteraciones += 1
        t_final = time.time() - t_inicial
    #elihw
    return (secuencia,
            fo.calcular_tardanza_blocking_secuencia(secuencia, TP, due_date))
def busqueda_local_GRASP(secuencia, TP, due_date, num_iteraciones):
    minimo = fo.calcular_tardanza_blocking_secuencia(secuencia, TP, due_date)
    num_trabajos = len(TP)
    i = 0
    j = 1
    iteraciones = 0
    while (i < num_trabajos - 1 and iteraciones <= num_iteraciones):
        # print("\n============== ITERACIÓN ", iteraciones," ===============")
        s = copy.deepcopy(secuencia)
        aux = s[i]
        s[i] = s[j]
        s[j] = aux
        #print(s, calcular_makespan_blocking_secuencia(s,TP))
        # print(i,j)

        f = fo.calcular_tardanza_blocking_secuencia(s, TP, due_date)
        # print("Secuencia actual: ", secuencia)
        # print(s, f)
        if (f < minimo):
            minimo = f
            secuencia = s
            i = 0
            j = 1
        else:
            if (j < num_trabajos - 1):
                j = j + 1
            elif (i < num_trabajos - 1):
                i = i + 1
                j = i + 1
            else:
                i = i + 1

        iteraciones += 1
    #elihw
    return (secuencia,
            fo.calcular_tardanza_blocking_secuencia(secuencia, TP, due_date))
def construccion_GRASP(TP, due_date, ALPHA):

    ## Número de trabajos
    num_trabajos = len(TP)

    solucion = []  ## Secuencia final que será retornada
    solucion_TP = [
    ]  ## Tiempos de procesamiento de cada elemento que se guarde en solucion

    ## Conjunto de candidatos a ser seleccionados. Si se selecciona un candidato se removerá de candidatos
    ## y se agregará al conjunto solución. Inicialmente en candidatos estarán todos los trabajos i.e.
    ## candidatos = {1,...,num_trabajos}
    candidatos = [i for i in range(1, num_trabajos + 1)]
    t = 0  ## Parámetro para mdd

    ## Pj: parámetro usado en mdd. Suma para cada trabajo el tiempo de procesamiento de cada máquina
    P = []
    for i in range(num_trabajos):
        P.append(sum(TP[i]))

    # print("P: ", P, "Due date: ", due_date)

    ## El siguiente ciclo selecciona en cada iteración un posible trabajo para agregarlo a la solución
    ## Paso 1: Determinar conjunto de mdd para cada trabajo candidato, el mínimo de los mdd = min_mdd
    ##         y el máximo de los mdd = max_mdd
    ## Paso 2: Determinar conjunto RCL = {c in candidatos: makespan(c) < indicador}; indicador = min_mp + ALPHA * ( max_mp - min_mp )
    ## Paso 3: Seleccionar aleatoriamente un trabajo del RCL
    ## Paso 4: Agregrar el trabajo escogido a solución, agregar los tiempos de procesamiento del trabajo
    ## escogido a solucion_TP y remover el elemento de candidatos
    for it in range(num_trabajos):
        MMD = [
        ]  ## conjunto donde se almacenará el MMD de cada trabajo candidato
        min_mdd = 100000000000  ## variable que guardará el mínimo de los makespan
        max_mdd = 0  ## variable que guardará el máximo de los makespan

        ## Paso1
        for candidato in candidatos:
            y = max(P[candidato - 1], due_date[candidato - 1] - t)
            MMD.append(y)
            ## Determinar mínimo makespan
            if (y < min_mdd):
                min_mdd = y

            ## Determinar máximo makespan
            if (y > max_mdd):
                max_mdd = y

        # print("====== Iteración ", it + 1," ======")
        # print("Candidatos: ", candidatos, "MMD: ", MMD, "Min: ", min_mdd, "Max: ", max_mdd)

        ## Paso2: Determinar RCL
        indicador = min_mdd + ALPHA * (max_mdd - min_mdd)
        RCL = []
        trabajo = 0
        for m in MMD:
            if (m <= indicador):  ## Si el makespan es menor que el indicador
                RCL.append(candidatos[trabajo])  ## guardar el trabajo en RCL

            trabajo += 1

        # print("RCL: ", RCL,"... Menor que: ", indicador)

        ## Paso 3: seleccionar aleatoriamente un trabajo del RCL
        pos = random.randint(
            1, len(RCL)
        )  ## Obtener una posicion aleatoria del RCL(funcion aleatorio entre arriba)
        seleccion = RCL[pos - 1]  ## Obtener un trabajo del RCL
        # print("Seleccionado: ", seleccion)

        ## Paso 4
        solucion.append(seleccion)  ## Agregrar el trabajo escogido a solución
        candidatos.remove(
            seleccion
        )  ## escogido a solucion_TP y remover el elemento de candidatos
        solucion_TP.append(
            TP[seleccion - 1]
        )  ## agregar los tiempos de procesamiento del trabajo escogido a solucion_TP
        t = fo.calcular_makespan_blocking(solucion_TP)
        # print("Solucion: ", solucion, "Candidatos: ", candidatos)
        # print("t: ", t)

    return (solucion,
            fo.calcular_tardanza_blocking_secuencia(solucion, TP, due_date))
Esempio n. 8
0
def imprimir_XLSX(workbook, nombre_hoja, secuencia, secuencia_bl, makespan,
                  make_mat_i, make_mat_f, tardanza, due_date_sec, tp, dd):
    worksheet = workbook.add_worksheet(nombre_hoja)

    worksheet.set_column(1, 1, 9.5)

    cell_format_bold = workbook.add_format({
        'bold': 1,
        'align': 'center',
        'valign': 'vcenter'
    })
    cell_format = workbook.add_format({'align': 'center'})

    worksheet.merge_range("B2:D2", "FASE DE CONSTRUCCIÓN", cell_format_bold)
    worksheet.write("B3", "Secuencia", cell_format_bold)

    row = 2
    col = 2
    for s in secuencia:
        worksheet.write(row, col, s, cell_format)
        col += 1

    worksheet.write("B4", "Tardanza", cell_format_bold)
    worksheet.write(
        "C4", fo_aux.calcular_tardanza_blocking_secuencia(secuencia, tp, dd),
        cell_format)

    worksheet.write("B5", "Makespan", cell_format_bold)
    worksheet.write("C5",
                    fo_aux.calcular_makespan_blocking_secuencia(secuencia, tp),
                    cell_format)

    worksheet.merge_range("B7:D7", "FASE DE BUSQUEDA LOCAL", cell_format_bold)
    worksheet.write("B8", "Secuencia", cell_format_bold)

    row = 7
    col = 2
    for s in secuencia_bl:
        worksheet.write(row, col, s, cell_format)
        col += 1

    worksheet.write("B9", "Tardanza", cell_format_bold)
    worksheet.write("C9", tardanza, cell_format)

    worksheet.write("B10", "Makespan", cell_format_bold)
    worksheet.write("C10", makespan, cell_format)

    row = 11
    col = 1
    worksheet.merge_range(row, col, row, col + 4, "Matriz Tiempos Inicio",
                          cell_format_bold)
    worksheet.merge_range(row, col + len(make_mat_i[0]) + 1, row,
                          col + len(make_mat_i[0]) + 5,
                          "Matriz Tiempos Finales", cell_format_bold)
    worksheet.merge_range(row, col + 2 * len(make_mat_i[0]) + 2, row,
                          col + 2 * len(make_mat_i[0]) + 3, "Due Dates(SEC)",
                          cell_format_bold)

    row += 1
    for i in range(len(make_mat_i)):
        col = 1
        col2 = 2 + len(make_mat_i[i])
        for j in range(len(make_mat_i[i])):
            worksheet.write(row, col, make_mat_i[i][j], cell_format)
            col += 1

            worksheet.write(row, col2, make_mat_f[i][j], cell_format)
            col2 += 1

        worksheet.merge_range(row, col2 + 1, row, col2 + 2, due_date_sec[i],
                              cell_format)
        row += 1