粒子群算法Particle Swarm Optimization超详细解析+代码实例讲解

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注go)
img

正文

img

所以,粒子群算法就是把鸟看成一个个粒子,并且他们拥有位置和速度这两个属性,然后根据自身已经找到的离食物最近的解和参考整个共享于整个集群中找到的最近的解去改变自己的飞行方向,最后我们会发现,整个集群大致向同一个地方聚集。而这个地方是离食物最近的区域,条件好的话就会找到食物。

03 粒子抽象

3.1 关于速度和位置

粒子群算法通过设计一种无质量的粒子来模拟鸟群中的鸟,粒子仅具有两个属性:速度和位置,速度代表移动的快慢,位置代表移动的方向。

鸟被抽象为没有质量和体积的微粒(点),并延伸到N维空间,粒子i在N维空间的位置表示为矢量Xi=(x1,x2,…,xN),飞行速度表示为矢量Vi=(v1,v2,…,vN)。每个粒子都有一个由目标函数决定的适应值(fitness value),并且知道自己到目前为止发现的最好位置(pbest)和现在的位置Xi。这个可以看作是粒子自己的飞行经验。除此之外,每个粒子还知道到目前为止整个群体中所有粒子发现的最好位置(gbest)(gbest是pbest中的最好值),这个可以看作是粒子同伴的经验。粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。

3.2 速度和位置的更新

PSO初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次的迭代中,粒子通过跟踪两个“极值”(pbest,gbest)来更新自己。在找到这两个最优值后,粒子通过下面的公式来更新自己的速度和位置。

img

对于公式(1):

公式(1)的第①部分称为【记忆项】,表示上次速度大小和方向的影响;

公式(1)的第②部分称为【自身认知项】,是从当前点指向粒子自身最好点的一个矢量,表示粒子的动作来源于自己经验的部分;

公式(1)的第③部分称为【群体认知项】,是一个从当前点指向种群最好点的矢量,反映了粒子间的协同合作和知识共享。粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。

以上面两个公式为基础,再来看一个公式:

img

公式(2)和 公式(3)被视为标准PSO算法。

04 标准PSO算法流程

4.1 标准PSO算法的流程

1)初始化一群微粒(群体规模为N),包括随机位置和速度;

2)评价每个微粒的适应度;

3)对每个微粒,将其适应值与其经过的最好位置pbest作比较,如果较好,则将其作为当前的最好位置pbest;

4)对每个微粒,将其适应值与其经过的最好位置gbest作比较,如果较好,则将其作为当前的最好位置gbest;

5)根据公式(2)、(3)调整微粒速度和位置;

6)未达到结束条件则转第2)步。

迭代终止条件根据具体问题一般选为最大迭代次数Gk或(和)微粒群迄今为止搜索到的最优位置满足预定最小适应阈值。

4.2 PSO流程图解

img

4.3 学习因子c1、c2分析

公式(2)和(3)中pbest和gbest分别表示微粒群的局部和全局最优位置。

  • 当C1=0时,则粒子没有了认知能力,变为只有社会的模型(social-only):

img

称为全局PSO算法。粒子有扩展搜索空间的能力,具有较快的收敛速度,但由于缺少局部搜索,对于复杂问题 比标准PSO 更易陷入局部最优。

  • 当C2=0时,则粒子之间没有社会信息,模型变为只有认知(cognition-only)模型:

img

称为局部PSO算法。由于个体之间没有信息的交流,整个群体相当于多个粒子进行盲目的随机搜索,收敛速度慢,因而得到最优解的可能性小。

05 代码实例讲解

5.1 先来看个简单的实例

在这个例子中,我们选取了一个求解函数y=-x*(x-1) 在0,2上最大值的粒子群算法。然后通过步步跟踪算法输出结果,来给大家讲解粒子运动的过程。

下面先看代码和代码注释。

