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