【群体智能优化算法】粒子群算法(PSO)入门实践

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)
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值