粒子群算法(个人学习记录)

一、粒子群算法简介

粒子群算法,也称粒子优化法或群觅算法Particle Swarm Optimization),  缩写为 PSO

通俗易懂讲算法-最优化之粒子群优化(PSO)_哔哩哔哩_bilibili学生,自制,课余更新(更新较慢)。其他算法课程点我头像,客官里边请。QQ : 1366420642Q群:1019030249 内含其他学习资料.(群暂满)PPT和代码以后我都会放到github,需要的同学自己下载吧https://github.com/CHENHUI-X/My-lecture-slides-and-code, 视频播放量 150725、弹幕量 737、点赞数 4822、投硬币枚数 4454、收藏人数 7752、转发人数 1475, 视频作者 青青草原灰太郎, 作者简介 师从李沐、李宏毅、吴恩达,Amazon&台大&斯坦福联合培养,相关视频:PSO(粒子群算法)可视化动画,(完全免费)40份智能算法免费送(粒子群算法,改进粒子群,蚁狮群,花授粉,人工生态,鸽子群,猎豹等),单目标粒子群 PSO(Particle Swarm Optimization),进化算法08:PSO粒子群算法基础+举例详细过程讲解(中英字幕)【个人强推】,粒子群算法入门&30分钟速成,粒子群算法可视化,12-作业调度优化问题的粒子群算法,遗传算法,有手就行,【局部版粒子群算法】与GPSO的区别以及LPSO邻域选择方法介绍,粒子群算法Python实现icon-default.png?t=N7T8https://www.bilibili.com/video/BV1uY41187rK/?spm_id_from=333.337.search-card.all.click&vd_source=0f6a98519e3b072f83a7d5e766899cb7

        粒子群优化算法是一种基于群体智能的优化算法,它模拟了一群鸟或昆虫在飞行时的群体行为,通过信息共享和互相合作来优化系统的行为。该算法应用范围广泛,例如在神经网络、数据挖掘、网络优化等领域都得到了广泛的应用。
        基本思想是将优化问题转换为粒子集合的搜索问题。在搜索空间中,每个粒子都代表一个候选解,而整个群体则代表一个解向量集合。每个粒子可以在搜索空间中进行移动,被吸引到当前最优解附近的位置。通过对领域和速度等参数的动态调整,可以逐步接近全局最优解。
        在该算法中,每个粒子的位置和速度可以视为搜索过程中的解和搜索方向,而每个粒子的能量或适应度函数则是评价解优劣的标准。每个粒子根据当前速度和临近的最优解调整位置,从而逐步优化解。算法模拟了群体的智能操作,即个体间的信息交流和合作,以实现全局优化。
        算法的实现主要涉及到初始化粒子、计算适应度值、更新速度和更新位置等步骤。在大多数应用中,使用惯性权重来控制粒子在搜索过程中的探索和利用能力,同时调整邻域参数来保持群体的协同性。
        具体的粒子群算法步骤如下:


        在算法的运算过程中,一般会引入惯性权重、加速系数和随机因素等参数来进行探索和利用的平衡。惯性权重控制粒子的惯性,控制着粒子的运动方向和速度。加速系数控制粒子的局部搜索和全局搜索的比例。随机因素用于在全局最优解和局部最优解之间平衡,控制着粒子的探索深度和速度。算法中不同的参数和具体实现方法可能会因应用领域和问题而异。

二、开始学习

1、问:已知A全局BC才能A处?

这个过程如何用数学表式描

1.某个粒子(点)的移,是大小有方向 的。

2.有大小,有方向的东西叫向

3.位置就是坐标。(1,1)=(2,3)+𝛼 𝛼 = (1,1) (2,3) = (−1, −2)

2、基本原理

        假设在一个D维的目标搜空间N个粒组成个群,其i个粒子表示为一个D维的向量:

                        Xi = ( xi1, xi 2 xiD ),i = 1, 2,  , N

i个粒子的飞行速度也一个D维的量,为:

                        Vi  = (vi1, vi 2 ,  viD ), i = 1, 2,  , N

在第t代的第i个粒子向第t+1代进时,据如式子新:

         

LOOK!!!!!

        假设某粒子当前位置C体极位置B局 最优位置A,那么该粒子下步的动状如 上图所示。

        B对应𝑝𝑖A对应𝑝𝑔黄色向量为当前度方 向,绿色向量为向个体值飞步长红色为 向全局最值飞行步长。

3、算法流程

输入: 参数𝜔:0.5 − 0.8, 𝑐1, 𝑐2:0.1 − 2, 𝑣𝑚𝑎𝑥, 𝑥𝑚𝑎𝑥:取决于优化函数

Step1:初始化种群𝑥

Step2: 计 算 个 体 适 应 度 *

 Step3:更新粒子速度−>更新粒子位置*

