粒子群算法 - 目标函数最优解计算

粒子群算法概念

粒子群算法 (particle swarm optimization,PSO) 由 Kennedy 和 Eberhart 在 1995 年提出,该算法模拟鸟群觅食的方法进行寻找最优解。基本思想:人们发现,鸟群觅食的方向由两个因素决定。第一个是自己当初飞过离食物最近的位置,第二个因素是鸟群中离食物最近的鸟的位置。根据这个两个因素不断的改变自己的位置。最终,整个鸟群都能寻找到食物。

相关知识

1.编码与适应度函数,2.粒子群算法原理,3.粒子群算法流程,4.使用 python 实现粒子群算法。

编码与适应度函数

在粒子群算法中也需要进行编码,不过相对于遗传算法粒子群算法编码非常简单。例如,函数

可直接将函数解作为编码。而函数的值即可作为适应度,若求解函数最小值则适应度越小越好,若求解函数最大值则适应度越大越好。

粒子群算法原理

粒子群函数是根据鸟群寻找食物实现的优化算法,每一只鸟被称为粒子,即函数的一个解。我们已经知道,每一只鸟寻找食物是根据离食物最近的鸟的位置,与自己曾经离食物最近的位置来决定改变自己现在的位置。根据这个原理,粒子群算法核心公式如下:


其中,为鸟群的位置,

为鸟飞行的速度,即鸟群更新位置的因素。而公式2就是决定速度的因素:

p:个体最佳位置
pg:全局最佳位置
w:惯性权重因子,用来控制速度的更新
c1,c2:加速度常数,通常设为2
r1,r2:0到1之间的随机数

粒子群算法流程

随机初始粒子群位置与速度
计算粒子群适应度
根据公式更新粒子群位置与速度
重复2,3直到满足停止条件

使用python实现粒子群算法

实现粒子群算法。并求解函数 f(x) 在区间 [-10,10] 上的最小值:

首先我们需要对粒子群位置与速度进行随机初始:

import numpy as np
#初始化粒子群位置
x = np.random.uniform(x_bound[0], x_bound[1],(pop_size, dim))
#初始化粒子群速度
v = np.random.rand(pop_size,dim)

其中,x_bound 为 x 取值范围。pop_size 为粒子群大小,即鸟的数量。dim 为搜索空间维度。

再根据 x 计算适应度:

#f(x1,x2)=(x1-4)**2+(x2-5)**2,函数值即适应度
def f(x):
    return np.sum(np.square(x-np.array([4,5])), axis=1)
#计算适应度
fitness = f(x)

同时计算出全局最优位置与个体最优适应度、全局最优适应度:

#全局最优位置
pg = x[np.argmin(fitness)]
#个体最优适应度
individual_best_fitness = fitness
#全局最优适应度
global_best_fitness = np.min(individual_best_fitness)

最后开始进化,不断更新粒子群位置:

#encoding=utf8
import numpy as np
pop_size =10#粒子群大小
n_iters = 1000#训练轮数
dim = 2#搜索空间维度
w = 0.6#惯性权重因子
c1 = 2#加速度常数,通常设为2
c2 = 2#加速度常数,通常设为2
x_bound = [-10,10]#函数定义域
def pso(f):
    '''
    f:目标函数
    pg:最优解坐标
    '''
    #初始化粒子群位置
    x = np.random.uniform(low=x_bound[0], high=x_bound[1], size=(pop_size, dim)) 
    
    #初始化粒子群速度
    v = np.random.rand(pop_size,dim)
    #初始个体最佳位置
    p = x
    #计算适应度
    fitness = f(x)
    #全局最优位置
    pg = x[np.argmin(fitness)]
    #个体最优适应度
    individual_best_fitness = fitness
    #全局最优适应度
    global_best_fitness = np.min(individual_best_fitness)
    #开始进化
    for i in range(n_iters):
        #产生随机数r1,r2
        r1 = np.random.rand(pop_size,dim)
        r2 = np.random.rand(pop_size,dim)
        #计算粒子群速度
        v = w*v+c1*r1*(p-x)+c2*r2*(pg-x)
        #更新粒子群位置
        x = v + x
        #计算更新后的适应度
        fitness = f(x)
        #需更新个体
        update_id = np.greater(individual_best_fitness, fitness)
        #更新p
        p[update_id] = x[update_id]
        #更新个体最优适应度
        individual_best_fitness[update_id] = fitness[update_id]
        #更新全局最优位置与全局最优适应度
        if np.min(fitness) < global_best_fitness:
                    pg = x[np.argmin(fitness)]
                    global_best_fitness = np.min(fitness)    
    return pg
相关推荐
Tony聊跨境7 分钟前
独立站SEO类型及优化:来检查这些方面你有没有落下
网络·人工智能·tcp/ip·ip
懒惰才能让科技进步13 分钟前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
Qspace丨轻空间24 分钟前
气膜场馆:推动体育文化旅游创新发展的关键力量—轻空间
大数据·人工智能·安全·生活·娱乐
没有不重的名么25 分钟前
门控循环单元GRU
人工智能·深度学习·gru
love_and_hope29 分钟前
Pytorch学习--神经网络--搭建小实战(手撕CIFAR 10 model structure)和 Sequential 的使用
人工智能·pytorch·python·深度学习·学习
Chef_Chen32 分钟前
从0开始学习机器学习--Day14--如何优化神经网络的代价函数
神经网络·学习·机器学习
2403_875736871 小时前
道品科技智慧农业中的自动气象检测站
网络·人工智能·智慧城市
学术头条1 小时前
AI 的「phone use」竟是这样练成的,清华、智谱团队发布 AutoGLM 技术报告
人工智能·科技·深度学习·语言模型
准橙考典1 小时前
怎么能更好的通过驾考呢?
人工智能·笔记·自动驾驶·汽车·学习方法
ai_xiaogui1 小时前
AIStarter教程:快速学会卸载AI项目【AI项目管理平台】
人工智能·ai作画·语音识别·ai写作·ai软件