Algoritmo de enjambre de partículas de Python

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/

Adquisición de código

El código está en github

Supongo que te gusta

Origin blog.csdn.net/qq_39805362/article/details/107486044
Recomendado
Clasificación