Step4:并计算新位置的适应度,若新位置适应度更高,则将该粒子的位置进行更新,否则不更新

Step5:判断是否满足终止条件* ,是则退出,否则返回Step2。 输出:输出最优值。

注:*1.一般的,我们优化目标是最小化一个函数值。所以个体计算出的函数值越小,适应度越高

1. max 𝑓 = min −𝑓

*2.注意更新速度后先进速度界检,一𝑣(𝑣 > 𝑣𝑚𝑎𝑥) = 𝑣𝑚𝑎𝑥位置同理。

*3.常见终止条件为定迭进化数、n代不变化

4、算法分析

 优点:1)原理比较简单,实现容易,参数少。

 缺点:1)易早熟收敛至局部最优、迭代后期收敛速度慢的。

解释:标准粒子群算法的参数是固定的。𝜔描述的是粒子的“惯性”,在进化前期𝜔应该大一些,保 证各个粒子独立飞行充分搜索空间,后期应该小一点,多向其他粒子学习。 𝑐1, 𝑐2分别向个体极值和全局 极值最大飞行步长。前期𝑐1应该大一些,后期𝑐2应该大一些,这样就能平衡粒子的全局搜索能力和局部搜 索能力。3个参数共同影响了粒子的飞行方向,导致即使其他粒子找到更好的,但是当前粒子惯性太大,  不能很快的飞向更优的位置。

针对标PSO的缺点,常有下的进:

1. 实现参数的自适 变化。
2. 引入一些其他机 ,比 随机 因素 速度 位置 边界 压缩 大速 等。
3. 结合其他智能优 算法 遗传 法、 疫算 、模 退火 法等 ,帮 粒子 出局 最优 改善收敛速度。

 5、举个例子吧

'''在这个示例中,我们定义了一个多元函数,该函数在实现粒子群优化算法时将被用到。
然后,我们定义粒子群优化算法的类,并实现了初始化、适应度函数、更新速度和位置等方法。
最后,我们在主函数中实例化该类,并调用方法运行算法,输出找到的最小函数值和对应的最优解。'''

import numpy as np


# 定义待优化函数
def function(x):
    for i in range(len(x)):
        return x[i] ** 2


# return x[0] ** 2 + x[1] ** 2 + x[2] ** 2 + x[3] ** 2 - np.cos(2 * np.pi * x[0]) - np.cos(2 * np.pi * x[1]) - np.cos(
# 2 * np.pi * x[2]) - np.cos(2 * np.pi * x[3]) + 4


# 定义粒子群算法
class PSO:
    def __init__(self, function, num_particles, dim, max_iter, x_min=-5.12, x_max=5.12, w=0.729, c1=1.494, c2=1.494):
        self.function = function  # 待优化函数
        self.num_particles = num_particles  # 粒子数目
        self.dim = dim  # 搜索空间维数
        self.max_iter = max_iter  # 最大迭代次数
        self.bounds = [(x_min, x_max) for i in range(dim)]  # 搜索空间边界
        self.w = w
        self.c1 = c1
        self.c2 = c2
        # 随机初始化粒子的位置和速度
        self.x = np.random.uniform(x_min, x_max, (num_particles, dim))
        self.v = np.zeros((num_particles, dim))
        # 初始化粒子的历史最优解和全局最优解
        self.pbest = self.x.copy()
        self.pbest_fitness = np.array([float('inf') for i in range(num_particles)])
        self.gbest = self.x[0]
        self.gbest_fitness = float('inf')

    # 计算当前粒子的适应度值
    def fitness(self, particle):
        return self.function(particle)

    # 更新速度和位置
    def update(self):
        for i in range(self.num_particles):
            r1, r2 = np.random.uniform(size=2)
            self.v[i] = self.w * self.v[i] + self.c1 * r1 * (self.pbest[i] - self.x[i]) \
                        + self.c2 * r2 * (self.gbest - self.x[i])
            self.x[i] += self.v[i]
            # 限制位置在搜索空间内
            for j in range(self.dim):
                self.x[i][j] = min(max(self.x[i][j], self.bounds[j][0]), self.bounds[j][1])
            fit = self.fitness(self.x[i])
            # 更新历史最优解和全局最优解
            if fit < self.pbest_fitness[i]:
                self.pbest_fitness[i] = fit
                self.pbest[i] = self.x[i]
                if fit < self.gbest_fitness:
                    self.gbest_fitness = fit
                    self.gbest = self.x[i]

    # 运行粒子群算法
    def run(self):
        for i in range(self.max_iter):
            self.update()
        return self.gbest, self.gbest_fitness


# 运行粒子群算法求解函数最优解
pso = PSO(function, 50, 4, 1000)
bestx, bestf = pso.run()

print("最小值为:", bestf)
print("最小值点的坐标是:", bestx)

运行结果如下:

  • 31
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值