import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# Import PySwarms
import pyswarms as ps
from pyswarms.utils.functions import single_obj as fx
from pyswarms.single.global_best import GlobalBestPSO
1. Pyswarms implementa el algoritmo de enjambre de partículas
1.1. Funciones personalizadas
Cree una función personalizada, la variable independiente x es una matriz bidimensional, la dimensión es la forma (n_partículas, n_dimensión), cada fila es una partícula, cada columna es una dimensión y el valor de retorno de la función personalizada es una matriz unidimensional. Cada elemento de la matriz es el valor devuelto por cada entrada de partículas a la función objetivo. Además, la función personalizada también puede tener algunos coeficientes En el ejemplo que doy a continuación, se da un coeficiente a. La función personalizada que di es: f (x) = a ∗ (x 1 2 + x 2 2) f (x) = a * (x_1 ^ 2 + x_2 ^ 2)f ( x )=un∗( x12+X22)
def SelfDefinedFunc(x , a):
j = a * ((x ** 2.0).sum(axis=1))
return j
# 输入一个二维矩阵,观察函数的输出值,进一步了解下自定义的函数。
x=np.array([[1,1],[2,2]])
SelfDefinedFunc(x,2)
array([ 4., 16.])
1.2. Definir restricciones
Los rangos de las variables independientes que definen las dos dimensiones son (1,9) y (3,10) respectivamente.
x_max = (9,10)
x_min = (1,3)
bounds = (x_min, x_max)
1.3. Utilice el algoritmo de enjambre de partículas para la solución de optimización
# instatiate the optimizer
options = {
'c1': 0.5, 'c2': 0.3, 'w': 0.9} # 粒子群算法的参数
optimizer = GlobalBestPSO(n_particles=20, dimensions=2, options=options, bounds=bounds)
# now run the optimization, pass a=1 and b=100 as a tuple assigned to args
cost, pos = optimizer.optimize(SelfDefinedFunc, iters=1000,a = 2) # a就是自定义函数的参数
print(cost , pos)
2020-07-21 11:51:58,850 - pyswarms.single.global_best - INFO - Optimize for 1000 iters with {'c1': 0.5, 'c2': 0.3, 'w': 0.9}
pyswarms.single.global_best: 100%|███████████████████████████████████████████████████████████|1000/1000, best_cost=20.4
2020-07-21 11:52:00,856 - pyswarms.single.global_best - INFO - Optimization finished | best cost: 20.411660581634884, best pos: [1.03786661 3.02136777]
20.411660581634884 [1.03786661 3.02136777]
1.4. Conclusión
pyswarms es muy simple de implementar la optimización del enjambre de partículas, pero el problema es que este paquete no puede agregar ecuaciones de restricción, por lo que básicamente no es bueno para resolver problemas de optimización.
2. Pyswarm implementa el algoritmo de enjambre de partículas
2.1. Función personalizada
El algoritmo de enjambre de partículas minimizará la función objetivo
from pyswarm import pso
def banana(x):
x1 = x[0]
x2 = x[1]
return x1**2 + x2**2
banana([1,2])
5
2.2. Definir restricciones
def con1(x):
x1 = x[0]
x2 = x[1]
return x1-x2
def con2(x):
x1 = x[0]
x2 = x[1]
return x1-x2-0.5
lb = [-3, 1]
ub = [2, 6]
2.3. Utilice el algoritmo de enjambre de partículas para la solución de optimización
Solo impongo algunas explicaciones sobre las limitaciones, y las otras son muy simples, se puede ver de un vistazo, así que no voy a dar más detalles. La adición de restricciones depende principalmente de los dos parámetros siguientes.
ieqcons: lista
Una lista de funciones de longitud n tal que ieqcons [j] (x, * args)> = 0.0 en un problema optimizado con éxito (Predeterminado: lista vacía, [])
f_ieqcons: función
Devuelve una matriz 1-D en la que cada elemento debe ser mayor o igual a 0.0 en un problema optimizado con éxito. Si se especifica f_ieqcons, ieqcons se ignora (predeterminado: ninguno)
xopt, fopt = pso(banana, lb, ub, f_ieqcons=None,ieqcons=[con1 , con2], args=(), kwargs={
},
swarmsize=100, omega=0.5, phip=0.5, phig=0.5, maxiter=100, minstep=1e-8,
minfunc=1e-8, debug=False)
print(xopt , fopt)
Stopping search: Swarm best position change less than 1e-08
[1.50000002 1. ] 3.250000048714665
2.4. Conclusión
Usando pyswarm, se puede lograr perfectamente y se resuelve la función objetivo con restricciones.
Link de referencia
https://pythonhosted.org/pyswarm/