1.群体智能
群体智能源于对以蚂蚁、蜜蜂等为代表的社会性昆虫的群体行为的研究。最早被用在细胞机器人系统的描述中。它的控制是分布式的,不存在中心控制。群体具有自组织性。
群体智能优化算法主要模拟了昆虫、兽群、鸟群和鱼群的群集行为,这些群体按照一种合作的方式寻找食物,群体中的每个成员通过学习它自身的经验和其他成员的经验来不断地改变搜索的方向。 群体智能优化算法的突出特点就是利用了种群的群体智慧进行协同搜索,从而在解空间内找到最优解。
一般情况下,群体智能应当遵循的5条基本原则:
(1) 临近原则:群体能够进行简单的空间计算和时间计算。
(2) 品质原则:群体能够响应环境中的品质因子。
(3) 多样性反应原则:群体的行动范围不应该太窄。
(4) 稳定性原则:群体不应当在每次环境变化的时候都改变自身的行为。
(5) 适应性原则:在所需代价不太高的情况下,群体能够在适当的时候改变自身的行为。
2.粒子群优化算法(PSO)
https://ieeexplore.ieee.org/abstract/document/494215
粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由J. Kennedy和R. C. Eberhart提出,源于对鸟群捕食的行为研究 。该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型。粒子群算法在对动物集群活动行为观察基础上,利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得最优解。
参考:https://icode.best/i/29510734896984
PSO流程图与伪代码:
通过实例理解简单的PSO实现
一个简单的粒子群优化算法入门程序,求(x1-1)2+(x2-2)^2的最小值
#粒子群优化算法
import math
import numpy as np
#粒子
class particle:
def __init__(self):
self.pos = (0, 0) # 粒子当前位置
self.speed = (0, 0)
self.pbest = (0, 0) # 粒子历史最好位置
self.res = 9999
class PSO:
def __init__(self):
self.w = 0.5 # 惯量权重
self.c1 = 1
self.c2 = 1
self.gbest = (0, 0) # 种群当前最好位置
self.N = 3000 # 种群中粒子数量
self.POP = [] # 种群
self.iter_N = 100 # 迭代次数
self.score = 10000
# 适应度值计算函数
def fitness(self, x):
return (math.pow(x[0],2) + math.pow(x[1],2) - 2*x[0] - 4*x[1] + 5)
# 找到全局最优解
def g_best(self, pop):
for bird in pop:
if self.fitness(bird.pbest) < self.fitness(self.gbest):
x = bird.pbest[0]
y = bird.pbest[1]
self.gbest = (x,y)
# 初始化种群
def initPopulation(self, pop, N):
for i in range(N):
bird = particle()#初始化鸟
a = np.random.uniform(-10, 10)#均匀分布
b = np.random.uniform(-10, 10) # 均匀分布
bird.pos = (a,b)
bird.pbest = bird.pos
bird.res = self.fitness(bird.pbest)
a = np.random.uniform(-3, 3) # 均匀分布
b = np.random.uniform(-3, 3) # 均匀分布
bird.speed = (a,b)
pop.append(bird)
# 找到种群中的最优位置
self.g_best(pop)
# 更新速度和位置
def update(self, pop):
for bird in pop:
# 速度更新
speedX = self.w * bird.speed[0] + \
self.c1 * np.random.random() * \
(bird.pbest[0] - bird.pos[0]) \
+ self.c2 * np.random.random() * (self.gbest[0] - bird.pos[0])
speedY = self.w * bird.speed[1] + self.c1 * np.random.random() * (
bird.pbest[1] - bird.pos[1]) + self.c2 * np.random.random() * (
self.gbest[1] - bird.pos[1])
speed=(speedX, speedY)
# 位置更新
posX = bird.pos[0] + speedX
posY = bird.pos[1] + speedY
if -10 < posX < 10 and -10 < posY < 10: # 必须在搜索空间内
bird.pos = (posX, posY)
bird.speed = speed
# 更新适应度
bird.res = self.fitness(bird.pos)
# 是否需要更新本粒子历史最好位置
if bird.res < self.fitness(bird.pbest):
bird.pbest = bird.pos
# 最终执行
def implement(self):
# 初始化种群
self.initPopulation(self.POP, self.N)
# 迭代
for i in range(self.iter_N):
# 更新速度和位置
self.update(self.POP)
# 更新种群中最好位置
self.g_best(self.POP)
pso = PSO()
pso.implement()
print(pso.gbest)