Enjambre

class pso.clases.class_enjambre.Enjambre(n_particulas, n_variables, limites_inf=None, limites_sup=None, verbose=False)[source]

Esta clase crea un enjambre de n partículas.

Parameters:
  • n_particulas (int) – número de partículas del enjambre.
  • n_variables (int) – número de variables que definen la posición de las partícula.
  • limites_inf (list or numpy.ndarray) – límite inferior de cada variable. Si solo se quiere predefinir límites de alguna variable, emplear None. Los None serán remplazados por el valor (-10**3).
  • limites_sup (list or numpy.ndarray) – límite superior de cada variable. Si solo se quiere predefinir límites de alguna variable, emplear None. Los``None`` serán remplazados por el valor (+10**3).
  • verbose (bool, optional) – mostrar información del proceso por pantalla. (default is False)
partículas

lista con todas las partículas del enjambre.

Type:list
n_particulas

número de partículas del enjambre.

Type:int
n_variables

número de variables que definen la posición de las partícula.

Type:int
limites_inf

límite inferior de cada variable.

Type:list or numpy.ndarray
limites_sup

límite superior de cada variable.

Type:list or numpy.ndarray
mejor_particula

la mejor partícula del enjambre en estado actual.

Type:object particula
mejor_valor

el mejor valor del enjambre en su estado actual.

Type:floar
historico_particulas

lista con el estado de las partículas en cada una de las iteraciones que ha tenido el enjambre.

Type:list
historico_mejor_posicion

lista con la mejor posición en cada una de las iteraciones que ha tenido el enjambre.

Type:list
historico_mejor_valor

lista con el mejor valor en cada una de las iteraciones que ha tenido el enjambre.

Type:list
diferencia_abs

diferencia absoluta entre el mejor valor de iteraciones consecutivas.

Type:list
resultados_df

dataframe con la información del mejor valor y posición encontrado en cada iteración, así como la mejora respecto a la iteración anterior.

Type:pandas.core.frame.DataFrame
valor_optimo

mejor valor encontrado en todas las iteraciones.

Type:float
posicion_optima

posición donde se ha encontrado el valor_optimo.

Type:numpy.narray
optimizado

si el enjambre ha sido optimizado.

Type:bool
iter_optimizacion

número de iteraciones de optimizacion.

Type:int

Examples

Ejemplo crear enjambre

>>> enjambre = Enjambre(
           n_particulas = 5,
           n_variables  = 3,
           limites_inf  = [-5,-5,-5],
           limites_sup  = [5,5,5],
           verbose      = True
        )

Methods

evaluar_enjambre(funcion_objetivo, optimizacion) Este método evalúa todas las partículas del enjambre, actualiza sus valores e identifica la mejor partícula.
mostrar_particulas([n]) Este método muestra la información de cada una de las n primeras partículas del enjambre.
mover_enjambre(inercia, peso_cognitivo, …) Este método mueve todas las partículas del enjambre.
optimizar(funcion_objetivo, optimizacion[, …]) Este método realiza el proceso de optimización de un enjambre.
evaluar_enjambre(funcion_objetivo, optimizacion, verbose=False)[source]

Este método evalúa todas las partículas del enjambre, actualiza sus valores e identifica la mejor partícula.

Parameters:
  • funcion_objetivo (function) – función que se quiere optimizar.
  • optimizacion ({maximizar o minimizar}) – Dependiendo de esto, el mejor valor histórico de la partícula será el mayor o el menor valorque ha tenido hasta el momento.
  • verbose (bool, optional) – mostrar información del proceso por pantalla. (default is False)

Examples

Ejemplo evaluar enjambre

>>> enjambre = Enjambre(
       n_particulas = 5,
       n_variables  = 3,
       limites_inf  = [-5,-5,-5],
       limites_sup  = [5,5,5],
       verbose      = True
    )
>>> def funcion_objetivo(x_0, x_1, x_2):
        f= x_0**2 + x_1**2 + x_2**2
        return(f)
>>> enjambre.evaluar_enjambre(
        funcion_objetivo = funcion_objetivo,
        optimizacion     = "minimizar",
        verbose          = True
        )
mostrar_particulas(n=None)[source]

Este método muestra la información de cada una de las n primeras partículas del enjambre.

