基于 Python 实现的粒子群算法【100011184】

粒子群寻优

1 算法介绍

粒子群算法(particle swarm optimization,PSO)的思想源于对鸟/鱼群捕食行为的研究,模拟鸟集群飞行觅食的行为,鸟之间通过集体的协作使群体达到最优目的。

粒子群寻优算法作以下假设:

  1. 每个寻优的问题解都被想像成一只鸟,称为“粒子”。所有粒子都在一个 D 维空间进行搜索。
  2. 所有的粒子都由一个 fitness function 确定适应值以判断目前的位置好坏。
  3. 每一个粒子必须赋予记忆功能,能记住所搜寻到的最佳位置。
  4. 每一个粒子还有一个速度以决定飞行的距离和方向。这个速度根据它本身的飞行经验以及同伴的飞行经验进行动态调整。

传统的粒子群寻优算法的位置更新公式如下

每一只鸟会根据自身速度惯性、自身最佳位置和群体最佳位置来决定下一时刻的速度(包括大小和方向),并根据速度来更新位置。

当应用 PSO 来解决 TSP 问题时需要进行一些改进,将多维的城市列表信息转换为一种坐标信息,并在此基础上定义相应的速度、加速度等。这些研究在卞锋的《粒子群优化算法在 TSP 中的研究及应用》和《求解 TSP 的改进 QPSO 算法》两篇文章中有详细介绍。其中最重要的一个概念是交换序,相当于传统 PSO 中的速度。在进行了这些改进之后就可以将 PSO 算法应用于 TSP 问题中了。

2 实验代码

3 实验结果

下面是进行 500 次迭代后的结果,求出的最优解是 11198

为避免计算过程的偶然性,下面进行 10 次重复实验并求平均值。

上图横坐标是迭代次数,纵坐标是距离,红色曲线是每次迭代最接近食物的鸟(也就是本次迭代的最优解,食物的位置也就是最优解城市序列所构成的坐标),蓝色曲线是每次迭代所有鸟的平均距离。可以看出不同于遗传算法,最初的最优解具有波动性,并不是一直下降的(遗传算法之所以一直下降是因为每次都保留的最优个体直接传到下一代)出现这种情况的原因是,最开始阶段所有鸟都是随机分散的,大家离食物的距离都差不多,就算是距离食物最近的鸟其能提供的信息的参考价值也不大。所以在开始的一段时间内最优位置的鸟在波动,而到后期,当食物位置更加确定之后,其波动性就消失了。

从趋势来看,无论是每次迭代的最优距离还是大家的平均距离,整体都是呈现下降趋势的,也就是说整个群体都是在朝着食物的位置移动。

4 实验总结

1、在阅读完卞锋的两篇文章,并用他的方法将 PSO 应用于解决 TSP 问题后,让我认识到原来一种算法并不是拘泥于解决特定的一类问题,将算法与实际情况相结合,然后进行抽象和类比就能应用于新的问题的解决。这种抽象和类比的思维非常让我惊讶,我要好好学习。

2、引入遗传算法的变异操作

起初完成 PSO 时,测试发现很容易陷入离最优解较远的局部最优。在参考卞锋的《求解 TSP 的改进 QPSO 算法》后引入相关变异操作,从而解决了这个问题。

他提出的贪婪倒立变异很有意思。贪婪倒立变异是指找到一个城市,再找到离他最近的城市,然后将城市序列中两个城市之间的序列进行倒序排列。这样能够在实现优化了所选两个城市的距离的同时,保证其他城市顺序尽量不变化。

不知道作者是怎么想到这种变异方法的。我在看完文章后首先想到的是染色体变异中的倒位,也就是染色体中的一段旋转 180 度放回原来位置。染色体的倒位变异和作者提到的贪婪倒立变异非常相似。可能作者也是借鉴自然界的染色体变异吧,再次感叹自然界的智慧无穷。

传统的 PSO 没有变异操作,这种引入变异的操作是借鉴遗传算法的。可见吸收借鉴其他算法的精华,能够提升自身算法的效率。

♻️ 资源

在这里插入图片描述

大小: 9.16KB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87547847
注:如当前文章或代码侵犯了您的权益,请私信作者删除!

猜你喜欢

转载自blog.csdn.net/s1t16/article/details/131320813
今日推荐