Código Python

Particula

class pso.clases.class_particula.Particula(n_variables, limites_inf=None, limites_sup=None, verbose=False)[source]

Esta clase representa nueva partícula con una posición inicial definida por una combinación de valores numéricos aleatorios y velocidad de 0. El rango de posibles valores para cada variable (posición) puede estar acotado. Al crear una nueva partícula, solo se dispone de información sobre su posición inicial y velocidad, el resto de atributos están vacíos.

Parameters:
  • n_variables (int) – número de variables que definen la posición de la partícula.
  • limites_inf (list or numpy.ndarray, optional) – 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). (default is None)
  • limites_sup (list or numpy.ndarray, optional) – 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). (default is None)
  • verbose (bool, optional) – mostrar información de la partícula creada. (default is False)
n_variables

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

Type:int
limites_inf

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

Type:list or numpy.ndarray
limites_sup

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

Type:list or numpy.ndarray
mejor_valor

mejor valor que ha tenido la partícula hasta el momento.

Type:numpy.ndarray
mejor_posicion

posición en la que la partícula ha tenido el mejor valor hasta el momento.

Type:numpy.ndarray
valor

valor actual de la partícula. Resultado de evaluar la función objetivo con la posición actual.

Type:float
velocidad

array con la velocidad actual de la partícula.

Type:numpy.ndarray
posicion

posición actual de la partícula.

Type:numpy.ndarray
Raises:
  • raise Exception – si limites_inf es distinto de None y su longitud no coincide con n_variables.
  • raise Exception – si limites_sup es distinto de None y su longitud no coincide con n_variables.

Examples

Ejemplo creación partícula.

>>> part = Particula(
                n_variables = 3,
                limites_inf = [-1,2,0],
                limites_sup = [4,10,20],
                verbose     = True
                )

Methods

evaluar_particula(funcion_objetivo, optimizacion) Este método evalúa una partícula calculando el valor que toma la función objetivo en la posición en la que se encuentra.
mover_particula(mejor_p_enjambre[, inercia, …]) Este método ejecuta el movimiento de una partícula, lo que implica actualizar su velocidad y posición.
evaluar_particula(funcion_objetivo, optimizacion, verbose=False)[source]

Este método evalúa una partícula calculando el valor que toma la función objetivo en la posición en la que se encuentra. Además, compara si la nueva posición es mejor que las anteriores. Modifica los atributos valor, mejor_valor y mejor_posicion de la partícula.

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

raise Exception – si el argumento optimizacion es distinto de ‘maximizar’ o ‘minimizar’.

Examples

Ejemplo evaluar partícula con una función objetivo.

>>> part = Particula(
        n_variables = 3,
        limites_inf = [-1,2,0],
        limites_sup = [4,10,20],
        verbose     = True
        )
>>> def funcion_objetivo(x_0, x_1, x_2):
        f= x_0**2 + x_1**2 + x_2**2
        return(f)
>>> part.evaluar_particula(
        funcion_objetivo = funcion_objetivo,
        optimizacion     = "maximizar",
        verbose          = True
        )
mover_particula(mejor_p_enjambre, inercia=0.8, peso_cognitivo=2, peso_social=2, verbose=False)[source]

Este método ejecuta el movimiento de una partícula, lo que implica actualizar su velocidad y posición. No se permite que la partícula salga de la zona de búsqueda acotada por los límites.

Parameters:
  • mejor_p_enjambre (np.narray) – mejor posición de todo el enjambre.
  • inercia (float, optional) – coeficiente de inercia. (default is 0.8)
  • peso_cognitivo (float, optional) – coeficiente cognitivo. (default is 2)
  • peso_social (float, optional) – coeficiente social. (default is 2)
  • verbose (bool, optional) – mostrar información del proceso por pantalla. (default is False)

Examples

Ejemplo mover partícula.

>>> part = Particula(
        n_variables = 3,
        limites_inf = [-1,2,0],
        limites_sup = [4,10,20],
        verbose     = True
        )
>>> def funcion_objetivo(x_0, x_1, x_2):
        f= x_0**2 + x_1**2 + x_2**2
        return(f)
>>> part.evaluar_particula(
        funcion_objetivo = funcion_objetivo,
        optimizacion     = "maximizar",
        verbose          = True
        )
>>> part.mover_particula(
        mejor_p_enjambre = np.array([-1000,-1000,+1000]),
        inercia          = 0.8,
        peso_cognitivo   = 2,
        peso_social      = 2,
        verbose          = True
        )

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
    )