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实现粒子群算法

1.1.自定义函数

创建自定义的函数,自变量x是一个二维的矩阵,维度为shape(n_particles,n_dimension),每一行是一个particle,每一列是一个维度,自定义函数的返回值是一个一维的矩阵,矩阵中的每个元素是每个particle输入到目标函数后返回的值。除此之外,自定义的function还可以有一些系数,下面我举的例子中给了一个系数a。我给的自定义的函数为: f ( x ) = a ∗ ( x 1 2 + x 2 2 ) f(x) = a*(x_1^2 + x_2^2) f(x)=a(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.定义约束

定义两个维度的自变量的范围分别为(1,9)和(3,10)。

x_max = (9,10)
x_min = (1,3)
bounds = (x_min, x_max)

1.3.使用粒子群算法进行优化求解

# 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.结论

pyswarms实现粒子群算法进行优化是很简单的,但是问题是这个包没法加入约束方程,因此解决优化问题时基本上是不大行的。

2.pyswarm实现粒子群算法

2.1.自定义函数

粒子群算法将会最小化目标函数

from pyswarm import pso

def banana(x):
    x1 = x[0]
    x2 = x[1]
    return x1**2 + x2**2
banana([1,2])
5

2.2.定义约束

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.使用粒子群算法进行优化求解

在此仅仅对约束施加一些说明,其他都很简单,一看就知道,便不再多阐述了。添加约束主要依靠下面的两个参数来做到。

ieqcons : list

A list of functions of length n such that ieqcons[j](x,*args) >= 0.0 in a successfully optimized problem (Default: empty list, [])

f_ieqcons : function

Returns a 1-D array in which each element must be greater or equal to 0.0 in a successfully optimized problem. If f_ieqcons is specified, ieqcons is ignored (Default: None)

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.结论

使用pyswarm便可以完美实现,带约束的目标函数求解了。

参考链接

https://pythonhosted.org/pyswarm/

代码获取

代码在github里

猜你喜欢

转载自blog.csdn.net/qq_39805362/article/details/107486044