python 粒子群算法(PSO)Particle Swarm Optimization

Particle Swarm Optimization

# python-Particle Swarm Optimization
# coding=utf-8
import numpy as np
import matplotlib.pyplot as plt

def Schwefel(X):
    f = 418.9829 * len(X)
    for i in X:
        f -= i * np.sin(np.sqrt(np.abs(i)))
    return f

class Particle:
    def __init__(self, domain_position, domain_velocity, dim):
        self.pos = [np.random.uniform(-domain_position, domain_position) for i in range(dim)]
        self.vel = [np.random.uniform(-domain_velocity, domain_velocity) for i in range(dim)]
        self.solution_position = [0.0 for i in range(dim)]
        self.local_minimum = Schwefel(self.pos)

class PSO:
    def __init__(self, dim, size, domain_position, domain_velocity, C1=2, C2=2, weight=1):
        self.dim = dim
        self.size = size
        self.domain_position = domain_position
        self.domain_velocity = domain_velocity
        self.C1 = C1
        self.C2 = C2
        self.weight = weight
        self.global_minimum = float('INF')
        self.solution_position = [0.0 for i in range(dim)]
        self.ParticleSwarm = [Particle(self.domain_position, self.domain_velocity, self.dim) for i in range(self.size)]
        self.global_loss = []

    def fit(self, epochs):
        for i in range(epochs):
            for particle in self.ParticleSwarm:
                self.update_velocity(particle)
                self.update_position(particle)
            self.global_loss.append(self.global_minimum)

    def update_velocity(self, particle):
        for i in range(self.dim):
            val_temp = self.weight * particle.vel[i] + self.C1 * np.random.normal(0, 1) * (particle.solution_position[i] - particle.pos[i]) + self.C2 * np.random.normal(0, 1) * (self.solution_position[i] - particle.pos[i])
            if val_temp > self.domain_velocity:
                val_temp = self.domain_velocity
            elif val_temp < -self.domain_velocity:
                val_temp = -self.domain_velocity
            particle.vel[i] = val_temp

    def update_position(self, particle):
        for i in range(self.dim):
            particle.pos[i] = particle.pos[i] + particle.vel[i]
            local_minimum = Schwefel(particle.pos)
        if local_minimum < particle.local_minimum:
            particle.local_minimum = local_minimum
            for i in range(self.dim):
                particle.solution_position[i] = particle.pos[i]
        if local_minimum < self.global_minimum:
            self.global_minimum = local_minimum
            for i in range(self.dim):
                self.solution_position[i] = particle.pos[i]

if __name__ == "__main__":
    np.random.seed(8)
    dim = 2
    size = 10
    epochs = 1000
    domain_position = 500
    domain_velocity = 0.15
    model = PSO(dim, size, domain_position, domain_velocity)
    model.fit(epochs)
    print("Solution position:", model.solution_position)
    print("Global minimum: %f" % Schwefel(model.solution_position))
    plt.plot(model.global_loss, "-r", linewidth=2, label='loss')
    plt.legend()
    plt.grid(True)
    plt.show()
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
粒子群优化算法 (particle swarm optimization, PSO) 是一种基于群体智能的优化算法,其算法原理可以概括为以下几个步骤: 1. 初始化一群粒子的位置和速度,并随机分配其初始位置和速度。 2. 计算每个粒子的适应度值,并根据适应度值更新每个粒子的最佳位置和全局最佳位置。 3. 根据每个粒子的最佳位置和全局最佳位置,更新粒子的速度和位置。 4. 判断是否满足停止条件,若满足则输出结果,否则回到第 2 步。 具体来说,PSO 算法的每个粒子都有一个位置向量和一个速度向量。在算法的每一轮迭代中,粒子的速度和位置会根据以下公式进行更新: $v_{i}(t+1)=wv_{i}(t)+c_{1}r_{1}(p_{i}-x_{i}(t))+c_{2}r_{2}(p_{g}-x_{i}(t))$ $x_{i}(t+1)=x_{i}(t)+v_{i}(t+1)$ 其中,$v_{i}(t)$ 表示粒子 $i$ 在时间 $t$ 的速度向量,$x_{i}(t)$ 表示粒子 $i$ 在时间 $t$ 的位置向量,$p_{i}$ 表示粒子 $i$ 的历史最佳位置,$p_{g}$ 表示全局最佳位置,$w$、$c_{1}$ 和 $c_{2}$ 是常数,$r_{1}$ 和 $r_{2}$ 是 $[0,1]$ 之间的随机数。 在算法的每轮迭代中,粒子的速度和位置会不断地更新,直到满足停止条件为止。通常,停止条件可以是达到最大迭代次数、适应度值达到一定阈值等。 PSO 算法通过模拟鸟群、鱼群等群体的行为,将一群粒子看作是搜索空间中的一个个潜在解,通过不断更新粒子的位置和速度,最终找到全局最优解或近似最优解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值