示例#1
0
文件: Meta.py 项目: felagos/Puentes
    def Metaheuristic(self, modelo):
        '''***INICIALIZACIÓN POBLACIÓN***'''
        self.poblacionInicial(
            modelo)  # SE CREAN LA POBLACIÓN INICIAL (ORDEN Y MAGNITUDES).
        solutions = self.solutions  # SE GUARDAN LA POBLACIÓN CREADA EN solutions.
        N = len(solutions)  # N DEFINE EL NUMERO DE NIDOS.

        #Utilizaremos el arreglo Nido para de tamaño 7 en el caso particular de esta MH ya que ordenaremos los resultados en función al fitness
        Nidos = [
            np.zeros(7) for x in range(self.poblacion)
        ]  #SE CREAN LOS Población + Iteración NIDOS EN DONDE ESTARAN EL ORDEN(0,1,2), LAS MAGNITUDES(3,4,5), Y EL REGISTRO DE FITNESS(6).
        for w in range(
                0, N
        ):  #SE RELLENA EL NIDO CON EL ORDEN Y LAS MAGNITUDES DE LAS solutions CREADAS.
            mag2 = solutions[w].magnitud
            orden2 = solutions[w].orden
            for e in range(3):
                Nidos[w][e] = orden2[e]
                Nidos[w][e + 3] = mag2[e]

        #CARGA DEL PUENTE MODIFICADO A SAP2000.
        modelo.cerrarSap2000(
        )  #Cerrar SAP2000 el cual contenia el Puente Original
        modelo.abrirSAP()

        Registro = open("Registro.txt", "w")  #CREA EL ARCHIVO DE REGISTRO

        cont1 = 0  #Inicializamos contador del While para generar población inicial

        #Evaluamos la población
        while cont1 < self.poblacion:  # Se genera la población.
            star_time = time.time(
            )  #Iniciamos variable para registrar tiempo en cada iteración
            Registro.write("CALCULO POBLACIÓN:" + "," + str(cont1) +
                           ",")  #Registro para el .txt
            print("***POBLACIÓN***:  " +
                  str(cont1))  #Mostramos en consola en la iteración a ejecutar
            modelo.cargarPuenteModificado()  #Cargamos Puente Modificado
            modelo.aplicarTesado([solutions[cont1]
                                  ])  # SE APLICA TESADO A LA solution i
            Nidos[cont1][6] = solutions[cont1].calcularFitness(
                modelo)  #GUARDO EL VALOR DE FITNESS DE solution i  EN NIDOS i
            if Nidos[cont1][6] == -1:
                self.regenerarSolution(modelo, solutions, cont1)
                cont1 = cont1 - 1
                continue
            '''REMUEVO Y CAMBIO ARCHIVOS CORRESPONDIENTES PARA EVITAR TIEMPOS DE CALCULOS EXPONENCIALES'''
            os.remove('C:\Puentes\Modificado\PuenteMod.Y08')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y09')
            os.remove('C:\Puentes\Modificado\PuenteMod.msh')
            os.remove('C:\Puentes\Modificado\PuenteMod.K~0')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y~')

            os.remove('C:\Puentes\Modificado\PuenteMod.Y')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y00')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y03')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y07')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y05')

            os.remove('C:\Puentes\Modificado\PuenteMod.Y06')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y04')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y01')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y02')
            os.remove('C:\Puentes\Modificado\PuenteMod.K~J')

            os.remove('C:\Puentes\Modificado\PuenteMod.K~M')
            os.remove('C:\Puentes\Modificado\PuenteMod.K~I')
            os.remove('C:\Puentes\Modificado\PuenteMod.y~2')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y$$')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y~1')

            os.remove('C:\Puentes\Modificado\PuenteMod.log')
            os.remove('C:\Puentes\Modificado\PuenteMod.$2K')
            os.remove('C:\Puentes\Modificado\PuenteMod.OUT')

            #os.remove('C:\Puentes\Modificado\PuenteMod.ico')

            #shutil.copyfile('C:\Puentes\Modificado2\PuenteMod.sdb','C:\Puentes\Modificado\PuenteMod.sdb')
            '''GUARDO LA INFORMACIÓN OBTENIDA EN "Registro.txt"'''
            Registro.write("ITERACION:" + "," + str(cont1) + ",")
            Registro.write("P1" + "," + str(Nidos[cont1][0]) + ",")
            Registro.write("P2" + "," + str(Nidos[cont1][1]) + ",")
            Registro.write("P3" + "," + str(Nidos[cont1][2]) + ",")
            Registro.write("T1" + "," + str(Nidos[cont1][3]) + ",")
            Registro.write("T2" + "," + str(Nidos[cont1][4]) + ",")
            Registro.write("T3" + "," + str(Nidos[cont1][5]) + ",")
            Registro.write("FIT" + "," + str(Nidos[cont1][6]) + ",")

            tiempototaliteracion = time.time(
            ) - star_time  #Registro de tiempo por calculo de cada individuo de la población
            print(
                'EL TIEMPO DE POBLACIÓN ' + str(cont1) + ' FUE: ' +
                str(tiempototaliteracion)
            )  #Mostramos Tiempo del calculo de cada individuo de la población
            Registro.write(
                "Tiempo de Población" + "," + str(tiempototaliteracion) + ",\n"
            )  #Guardamos en el .txt del tiempo por calculo de cada individuo de la población

            cont1 = cont1 + 1

        #Iniciamos variables a utilizar
        maglevy = [0, 0, 0]
        mag = [0, 0, 0]
        orden = [0, 0, 0]

        cont2 = 0
        '''LOOP ALGORITMO'''
        while cont2 < self.iteraciones:  # SE REPITE EN FUNCIÓN A LA CANTIDAD DE ITERACIONES.
            star_time = time.time()  #Registro de tiempo
            modelo.cargarPuenteModificado()
            NidoJ = randint(0, (N - 1))
            '''Se crea un Nido con el vuelo de levy'''

            alfa = DATOS_MH["Alpha"]  #Obtenemos parametro Alfa
            npend = DATOS_TESADO["NumPendolas"]  #Obtenemod Numero de pendolas
            min = modelo.tesadoMinimo  #Obtenemos tensión minima

            #Obtenemos orden del mejor nido
            x = int(Nidos[NidoJ][0])
            y = int(Nidos[NidoJ][1])
            z = int(Nidos[NidoJ][2])
            orden = [x, y, z]

            #Se crean magnitudes con vuelo levy
            for j in range(3):
                mag[j] = Nidos[NidoJ][j + 3]

            #Agregamos el Vuelo de Levy
            for j in range(3):
                maglevy[j] = alfa * (math.pow(mag[j], -1.00 / uniform(
                    1.000, 3.000)))  #Generamos el vuelo de Levy
                mag[j] = mag[j] + maglevy[j]  # Sumamos el Vuelo de Levy

                if mag[j] > modelo.tesadoMaximo[
                        j]:  #Si la nueva mag es mayor al max, utilizamos la minima
                    mag[j] = min

            #Guardamos los datos en solution
            solution = Solution(orden, mag)

            modelo.aplicarTesado([
                solution
            ])  #Se aplica tensión en la nueva solution con vuelo de Levy
            NidoLevy = solution.calcularFitness(
                modelo)  #GUARDO EL VALOR DE FITNESS DE solution i  EN NIDOS i

            if NidoLevy == -1:
                cont2 = cont2 - 1
                continue
            '''REMUEVO Y CAMBIO ARCHIVOS CORRESPONDIENTES PARA EVITAR TIEMPOS DE CALCULOS EXPONENCIALES'''
            os.remove('C:\Puentes\Modificado\PuenteMod.Y08')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y09')
            os.remove('C:\Puentes\Modificado\PuenteMod.msh')
            os.remove('C:\Puentes\Modificado\PuenteMod.K~0')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y~')

            os.remove('C:\Puentes\Modificado\PuenteMod.Y')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y00')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y03')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y07')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y05')

            os.remove('C:\Puentes\Modificado\PuenteMod.Y06')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y04')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y01')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y02')
            os.remove('C:\Puentes\Modificado\PuenteMod.K~J')

            os.remove('C:\Puentes\Modificado\PuenteMod.K~M')
            os.remove('C:\Puentes\Modificado\PuenteMod.K~I')
            os.remove('C:\Puentes\Modificado\PuenteMod.y~2')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y$$')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y~1')

            os.remove('C:\Puentes\Modificado\PuenteMod.log')
            os.remove('C:\Puentes\Modificado\PuenteMod.$2K')
            os.remove('C:\Puentes\Modificado\PuenteMod.OUT')

            #os.remove('C:\Puentes\Modificado\PuenteMod.ico')

            #shutil.copyfile('C:\Puentes\Modificado2\PuenteMod.sdb','C:\Puentes\Modificado\PuenteMod.sdb')

            #Mostramos en pantalla la iteraciónpor ejecutar
            print("***ITERACION***:  " + str(cont2))

            #Comparar NidoLevy con el mejor nido
            if NidoLevy < Nidos[NidoJ][
                    6]:  #Si el NidoLevy tiene una solución de mejor calidad, reemplaza el mejor Nido
                #Reemplazamos la mejor solución
                for j in range(3):
                    Nidos[NidoJ][j] = orden[j]
                    Nidos[NidoJ][j + 3] = mag[j]
                Nidos[NidoJ][6] = NidoLevy
                print("SI REEMPLAZAMOS EL NIDO J"
                      )  #Mostramos en consola si se ejecuta la mejora

            #Ordenamos la Población de menos a mayor
            Nidos = sorted(Nidos, key=lambda x: x[6], reverse=False)

            #Eliminar la peor Pa de población
            Pa = int(DATOS_MH["Pa"])
            print('SE REEMPLAZARAN LOS PEORES ' + str(Pa) + ' DE LOS NIDOS')

            Pb = (
                self.poblacion - Pa
            )  #Numero de nidos que no se van a borrar que no se van a eliminar

            for m in range(Pb, self.poblacion):
                '''GENERAR NIDOS NUEVOS EN solution'''
                mag = [0, 0, 0]
                for j in range(3):
                    mag[j] = random.uniform(min, modelo.tesadoMaximo[j])
                #Se crean orden por permutaciones
                z = randint(0, npend - 1)
                orden = self.permutaciones[z]
                #Generamos Solution
                solution = Solution(orden, mag)

                modelo.cargarPuenteModificado()
                #Aplicamos tesado en función a Solution
                modelo.aplicarTesado([solution])

                #Reemplazamos la Pa Solutions en los Nidos

                for t in range(3):
                    Nidos[m][t] = orden[t]
                    Nidos[m][t + 3] = mag[t]
                Nidos[m][6] = solution.calcularFitness(modelo)
                '''REMUEVO Y CAMBIO ARCHIVOS CORRESPONDIENTES PARA EVITAR TIEMPOS DE CALCULOS EXPONENCIALES'''
                os.remove('C:\Puentes\Modificado\PuenteMod.Y08')
                os.remove('C:\Puentes\Modificado\PuenteMod.Y09')
                os.remove('C:\Puentes\Modificado\PuenteMod.msh')
                os.remove('C:\Puentes\Modificado\PuenteMod.K~0')
                os.remove('C:\Puentes\Modificado\PuenteMod.Y~')

                os.remove('C:\Puentes\Modificado\PuenteMod.Y')
                os.remove('C:\Puentes\Modificado\PuenteMod.Y00')
                os.remove('C:\Puentes\Modificado\PuenteMod.Y03')
                os.remove('C:\Puentes\Modificado\PuenteMod.Y07')
                os.remove('C:\Puentes\Modificado\PuenteMod.Y05')

                os.remove('C:\Puentes\Modificado\PuenteMod.Y06')
                os.remove('C:\Puentes\Modificado\PuenteMod.Y04')
                os.remove('C:\Puentes\Modificado\PuenteMod.Y01')
                os.remove('C:\Puentes\Modificado\PuenteMod.Y02')
                os.remove('C:\Puentes\Modificado\PuenteMod.K~J')

                os.remove('C:\Puentes\Modificado\PuenteMod.K~M')
                os.remove('C:\Puentes\Modificado\PuenteMod.K~I')
                os.remove('C:\Puentes\Modificado\PuenteMod.y~2')
                os.remove('C:\Puentes\Modificado\PuenteMod.Y$$')
                os.remove('C:\Puentes\Modificado\PuenteMod.Y~1')

                os.remove('C:\Puentes\Modificado\PuenteMod.log')
                os.remove('C:\Puentes\Modificado\PuenteMod.$2K')
                os.remove('C:\Puentes\Modificado\PuenteMod.OUT')

                #os.remove('C:\Puentes\Modificado\PuenteMod.ico')

                #shutil.copyfile('C:\Puentes\Modificado2\PuenteMod.sdb','C:\Puentes\Modificado\PuenteMod.sdb')

            #Mostramos en consola el mejor Nido
            print("EL MEJOR NIDO DE ESTA ITERACION ES: " + str(Nidos[0][6]))
            print(Nidos[0])

            tiempototaliteracion = time.time(
            ) - star_time  #Registro de tiempo por calculo de cada Iteración
            print('EL TIEMPO DE ESTA ITERACIÓN ' + str(cont2) + ' FUE: ' +
                  str(tiempototaliteracion))
            '''GUARDO LA INFORMACIÓN OBTENIDA EN "Registro.txt"'''
            Registro.write("ITERACION:" + "," + str(cont2) + ",")
            Registro.write("P1" + "," + str(Nidos[0][0]) + ",")
            Registro.write("P2" + "," + str(Nidos[0][1]) + ",")
            Registro.write("P3" + "," + str(Nidos[0][2]) + ",")
            Registro.write("T1" + "," + str(Nidos[0][3]) + ",")
            Registro.write("T2" + "," + str(Nidos[0][4]) + ",")
            Registro.write("T3" + "," + str(Nidos[0][5]) + ",")
            Registro.write("FIT" + "," + str(Nidos[0][6]) + ",")
            Registro.write("Tiempo de iteracion" + "," +
                           str(tiempototaliteracion) + ",\n")

            cont2 = cont2 + 1
