Пример #1
0
def construccion_GRASP(TP, 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)]

    ## El siguiente ciclo selecciona en cada iteración un posible trabajo para agregarlo a la solución
    ## Paso 1: Determinar conjunto de makespan para cada trabajo candidato = makespan_candidatos, y obtener porcentaje de cada uno
    ## Paso 2: Ordenar conjunto makespan_candidatos de menor a mayor. Con el mismo criterio ordenar el conjunto de candidatos
    ## Paso 3: Determinar el conjuntos de porcentajes de escogencia de cada makespan
    ## Paso 4: Determinar conjunto RCL = {c in candidatos: pocentajes(c) < ALPHA}; Si no queda ninguno escoger el de menor makespan
    ## Paso 5: Seleccionar aleatoriamente un trabajo del RCL
    ## Paso 6: 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 _ in range(num_trabajos):

        ## Paso1: obtener de los makespan de los candidatos
        makespan_candidatos = [
        ]  ## conjunto donde se almacenará el makespan de cada trabajo candidato
        suma_makespan = 0
        for candidato in candidatos:
            s = copy.deepcopy(
                solucion_TP
            )  ## Crear una copia de los tiempos de procesamiento de la solucion actual
            s.append(
                TP[candidato - 1]
            )  ## Agregar los tiempos de un posible candidato a la copia creada
            m = fo.calcular_makespan_blocking(
                s)  ## Calcular el makespan de ese candidato
            makespan_candidatos.append(m)  ## Guardar el makespan
            suma_makespan += m

        ## Paso 2: ordenar conjunto makespan_candidatos
        for i in range(len(makespan_candidatos)):
            for j in range(len(makespan_candidatos)):
                if (makespan_candidatos[j] > makespan_candidatos[i]):
                    aux = makespan_candidatos[j]
                    makespan_candidatos[j] = makespan_candidatos[i]
                    makespan_candidatos[i] = aux

                    aux = candidatos[j]
                    candidatos[j] = candidatos[i]
                    candidatos[i] = aux

        print(candidatos, makespan_candidatos)

        ## Paso 3: Determinar el porcentaje para la escogencia
        # porcentajes = [ (i+1)*(1/(len(candidatos))) for i in range(len(candidatos)) ]
        # porcentajes = [ (makespan_candidatos[i])/(suma_makespan) for i in range(len(makespan_candidatos)) ]
        porcentajes = []
        for i in range(len(makespan_candidatos)):
            acum = 0
            for j in range(i + 1):
                acum += (makespan_candidatos[j]) / (suma_makespan)

            porcentajes.append(acum)

        print(porcentajes)

        ## Paso4: Determinar RCL
        RCL = []
        for i in range(len(makespan_candidatos)):
            if (porcentajes[i] <=
                    ALPHA):  ## Si el makespan es menor que el ALPHA
                RCL.append(candidatos[i])  ## guardar el trabajo en RCL

        ## Si el RCL queda vacío no asignar a nadie
        if (len(RCL) == 0):
            RCL.append(candidatos[0])

        #print(RCL)

        ## Paso 5: 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

        ## Paso 6
        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

    return (solucion, fo.calcular_makespan_blocking(solucion_TP))
Пример #2
0
def construccion_GRASP(TP, 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)]

    ## El siguiente ciclo selecciona en cada iteración un posible trabajo para agregarlo a la solución
    ## Paso 1: Determinar conjunto de makespan para cada trabajo candidato, el mínimo de los makespan = min_mp
    ##         y el máximo de los makespan = max_mp
    ## 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):
        makespan_candidatos = [
        ]  ## conjunto donde se almacenará el makespan de cada trabajo candidato
        min_mp = 100000000000  ## variable que guardará el mínimo de los makespan
        max_mp = 0  ## variable que guardará el máximo de los makespan

        ## Paso1
        for candidato in candidatos:
            s = copy.deepcopy(
                solucion_TP
            )  ## Crear una copia de los tiempos de procesamiento de la solucion actual
            s.append(
                TP[candidato - 1]
            )  ## Agregar los tiempos de un posible candidato a la copia creada
            m = fo.calcular_makespan_blocking(
                s)  ## Calcular el makespan de ese candidato
            makespan_candidatos.append(m)  ## Guardar el makespan

            ## Determinar mínimo makespan
            if (m < min_mp):
                min_mp = m

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

        # print("====== Iteración ", it + 1," ======")
        # print("Candidatos: ", candidatos, "Cmax: ", makespan_candidatos, "Min: ", min_mp, "Max: ", max_mp)

        ## Paso2: Determinar RCL
        indicador = min_mp + ALPHA * (max_mp - min_mp)
        RCL = []
        trabajo = 0
        for m in makespan_candidatos:
            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
        # print("Solucion: ", solucion, "Candidatos: ", candidatos)

    return (solucion, fo.calcular_makespan_blocking(solucion_TP))