粒子群优化算法实现寻找函数最值

粒子群算法简介

粒子群优化Particle Swarm OptimizationPSO),又称微粒群算法,是由J. Kennedy和R. C. Eberhart等于1995年开发的一种演化计算技术,来源于对一个简化社会模型的模拟。其中“群”来源于微粒群匹配M. M. Millonas在开发应用于人工生命的模型时所提出的群体智能的5个基本原则。“粒子(particle)”是一个折衷的选择,因为既需要将群体中的成员描述为没有质量、没有体积的,同时也需要描述它的速度和加速状态。

粒子群算法参数:

1.群体规模m   2.惯性权重w  3.加速常数c1和c2 4. 最大速度Vmax 5.最大代数Gmax

粒子群算法原理:

粒子群算法是基于群体的,根据粒子所处的环境将粒子移动到好的区域。假设现有一个规模大小为的粒子群,粒子群的个体位置分布记为X={x1,x2……xn},对应速度记为V={v1,v2……vn};粒子群个体在运动过程中所经过的最优位置(即粒子适应度最大时对应的位置)记为P={p1,p2……pn},在编程中常将此设为pbest数组;粒子群的全局最优位置用gbest表示。

核心的运动思想代码:

速度变化

vi=w*vi+c1*rand()*(pi-xi)+c2*rand()*(gbest-xi)

位置变化

xi=xi+vi

其中rand()表示区间[0,1]随机生成的小数。

在速度变化方程中 w*vi 表示微粒此前的惯性,c1*rand()*(pi-xi) 表示微粒本身基于自我历史适应度的思考,c2*rand()*(gbest-xi)表示微粒群之间的社会信息共享。

算法流程图:

例子

求解f(x)=x+5sin(5x)+2cos(4x)在区间上的函数最值。

在编程前首先观察一下函数的图像:

编程实现:

import numpy as np
import matplotlib.pyplot as plt
import math
import random

#群体规模
m=30

#惯性权重
w=1

# 加速常数
c1=2
c2=5

# 最大速度
Vmax=3

# 最大代数
Gmax=10

#目标函数,也就是适应度
def aimFunction(x):
    y=x+5*math.sin(5*x)+2*math.cos(4*x)
    return y

#左右边界
left=0
right=10
#随机初始化粒子群位置和速度
x=np.random.uniform(left,right,m)
y=x+5*np.sin(5*x)+2*np.cos(4*x)
v=np.random.uniform(0,Vmax,m)

pbset=x.copy()
y_best=y.copy()
gbset=x[y.argmax()]

i=0

while i<Gmax:
    for k in range(m):
        v[k] = w * v[k] + c1 * random.random() * (pbset[k] - x[k]) + c2 * random.random() * (gbset - x[k])
        # 速度限制
        if v[k]>Vmax:
            v[k]=Vmax
        if v[k]<0:
            v[k] = 0.01
        x[k]=x[k]+v[k]
        if x[k]<left:
            x[k]=left
        if x[k]>right:
            x[k]=right
    y=x+5*np.sin(5*x)+2*np.cos(4*x)
    for k in range(m):
        if y_best[k]<y[k]:
            y_best[k]=y[k]
            pbset[k]=x[k]
    gbset=pbset[y_best.argmax()]
    i+=1

print(gbset,aimFunction(gbset))

猜你喜欢

转载自blog.csdn.net/springtostring/article/details/82219696
今日推荐