Parameters:n (int) – número de particulas que se muestran. Si no se indica el valor (por defecto None), se muestran todas. Si el valor es mayor que self.n_particulas se muestran todas.

Examples

>>> enjambre = Enjambre(
       n_particulas = 5,
       n_variables  = 3,
       limites_inf  = [-5,-5,-5],
       limites_sup  = [5,5,5],
       verbose      = True
    )
>>> enjambre.mostrar_particulas(n = 1)
mover_enjambre(inercia, peso_cognitivo, peso_social, verbose=False)[source]

Este método mueve todas las partículas del enjambre.

Parameters:
  • optimizacion ({'maximizar', 'minimizar'}) – si se desea maximizar o minimizar la función.
  • inercia (float or int) – coeficiente de inercia.
  • peso_cognitivo (float or int) – coeficiente cognitivo.
  • peso_social (float or int) – coeficiente social.
  • verbose (bool, optional) – mostrar información del proceso por pantalla. (default is False)
optimizar(funcion_objetivo, optimizacion, n_iteraciones=50, inercia=0.8, reduc_inercia=True, inercia_max=0.9, inercia_min=0.4, peso_cognitivo=2, peso_social=2, parada_temprana=False, rondas_parada=None, tolerancia_parada=None, verbose=False)[source]

Este método realiza el proceso de optimización de un enjambre.

Parameters:
  • funcion_objetivo (function) – función que se quiere optimizar.
  • optimizacion ({'maximizar' o 'minimizar'}) – si se desea maximizar o minimizar la función.
  • m_iteraciones (int , optional) – numero de iteraciones de optimización. (default is 50)
  • inercia (float or int, optional) – coeficiente de inercia. (default is 0.8)
  • peso_cognitivo (float or int, optional) – coeficiente cognitivo. (default is 2)
  • peso_social (float or int, optional) – coeficiente social. (default is 2)
  • reduc_inercia (bool, optional) – activar la reducción del coeficiente de inercia. En tal caso, el argumento inercia es ignorado. (default is True)
  • inercia_max (float or int, optional) – valor inicial del coeficiente de inercia si se activa reduc_inercia. (default is 0.9)
  • inercia_min (float or int, optional) – valor minimo del coeficiente de inercia si se activa reduc_min. (default is 0.4)
  • parada_temprana (bool, optional) – si durante las últimas rondas_parada iteraciones la diferencia absoluta entre mejores partículas no es superior al valor de tolerancia_parada, se detiene el algoritmo y no se crean nuevas iteraciones. (default is False)
  • rondas_parada (int, optional) – número de iteraciones consecutivas sin mejora mínima para que se active la parada temprana. (default is None)
  • tolerancia_parada (float or int, optional) –
    valor mínimo que debe tener la diferencia de iteraciones consecutivas
    para considerar que hay cambio. (default is None)
    verbose : bool, optional
    mostrar información del proceso por pantalla. (default is False)
Raises:
  • raise Exception – si se indica parada_temprana = True y los argumentos rondas_parada o tolerancia_parada son None.
  • raise Exception – si se indica reduc_inercia = True y los argumentos inercia_max o inercia_min son None.

Examples

Ejemplo optimización

>>> def funcion_objetivo(x_0, x_1):
        # Para la región acotada entre −10<=x_0<=0 y −6.5<=x_1<=0 la
        # función tiene múltiples mínimos locales y un único mínimo
        # global en f(−3.1302468,−1.5821422)= −106.7645367.
        f = np.sin(x_1)*np.exp(1-np.cos(x_0))**2                     + np.cos(x_0)*np.exp(1-np.sin(x_1))**2                     + (x_0-x_1)**2
        return(f)
>>> enjambre = Enjambre(
                n_particulas = 50,
                n_variables  = 2,
                limites_inf  = [-10, -6.5],
                limites_sup  = [0, 0],
                verbose      = False
                )
>>> enjambre.optimizar(
        funcion_objetivo  = funcion_objetivo,
        optimizacion      = "minimizar",
        n_iteraciones     = 250,
        inercia           = 0.8,
        reduc_inercia     = True,
        inercia_max       = 0.9,
        inercia_min       = 0.4,
        peso_cognitivo    = 1,
        peso_social       = 2,
        parada_temprana   = True,
        rondas_parada     = 5,
        tolerancia_parada = 10**-3,
        verbose           = False
    )