粒子群算法研究(2)

 |
总阅读量


接上一篇问题,运用标准粒子群算法进行求解分析:

求函数$y=1-cos(3x)e^{-x}$在$[0,4]$上的最大值

下面是算法的参数与需要的数据结构:

# 标准粒子群算法参数
W = 1               # 惯性权重
C1 = 2.8            # 认知
C2 = 1.3            # 社会
Pi = []             # 第i个粒子搜索到的历史最优位值
Pifitness = []      # 记录第i个粒子搜索到的历史最优值
Pg = 0              # 整个粒子群搜索到的最优位值
Pgfitness = 0       # 记录整个粒子群搜索到的最优值
intervalMin = 0     # 种群搜索区间下限
intervalMax = 4     # 种群搜索区间上限
Vmin = -0.001       # 粒子的速度下限
Vmax = 0.001        # 粒子的速度上限
swam = []           # 种群
ParFitness = []     # 种群适应值
ParVelocity = []    # 记录粒子i速度
N = 3               # 粒子个数
T = 30              # 迭代次数
record = []         # 记录粒子群每一代粒子群
table = []          # 记录每一代粒子群最优适应值

用三个一维粒子进行迭代,若粒子位置或速度超过边界,则对其重新进行初始化。下面对结果进行分析:

迭代10次


1.1 粒子群最优值随迭代次数变化情况


1.2 3个粒子迭代10次分布情况


  可见迭代10次,局部搜索还未能进一步发现最优值,增加迭代次数看看。

迭代20次


2.1 粒子群最优值随迭代次数变化情况


2.2 3个粒子迭代20次分布情况


  迭代20次粒子对局部最优进一步挖掘,得到了更好的解。

迭代30次


3.1 粒子群最优值随迭代次数变化情况


3.2 3个粒子迭代30次分布情况


  效果对比迭代20次并没有多大提升。当然由于目标函数太过简单,所以粒子个数及粒子的维数并不大,算法复杂度也不高。其实这样也很好,初学时从简单一点的问题着手,一点一点在解决问题中深化认识。

总结

在编程过程中对算法理解加深了一个层次,对优化算法而言,在设计实现时要按照以下流程来:

  1. 确定算法需要的参数及其数值
  2. 确定算法所用的数据结构以及输出
  3. 设计实现算法时需要的接口
  4. 算法主程序
  5. 调参
  6. 分析结果

  在这里分析还是做的不是多么好,但是因为问题比较简单,没有分析价值,所以只将结果进行对比即可。整个实现的Python代码见我的GitHub