예제 #1
0
def main():

    N = 20  #tamaño del enjambre
    maxIter = 1000  #cantidad maxima de iteraciones

    #Distintos ejemplos para probar
    ejemplos = [(error1, 1, -512, 512), (error2, 1, 0, 20),
                (error3, 2, -100, 100)]

    #Ejemplo elegido actualmente [0, 1, 2]
    ec = 2

    #Variables por ejemplo (funcion de error, dimension del problema, minimo para x, maximo para x)
    error = ejemplos[ec][0]
    dim = ejemplos[ec][1]
    xmin = ejemplos[ec][2]
    xmax = ejemplos[ec][3]

    #Inicializo el enjambre con particulas posicionadas al azar en el hiperespacio
    enjambre = []
    for _i in range(N):
        enjambre.append(particula(error, dim, xmin, xmax))

    #Mejor global
    bestGlobalY = 99999
    bestGlobalX = np.zeros(dim)

    #Varaibles de corte
    bestGlobalPrevio = bestGlobalY
    bestRepetido = 0
    maxRepetido = 300

    for _i in range(maxIter):
        #Para cada particula
        for part in enjambre:
            #Evalua su valor de error
            val_error = part.Evaluar()
            #Actaulizo el mejor local de la particula
            part.ActualizarMejor(val_error)

            #Reviso si el performance de esta particula es mejor que el global
            if (val_error < bestGlobalY):
                bestGlobalY = val_error
                bestGlobalX = part.x
                bestRepetido = 0

        #Control de repeticion de mejor global (condicion de corte)
        if (bestGlobalPrevio == bestGlobalY):
            bestRepetido += 1
            if (bestRepetido > maxRepetido):
                print(f"Convergencia por repeticion en iteracion {_i}")
                break

        #Para cada particula
        for part in enjambre:
            #Actualizo posicion y velocidad
            part.ActualizarVelocidad(bestGlobalX)
            part.ActualizarPosicion()
        bestGlobalPrevio = bestGlobalY

    #Al converger, muestro la mejor global
    if (bestRepetido <= maxRepetido):
        print(f"Convergencia por máxima cantidad de iteraciones {maxIter}")
    print(f"Best Global X: {bestGlobalX} | Best Global Y: {bestGlobalY}")
from particula import particula

import cPickle

variacoes = [];

nova_populacao = cPickle.load(open('nova_populacao'))
#for particula in nova_populacao:
#  cromossomos = str(particula)
#  print cromossomos

'''
Mutação (cruzamento) das melhores partículas 
'''
print '\nINICIANDO MUTAÇÃO/CRUZAMENTO DAS PARTÍCULAS MAIS FORTES'
while (len(nova_populacao) >= 2):
  p1 = nova_populacao.pop()
  p2 = nova_populacao.pop()

  variacao = []
  for v in p1.genetica():
    variacao.append(v)
  for v in p2.genetica():
    variacao.append(v)

  p = particula( p1.nome + p2.nome, variacao )
  variacoes.append(p)

arq_variacoes = open('novas_variacoes', 'w')
cPickle.dump(variacoes, arq_variacoes)
arq_variacoes.close()