Example #1
0
def domina(s1, s2, TP, due_date):
    fo1_s1 = fo.calcular_makespan_blocking_secuencia(s1, TP)
    fo2_s1 = fo.calcular_tardanza_blocking_secuencia(s1, TP, due_date)
    fo1_s2 = fo.calcular_makespan_blocking_secuencia(s2, TP)
    fo2_s2 = fo.calcular_tardanza_blocking_secuencia(s2, TP, due_date)
    #print("x: ", fo1_x, fo2_x, "; y: ", fo1_y, fo2_y)
    s1_domina_s2 = False
    if ((fo1_s1 <= fo1_s2 and fo2_s1 < fo2_s2)
            or (fo1_s1 < fo1_s2 and fo2_s1 <= fo2_s2)):
        s1_domina_s2 = True

    return s1_domina_s2
Example #2
0
def repeticion_m(archivo_paes, m, TP, due_date):
    makespan_m = fo.calcular_makespan_blocking_secuencia(m, TP)
    tardanza_m = fo.calcular_tardanza_blocking_secuencia(m, TP, due_date)
    b1 = False
    b2 = False
    for a in archivo_paes:
        if (a.secuencia == m):
            b1 = True

        if (a.makespan == makespan_m and a.tardanza == tardanza_m):
            b2 = True

    if (b1 == False and b2 == False):
        return (False)
    else:
        return (True)
Example #3
0
def PAES(TP, due_date, num_iteraciones):

    ## Obtener número de trabajos
    num_trabajos = len(TP)

    ## Crear Archivo PAES vacío inicialmente. Crear c como una solución aleatoria.
    ## Calcular Makespan y Tardanza de c. Agregar c al archivo
    archivo_paes = []
    c = solucion_aleatoria(num_trabajos)
    makespan_c = fo.calcular_makespan_blocking_secuencia(c, TP)
    tardanza_c = fo.calcular_tardanza_blocking_secuencia(c, TP, due_date)
    archivo_paes.append(Solucion(c, makespan_c, tardanza_c))
    print("Solución inicial: ", c)

    ## Inicializar posiciones de las que se harán el cambio. Inicializar iteraciones
    i = 0
    j = 1
    iteraciones = 1

    ## Mientras que se hagan todos los posibles cambios dos a dos en una solución actual
    ## o sigan habiendo iteraciones
    while (i < num_trabajos - 1 and iteraciones <= num_iteraciones):
        print("\n============== ITERACIÓN ", iteraciones, " ===============")
        ## Obtener una mutación de c y guardar en m. La mutación se realiza cambiando
        ## la posición i con j en c
        m = mutar(c, i, j)
        print("c: ", c, " ; m: ", m, "pos1: ", i, "pos2: ", j)

        ## Ya está m en el archivo?
        ## Si m está en el archivo, entonces descartar.
        ## Si m tiene las mismas funciones objetivos que otro elemento del archivo, entonces descartar
        esta_m_Archivo_PAES = repeticion_m(archivo_paes, m, TP, due_date)
        if (esta_m_Archivo_PAES == True):
            print(
                "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
            )
            m_domina_c = False
            pass
        else:
            ## Calcular si c domina a m
            ## Calcular si m domina a c
            ## Calcular si algún elemento del archivo domina a m
            c_domina_m = domina(c, m, TP, due_date)
            m_domina_c = domina(m, c, TP, due_date)
            arch_domina_m = False
            for x in archivo_paes:
                d = domina(x.secuencia, m, TP, due_date)
                if (d == True):
                    arch_domina_m = True

            print("c domina a m?: ", c_domina_m, " ; m domina a c?: ",
                  m_domina_c, " ; el archivo domina a m?: ", arch_domina_m)

            ## Primera condición: si c domina a m, se descarta m
            ## Segunda condición: si m domina a c, se agrega m al archivo y se eleimina todos los elementos a los que también domina m
            ## Tercera condición: si alguún elemento del archivo domina a m, se descarta m.
            ## Cuarta condición: se agraga m al archivo y se revisa si m es menos concurrido que c
            if (c_domina_m == True):  ## Primera condición
                pass
            elif (m_domina_c == True):  ## Segunda condición
                makespan_m = fo.calcular_makespan_blocking_secuencia(m, TP)
                tardanza_m = fo.calcular_tardanza_blocking_secuencia(
                    m, TP, due_date)
                archivo_paes.append(Solucion(m, makespan_m, tardanza_m))
                archivo_paes = Dominancia(archivo_paes, TP, due_date)
                c = m
                i = 0
                j = 1
            elif (arch_domina_m == True):  ## Tercera condición
                pass
            else:  ## Cuarta condición
                makespan_m = fo.calcular_makespan_blocking_secuencia(m, TP)
                tardanza_m = fo.calcular_tardanza_blocking_secuencia(
                    m, TP, due_date)
                archivo_paes.append(Solucion(m, makespan_m, tardanza_m))
                archivo_paes = Dominancia(archivo_paes, TP, due_date)

                ## Si m es menos concurrido que c, se convierte en la nueva solución
                conc = concurrido(archivo_paes, c, m)
                if (conc == True):
                    print("m es la solucion actual")
                    c = m
                    i = 0
                    j = 1

        print("------------ Archivo Paes -------------")
        print(np.array(archivo_paes))

        iteraciones += 1
        if (m_domina_c != True or esta_m_Archivo_PAES == True):
            if (j < num_trabajos - 1):
                j = j + 1
            elif (i < num_trabajos - 1):
                i = i + 1
                j = i + 1
            else:
                i = i + 1

    #elihw

    ## Gráficar archivo PAES final
    Graficar_Archivo(archivo_paes)

    return (archivo_paes)