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))
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))