public class AlgorithmPSO {
int n=2; //粒子个数,这里为了方便演示,我们只取两个,观察其运动方向
double[] y;
double[] x;
double[] v;
double c1=2;
double c2=2;
double pbest[];
double gbest;
double vmax=0.1; //速度最大值
//适应度计算函数,每个粒子都有它的适应度
public void fitnessFunction(){
for(int i=0;i<n;i++){
y[i]=-1x[i](x[i]-2);
}
}
public void init(){ //初始化
x=new double[n];
v=new double[n];
y=new double[n];
pbest=new double[n];
/***

  • 本来是应该随机产生的,为了方便演示,我这里手动随机落两个点,分别落在最大值两边
    /
    x[0]=0.0;
    x[1]=2.0;
    v[0]=0.01;
    v[1]=0.02;
    fitnessFunction();
    //初始化当前个体最优位置,并找到群体最优位置
    for(int i=0;i<n;i++){
    pbest[i]=y[i];
    if(y[i]>gbest) gbest=y[i];
    }
    System.out.println(“算法开始,起始最优解:”+gbest);
    System.out.print(“\n”);
    }
    public double getMAX(double a,double b){
    return a>b?a:b;
    }
    //粒子群算法
    public void PSO(int max){
    for(int i=0;i<max;i++){
    double w=0.4;
    for(int j=0;j<n;j++){
    //更新位置和速度,下面就是我们之前重点讲解的两条公式。
    v[j]=w
    v[j]+c1Math.random()(pbest[j]-x[j])+c2Math.random()(gbest-x[j]);
    if(v[j]>vmax) v[j]=vmax;//控制速度不超过最大值
    x[j]+=v[j];

//越界判断,范围限定在[0, 2]
if(x[j]>2) x[j]=2;
if(x[j]<0) x[j]=0;

}
fitnessFunction();
//更新个体极值和群体极值
for(int j=0;j<n;j++){
pbest[j]=getMAX(y[j],pbest[j]);
if(pbest[j]>gbest) gbest=pbest[j];
System.out.println(“粒子n”+j+": x = “+x[j]+” "+"v = "+v[j]);
}
System.out.println(“第”+(i+1)+“次迭代,全局最优解 gbest = “+gbest);
System.out.print(”\n”);
}

}
//运行我们的算法
public static void main(String[] args){
AlgorithmPSO ts=new AlgorithmPSO();
ts.init();
ts.PSO(10);//为了方便演示,我们暂时迭代10次。
}

}

输出结果:

算法开始,起始最优解:0.0

粒子n0: x = 0.004 v = 0.004
粒子n1: x = 0.0 v = -4.065770842472382
第1次迭代,全局最优解 gbest = 0.007984

粒子n0: x = 0.01778510589090629 v = 0.013785105890906289
粒子n1: x = 0.0 v = -1.625639647649872
第2次迭代,全局最优解 gbest = 0.03525390179026183

粒子n0: x = 0.0610276658084214 v = 0.04324255991751511
粒子n1: x = 0.0 v = -0.6035255880722042
第3次迭代,全局最优解 gbest = 0.11833095562281844

粒子n0: x = 0.1610276658084214 v = 0.1
粒子n1: x = 0.0 v = -0.012719944703824898
第4次迭代,全局最优解 gbest = 0.29612542246113416

粒子n0: x = 0.2610276658084214 v = 0.1
粒子n1: x = 0.06231495466940402 v = 0.06231495466940402
第5次迭代,全局最优解 gbest = 0.4539198892994499

粒子n0: x = 0.3610276658084214 v = 0.1
粒子n1: x = 0.16231495466940402 v = 0.1
第6次迭代,全局最优解 gbest = 0.5917143561377656

粒子n0: x = 0.46102766580842136 v = 0.1
粒子n1: x = 0.262314954669404 v = 0.1
第7次迭代,全局最优解 gbest = 0.7095088229760813

粒子n0: x = 0.5610276658084213 v = 0.1
粒子n1: x = 0.362314954669404 v = 0.1
第8次迭代,全局最优解 gbest = 0.8073032898143969

粒子n0: x = 0.6610276658084213 v = 0.1
粒子n1: x = 0.462314954669404 v = 0.1
第9次迭代,全局最优解 gbest = 0.8850977566527127

粒子n0: x = 0.7610276658084213 v = 0.1
粒子n1: x = 0.562314954669404 v = 0.1
第10次迭代,全局最优解 gbest = 0.9428922234910285

现在我们来观察两个粒子的位移x在每一次迭代中的变化(离食物的距离)。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
变化(离食物的距离)。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-02abzJCt-1713237261207)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
粒子群算法(Particle Swarm Optimization,PSO)是一种优化算法,用于解决各种优化问题。下面是一个使用Python实现的粒子群算法代码示例: ```python import random class Particle: def __init__(self, dim): self.position = [random.uniform(-5, 5) for _ in range(dim)] self.velocity = [random.uniform(-1, 1) for _ in range(dim)] self.best_position = self.position.copy() self.best_fitness = float('inf') def update_velocity(self, global_best_position, w, c1, c2): for i in range(len(self.velocity)): r1 = random.random() r2 = random.random() cognitive_component = c1 * r1 * (self.best_position[i] - self.position[i]) social_component = c2 * r2 * (global_best_position[i] - self.position[i]) self.velocity[i] = w * self.velocity[i] + cognitive_component + social_component def update_position(self): for i in range(len(self.position)): self.position[i] += self.velocity[i] if self.position[i] < -5: self.position[i] = -5 elif self.position[i] > 5: self.position[i] = 5 def evaluate_fitness(self): # 这里根据具体的优化问题来定义适应度函数 x, y = self.position[0], self.position[1] fitness = (x - 2) ** 2 + (y - 3) ** 2 if fitness < self.best_fitness: self.best_fitness = fitness self.best_position = self.position.copy() def particle_swarm_optimization(dim, num_particles, max_iterations): particles = [Particle(dim) for _ in range(num_particles)] global_best_position = None global_best_fitness = float('inf') for _ in range(max_iterations): for particle in particles: particle.evaluate_fitness() if particle.best_fitness < global_best_fitness: global_best_fitness = particle.best_fitness global_best_position = particle.best_position.copy() for particle in particles: particle.update_velocity(global_best_position, 0.5, 1, 2) particle.update_position() return global_best_position, global_best_fitness # 示例使用二维空间中的粒子群算法来求解(x-2)^2 + (y-3)^2 的最小值 best_position, best_fitness = particle_swarm_optimization(2, 50, 100) print("Best position:", best_position) print("Best fitness:", best_fitness) ``` 这段代码实现了一个简单的粒子群算法,用于求解二维空间中函数 (x-2)^2 + (y-3)^2 的最小值。代码中的参数可以根据具体问题进行调整。在每次迭代中,粒子根据自身的速度和位置更新策略来更新自己的位置,并根据新位置计算适应度值。全局最优解是所有粒子中适应度值最小的解。最后,算法返回全局最优解的位置和适应度值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值