示例#2
0
文件: DA.py 项目: felagos/Puentes
    def Metaheuristic(self, modelo):
        '''***INICIALIZACIoN POBLACION***'''
        self.poblacionInicial(
            modelo,
            False)  # SE CREAN LA POBLACIoN INICIAL (ORDEN Y MAGNITUDES).
        #self.poblacionInicial(modelo, True) # SE CREA UNA SEGUNDA POBLACION NECESARIO PARA LA MH.
        solutions = self.solutions  # SE GUARDAN LA POBLACIoN CREADA EN solutions.
        deltaSolutions = self.deltaSolution
        N = len(solutions)  # N DEFINE EL NUMERO DE NIDOS.

        ub = np.ones(3) * max(modelo.numx)
        lb = np.ones(3) * modelo.tesadoMinimo

        maxTesado = max(modelo.numx)
        minTesado = modelo.tesadoMinimo

        print("ub: ", ub)
        print("lb: ", lb)

        print("maxTesado: ", max(modelo.numx))
        print("minTesado: ", modelo.tesadoMinimo)

        return False

        #ub = max(modelo.numx)
        #lb = modelo.tesadoMinimo

        initialRadius = (ub - lb) / 20
        #print("initialRadius: ", initialRadius)
        Delta_max = (np.ones(3) * ub - np.ones(3) * lb) / 20
        #print("delta max: ", Delta_max)

        foodFitness = float("inf")
        foodPos = np.zeros(3)

        enemyFitness = -float("inf")
        enemyPos = np.zeros(3)

        fitness = np.array([])

        DragonFlies = [np.zeros(7) for x in range(self.poblacion)]
        DeltaDragonFlies = [np.zeros(7) for x in range(self.poblacion)]

        for w in range(
                0, N
        ):  #SE RELLENA EL NIDO CON EL ORDEN Y LAS MAGNITUDES DE LAS solutions CREADAS.
            mag2 = solutions[w].magnitud
            orden2 = solutions[w].orden

            deltamag2 = deltaSolutions[w].magnitud
            deltaorden2 = deltaSolutions[w].orden

            for e in range(3):
                DragonFlies[w][e] = orden2[e]
                DragonFlies[w][e + 3] = mag2[e]

                DeltaDragonFlies[w][e] = deltamag2[e]
                DeltaDragonFlies[w][e + 3] = deltaorden2[e]

        modelo.cerrarSap2000(
        )  # Cerrar SAP2000 el cual contenia el Puente Original
        modelo.abrirSAP()

        Registro = open("Registro.txt", "w")  # CREA EL ARCHIVO DE REGISTRO
        RegPoblacion = open("Poblacion.txt", "w")

        cont1 = 0
        while cont1 < self.poblacion:
            star_time = time.time(
            )  # Iniciamos variable para registrar tiempo en cada iteracion
            Registro.write("CALCULO POBLACIoN:" + "," + str(cont1) +
                           ",")  # Registro para el .txt
            # Mostramos en consola en la iteracion a ejecutar
            print("***POBLACIoN***:  " + str(cont1))
            modelo.cargarPuenteModificado()  # Cargamos Puente Modificado
            # SE APLICA TESADO A LA solution i
            #print("solucion: ", solutions[cont1])
            modelo.aplicarTesado([solutions[cont1]])
            #modelo.aplicarTesado([deltaSolutions[cont1]])
            # GUARDO EL VALOR DE FITNESS DE solution i  EN NIDOS i
            DragonFlies[cont1][6] = solutions[cont1].calcularFitness(modelo)

            #print("value fitness: ", DragonFlies[cont1][6])
            #DeltaDragonFlies[cont1][6] = deltaSolutions[cont1].calcularFitness(modelo)
            if DragonFlies[cont1][6] == -1:
                self.regenerarSolution(modelo, solutions, cont1)
                cont1 = cont1 - 1
                continue
            '''
            if DragonFlies[cont1][6] < foodFitness:
                foodFitness = DragonFlies[cont1][6]
                foodPos = DragonFlies[cont1]
            
            if DragonFlies[cont1][6] > enemyFitness:
                if True:
                    enemyFitness = DragonFlies[cont1][6]
                    enemyPos = DragonFlies[cont1]
            '''
            '''REMUEVO Y CAMBIO ARCHIVOS CORRESPONDIENTES PARA EVITAR TIEMPOS DE CALCULOS EXPONENCIALES'''
            os.remove('C:\Puentes\Modificado\PuenteMod.Y08')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y09')
            os.remove('C:\Puentes\Modificado\PuenteMod.msh')
            os.remove('C:\Puentes\Modificado\PuenteMod.K~0')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y~')

            os.remove('C:\Puentes\Modificado\PuenteMod.Y')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y00')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y03')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y07')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y05')

            os.remove('C:\Puentes\Modificado\PuenteMod.Y06')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y04')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y01')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y02')
            os.remove('C:\Puentes\Modificado\PuenteMod.K~J')

            os.remove('C:\Puentes\Modificado\PuenteMod.K~M')
            os.remove('C:\Puentes\Modificado\PuenteMod.K~I')
            os.remove('C:\Puentes\Modificado\PuenteMod.y~2')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y$$')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y~1')

            os.remove('C:\Puentes\Modificado\PuenteMod.log')
            os.remove('C:\Puentes\Modificado\PuenteMod.$2K')
            os.remove('C:\Puentes\Modificado\PuenteMod.OUT')
            '''GUARDO LA INFORMACIoN OBTENIDA EN "Registro.txt"'''
            Registro.write("ITERACION:" + "," + str(cont1) + ",")
            Registro.write("P1" + "," + str(DragonFlies[cont1][0]) + ",")
            Registro.write("P2" + "," + str(DragonFlies[cont1][1]) + ",")
            Registro.write("P3" + "," + str(DragonFlies[cont1][2]) + ",")
            Registro.write("T1" + "," + str(DragonFlies[cont1][3]) + ",")
            Registro.write("T2" + "," + str(DragonFlies[cont1][4]) + ",")
            Registro.write("T3" + "," + str(DragonFlies[cont1][5]) + ",")
            Registro.write("FIT" + "," + str(DragonFlies[cont1][6]) + ",")

            RegPoblacion.write("P1" + "," + str(DragonFlies[cont1][0]) + ",")
            RegPoblacion.write("P2" + "," + str(DragonFlies[cont1][1]) + ",")
            RegPoblacion.write("P3" + "," + str(DragonFlies[cont1][2]) + ",")
            RegPoblacion.write("T1" + "," + str(DragonFlies[cont1][3]) + ",")
            RegPoblacion.write("T2" + "," + str(DragonFlies[cont1][4]) + ",")
            RegPoblacion.write("T3" + "," + str(DragonFlies[cont1][5]) + ",")
            RegPoblacion.write("FIT" + "," + str(DragonFlies[cont1][6]) +
                               "\n\n")

            # Registro de tiempo por calculo de cada individuo de la poblacion
            tiempototaliteracion = time.time() - star_time
            # Mostramos Tiempo del calculo de cada individuo de la poblacion
            print('EL TIEMPO DE POBLACIoN ' + str(cont1) + ' FUE: ' +
                  str(tiempototaliteracion))
            # Guardamos en el .txt del tiempo por calculo de cada individuo de la poblacion
            Registro.write("Tiempo de Poblacion" + "," +
                           str(tiempototaliteracion) + ",\n")

            cont1 = cont1 + 1

        #print("total filas: ", len(self.solutions), " - total columnas: ",len(self.solutions[0].orden+self.solutions[0].magnitud))

        arrayFitness = np.array(DragonFlies)
        #print("arrayFitness: ", arrayFitness)
        fitness = arrayFitness[:, 6]
        #print("fitness: ", fitness)

        fitness = sorted(fitness)

        foodFitness = fitness[0]
        foodPos = DragonFlies[0][2:5]

        arrDF = np.array(DragonFlies)
        enemyPos = list(arrDF[len(arrDF) - 1, ])[2:5]
        enemyFitness = fitness[len(fitness) - 1]

        mag = [0, 0, 0]
        orden = [0, 0, 0]
        '''LOOP ALGORITMO'''
        i = 0
        while i <= self.iteraciones:
            min = modelo.tesadoMinimo
            star_time = time.time()  #Registro de tiempo
            modelo.cargarPuenteModificado()
            npend = DATOS_TESADO["NumPendolas"]

            r = (ub - lb) / 4 + ((ub - lb) * (i / self.iteraciones) * 2)

            w = float(0.9 - i * ((0.9 - 0.4) / self.iteraciones))

            my_c = float(0.1 - i * ((0.1 - 0) / (self.iteraciones / 2)))
            my_c = 0 if my_c < 0 else my_c

            s = 2 * random.uniform(minTesado,
                                   maxTesado) * my_c  # Seperation weight
            a = 2 * random.uniform(minTesado,
                                   maxTesado) * my_c  # Alignment weight
            c = 2 * random.uniform(minTesado,
                                   maxTesado) * my_c  # Cohesion weight
            f = 2 * random.uniform(minTesado,
                                   maxTesado)  # Food attraction weight
            e = my_c  # Enemy distraction weight

            totalDragonFlies = len(DragonFlies)

            print("total dragonflies: ", totalDragonFlies)

            for iDragonFly in range(totalDragonFlies):
                index = 0
                neighboursNo = 0

                orden = DragonFlies[iDragonFly][0:3]
                mag = DragonFlies[iDragonFly][3:6]

                print("mag inicial: ", mag, orden)

                magDelta = DeltaDragonFlies[iDragonFly][3:6]

                neighboursDelta = [
                    np.zeros(3) for x in range(totalDragonFlies)
                ]
                neighboursDragonfly = [
                    np.zeros(3) for x in range(totalDragonFlies)
                ]

                for j in range(1, totalDragonFlies):
                    #subMag = DragonFlies[j][3:3]
                    nDelta = DeltaDragonFlies[j][3:6]
                    nDragonFly = DragonFlies[j][3:6]

                    distanceEc = distance.euclidean(mag, nDragonFly)
                    if all(distanceEc <= r) and distanceEc is not 0:
                        neighboursDelta[index] = nDelta
                        neighboursDragonfly[index] = nDragonFly

                        index = index + 1
                        neighboursNo = neighboursNo + 1

                #Separation
                S = np.zeros(3)
                if neighboursNo > 1:
                    for k in range(neighboursNo):
                        S = S + ((neighboursDragonfly[k]) - np.array(mag))
                    S = -1 * S

                #Alignment
                A = magDelta
                if neighboursNo > 1:
                    A = np.array(neighboursDragonfly).sum(
                        axis=0) / neighboursNo
                    #A = np.squeeze(np.asarray(A))

                #Cohesion
                C = mag
                if neighboursNo > 1:
                    C = np.array(neighboursDragonfly).sum(
                        axis=0) / neighboursNo
                    #C = np.squeeze(np.asarray(C))
                C = np.array(C) - np.array(mag)

                #Attraction to food
                #print("mag: ", mag)
                #cprint("foodPos: ", foodPos)
                distance2Food = distance.euclidean(mag, foodPos)
                F = 0
                if all(distance2Food <= r):
                    F = np.array(foodPos) - np.array(mag)

                distance2Enemy = distance.euclidean(mag, enemyPos)
                E = np.zeros(3)
                if all(distance2Enemy <= r):
                    E = np.array(enemyPos) + np.array(mag)

                #print("S: ", S)
                #print("A: ", A)
                #print("C: ", C)
                #print("F: ", F)
                #print("E: ", E)

                if all(distance2Food > r):
                    if neighboursNo > 1:
                        for j in range(3):
                            #print("levy: ", self.levy(3))
                            #print("magDelta[j]: ", magDelta[j])
                            #print("w: ", w)
                            #print("random.uniform(lb, ub): ", random.uniform(lb, ub))
                            #print("A[j]: ", A[j])
                            #print("S[j]: ", S[j])
                            #print("C[j]: ", C[j])
                            mov = w * magDelta[j] + random.uniform(
                                minTesado, maxTesado) * A[j] + random.uniform(
                                    minTesado,
                                    maxTesado) * C[j] + random.uniform(
                                        minTesado, maxTesado) * S[j]
                            magDelta[j] = mov
                            #print("magDelta[j]: ", magDelta[j])
                            #print("Delta_max[j]: ", Delta_max[j])
                            '''
                            if (magDelta[j] > Delta_max[j]):
                                magDelta[j] = Delta_max[j]

                            if (magDelta[j] < -1 * Delta_max[j]):
                                magDelta[j] = -1 * Delta_max[j]
                            '''

                            if (magDelta[j] < -1 * Delta_max[j]):
                                magDelta[j] = -1 * Delta_max[j]

                            mag[j] = np.array(mag[j]) - np.array(magDelta[j])
                            mag[j] = -1 * mag[j] if mag[j] < 0 else mag[j]

                            if mag[j] > modelo.tesadoMaximo[
                                    j]:  #Si la nueva mag es mayor al max, utilizamos la minima
                                mag[j] = min
                    else:
                        mag = np.array(mag) + self.levy(3) * np.array(mag)
                        z = randint(0, npend - 1)
                        orden = self.permutaciones[z]

                        #solution = Solution(orden, mag)

                        #DragonFlies[iDragonFly][3] = mag[0]
                        #DragonFlies[iDragonFly][4] = mag[1]
                        #DragonFlies[iDragonFly][5] = mag[2]

                        #modelo.cargarPuenteModificado()
                        #Aplicamos tesado en función a Solution
                        #modelo.aplicarTesado([solution])

                        magDelta = np.zeros(3)
                else:
                    for j in range(3):
                        magDelta[j] = (a * A[j] + c * C[j] + s * S[j] +
                                       f * F[j] + e * E[j]) + w * magDelta[j]
                        #print("magDelta[j]: ", magDelta[j])
                        #print("Delta_max[j]: ", Delta_max[j])
                        '''
                        if (magDelta[j] > Delta_max[j]):
                            magDelta[j] = Delta_max[j]

                        if (magDelta[j] < -1 * Delta_max[j]):
                            magDelta[j] = -1 * Delta_max[j]
                        '''

                        if (magDelta[j] < -1 * Delta_max[j]):
                            magDelta[j] = -1 * Delta_max[j]

                        mag[j] = np.array(mag[j]) - np.array(magDelta[j])

                        mag[j] = -1 * mag[j] if mag[j] < 0 else mag[j]

                        if mag[j] > modelo.tesadoMaximo[
                                j]:  #Si la nueva mag es mayor al max, utilizamos la minima
                            mag[j] = min

                mag = self.checkBounds(mag, lb, ub)

                DragonFlies[iDragonFly][0] = orden[0]
                DragonFlies[iDragonFly][1] = orden[1]
                DragonFlies[iDragonFly][2] = orden[2]

                DragonFlies[iDragonFly][3] = mag[0]
                DragonFlies[iDragonFly][4] = mag[1]
                DragonFlies[iDragonFly][5] = mag[2]

                print("mag final: ", mag, orden)
                solution = Solution(orden, mag)

                modelo.aplicarTesado([
                    solution
                ])  #Se aplica tension en la nueva solution con vuelo de Levy
                newFitness = solution.calcularFitness(modelo)

                if newFitness == -1:
                    iDragonFly = iDragonFly - 1
                    continue

                if newFitness < DragonFlies[iDragonFly][6]:
                    foodFitness = newFitness
                    foodPos = mag
                    for j in range(3):
                        DragonFlies[iDragonFly][j] = orden[j]
                        DragonFlies[iDragonFly][j + 3] = mag[j]
                    DragonFlies[iDragonFly][6] = newFitness

                if newFitness > enemyFitness:
                    enemyFitness = newFitness
                    enemyPos = mag

                print("\nnew fitness: ", newFitness, " - current fitness: ",
                      DragonFlies[iDragonFly][6])

            #Ordenamos la Poblacion de menos a mayor
            DragonFlies = sorted(DragonFlies,
                                 key=lambda x: x[6],
                                 reverse=False)

            #se incrementa el indice de las iteraciones
            '''REMUEVO Y CAMBIO ARCHIVOS CORRESPONDIENTES PARA EVITAR TIEMPOS DE CALCULOS EXPONENCIALES'''
            os.remove('C:\Puentes\Modificado\PuenteMod.Y08')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y09')
            os.remove('C:\Puentes\Modificado\PuenteMod.msh')
            os.remove('C:\Puentes\Modificado\PuenteMod.K~0')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y~')

            os.remove('C:\Puentes\Modificado\PuenteMod.Y')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y00')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y03')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y07')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y05')

            os.remove('C:\Puentes\Modificado\PuenteMod.Y06')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y04')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y01')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y02')
            os.remove('C:\Puentes\Modificado\PuenteMod.K~J')

            os.remove('C:\Puentes\Modificado\PuenteMod.K~M')
            os.remove('C:\Puentes\Modificado\PuenteMod.K~I')
            os.remove('C:\Puentes\Modificado\PuenteMod.y~2')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y$$')
            os.remove('C:\Puentes\Modificado\PuenteMod.Y~1')

            os.remove('C:\Puentes\Modificado\PuenteMod.log')
            os.remove('C:\Puentes\Modificado\PuenteMod.$2K')
            os.remove('C:\Puentes\Modificado\PuenteMod.OUT')

            print("EL MEJOR NIDO DE ESTA ITERACION ES: " +
                  str(DragonFlies[0][6]))
            print(DragonFlies[0])

            tiempototaliteracion = time.time(
            ) - star_time  #Registro de tiempo por calculo de cada Iteracion
            print('EL TIEMPO DE ESTA ITERACIoN ' + str(i) + ' FUE: ' +
                  str(tiempototaliteracion))
            '''GUARDO LA INFORMACIoN OBTENIDA EN "Registro.txt"'''
            Registro.write("ITERACION:" + "," + str(i) + ",")
            Registro.write("P1" + "," + str(DragonFlies[0][0]) + ",")
            Registro.write("P2" + "," + str(DragonFlies[0][1]) + ",")
            Registro.write("P3" + "," + str(DragonFlies[0][2]) + ",")
            Registro.write("T1" + "," + str(DragonFlies[0][3]) + ",")
            Registro.write("T2" + "," + str(DragonFlies[0][4]) + ",")
            Registro.write("T3" + "," + str(DragonFlies[0][5]) + ",")
            Registro.write("FIT" + "," + str(DragonFlies[0][6]) + ",")
            Registro.write("Tiempo de iteracion" + "," +
                           str(tiempototaliteracion) + ",\n")

            print("iteracion: ", i)

            i = i + 1