PSO(PSO——Particle Swarm Optimization)(基于种群的随机优化技术算法)
粒子群算法模仿昆虫、兽群、鸟群和鱼群等的群集行为,这些群体按照一种合作的方式寻找食物,群体中的每个成员通过学习它自身的经验和其他成员的经验来不断改变其搜索模式。
概述请见:
http://www.omegaxyz.com/2017/05/04/introductionofpso/
MATLAB代码请见:http://www.omegaxyz.com/2018/01/17/matlab_pso/
Python3代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# coding: utf-8 import numpy as np import random import matplotlib.pyplot as plt # ----------------------PSO参数设置--------------------------------- class PSO(): def __init__(self, pN, dim, max_iter): self.w = 0.8 self.c1 = 2 self.c2 = 2 self.r1 = 0.6 self.r2 = 0.3 self.pN = pN # 粒子数量 self.dim = dim # 搜索维度 self.max_iter = max_iter # 迭代次数 self.X = np.zeros((self.pN, self.dim)) # 所有粒子的位置和速度 self.V = np.zeros((self.pN, self.dim)) self.pbest = np.zeros((self.pN, self.dim)) # 个体经历的最佳位置和全局最佳位置 self.gbest = np.zeros((1, self.dim)) self.p_fit = np.zeros(self.pN) # 每个个体的历史最佳适应值 self.fit = 1e10 # 全局最佳适应值 # ---------------------目标函数Sphere函数----------------------------- def function(self, X): return X**2-4*X+3 # ---------------------初始化种群---------------------------------- def init_Population(self): for i in range(self.pN): for j in range(self.dim): self.X[i][j] = random.uniform(0, 1) self.V[i][j] = random.uniform(0, 1) self.pbest[i] = self.X[i] tmp = self.function(self.X[i]) self.p_fit[i] = tmp if tmp < self.fit: self.fit = tmp self.gbest = self.X[i] # ----------------------更新粒子位置---------------------------------- def iterator(self): fitness = [] for t in range(self.max_iter): for i in range(self.pN): # 更新gbest\pbest temp = self.function(self.X[i]) if temp < self.p_fit[i]: # 更新个体最优 self.p_fit[i] = temp self.pbest[i] = self.X[i] if self.p_fit[i] < self.fit: # 更新全局最优 self.gbest = self.X[i] self.fit = self.p_fit[i] for i in range(self.pN): self.V[i] = self.w * self.V[i] + self.c1 * self.r1 * (self.pbest[i] - self.X[i]) + \ self.c2 * self.r2 * (self.gbest - self.X[i]) self.X[i] = self.X[i] + self.V[i] fitness.append(self.fit) print(self.X[0], end=" ") print(self.fit) # 输出最优值 return fitness # ----------------------程序执行----------------------- my_pso = PSO(pN=30, dim=1, max_iter=100) my_pso.init_Population() fitness = my_pso.iterator() # -------------------画图-------------------- plt.figure(1) plt.title("Figure1") plt.xlabel("iterators", size=14) plt.ylabel("fitness", size=14) t = np.array([t for t in range(0, 100)]) fitness = np.array(fitness) plt.plot(t, fitness, color='b', linewidth=3) plt.show() |
注意pN是指初始种群,一般来说初始种群越大效果越好
dim是优化的函数维度,常见的初等函数和初等复合函数都是1维
max_iter是迭代次数
本文的优化函数是x^2-4x+3,显然这个函数在x=2时取最小值-1
验证:
迭代图像:
迭代的最后可以看到结果:
当然多维函数只需要改变dim和函数表达式就好了!
参考资料:http://blog.csdn.net/kunshanyuz/article/details/63683145
第25行不是sphere函数,那个注释可以忽略
博主你好,请问你这里为什么每次只打印第1个粒子呢?而不是打印最优的那个粒子?
你可以打印最优的那个粒子
打印最优粒子的话,感觉代码要改很多~
想问一下,边界条件处理如何实现
你可以百度搜搜带约束问题的PSO算法的一般解决方法