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
. LosNone
serán remplazados por el valor (-10**3). (default isNone
) - 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
. LosNone
serán remplazados por el valor (+10**3). (default isNone
) - 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
. LosNone
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
. 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 )