粒子群优化算法PSO的理论只是及python代码实现

部分算法解释

代码下载链接

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

全局最优适应度值寻优结果

在这里插入图片描述

完整代码

# -*- coding:utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import math

def getweight():
    # 惯性权重
    weight = 1
    return weight

def getlearningrate():
    # 分别是粒子的个体和社会的学习因子,也称为加速常数
    lr = (0.49445,1.49445)
    return lr

def getmaxgen():
    # 最大迭代次数 300
    maxgen = 300
    return maxgen

def getsizepop():
    # 种群规模 50
    sizepop = 50
    return sizepop

def getrangepop():
    # 粒子的位置的范围限制,x、y方向的限制相同
    rangepop = (-2*math.pi , 2*math.pi) #  (-6.283185307179586, 6.283185307179586)
    return rangepop

def getrangespeed():
    # 粒子的速度范围限制
    rangespeed = (-0.5,0.5)
    return rangespeed

# 计算适应度值
def func(x):
    # x输入粒子位置
    # y 粒子适应度值
    # 适应度值计算函数
    if (x[0]==0)&(x[1]==0):
        y = np.exp((np.cos(2*np.pi*x[0])+np.cos(2*np.pi*x[1]))/2)-2.71289
    else:
        y = np.sin(np.sqrt(x[0]**2+x[1]**2))/np.sqrt(x[0]**2+x[1]**2)+np.exp((np.cos(2*np.pi*x[0])+np.cos(2*np.pi*x[1]))/2)-2.71289
    return y

def initpopvfit(sizepop):
    pop = np.zeros((sizepop,2)) # 0 矩阵,50 * 2
    v = np.zeros((sizepop,2)) # 0 矩阵,50 * 2
    fitness = np.zeros(sizepop)

    for i in range(sizepop):
        pop[i] = [(np.random.rand()-0.5)*rangepop[0]*2,(np.random.rand()-0.5)*rangepop[1]*2]
        v[i] = [(np.random.rand()-0.5)*rangespeed[0]*2,(np.random.rand()-0.5)*rangespeed[1]*2]
        fitness[i] = func(pop[i]) # pop[i] 为 x 的值
    return pop,v,fitness

def getinitbest(fitness,pop):
    # 群体最优的粒子位置及其适应度值
    gbestpop,gbestfitness = pop[fitness.argmax()].copy(),fitness.max()
    #个体最优的粒子位置及其适应度值,使用copy()使得对pop的改变不影响pbestpop,pbestfitness类似
    pbestpop,pbestfitness = pop.copy(),fitness.copy()

    return gbestpop,gbestfitness,pbestpop,pbestfitness  

# ++++++++ 1、自定义参数:+++++++++
# 惯性权重
w = getweight() # w1: 1
# 分别是粒子的个体和社会的学习因子,也称为加速常数
lr = getlearningrate()  # lr: (0.49445, 1.49445)
# 最大迭代次数
maxgen = getmaxgen() # maxgen: 300 ,即会产生 300 个粒子
# 种群规模
sizepop = getsizepop() # 50
# 粒子的位置的范围限制,x、y方向的限制相同
rangepop = getrangepop() # rangepop: (-6.283185307179586, 6.283185307179586)
# 粒子的速度范围限制
rangespeed = getrangespeed() # rangespeed: (-0.5, 0.5)
# pop 存储粒子的位置,v 为粒子速度,fitness 为适应度值
pop,v,fitness = initpopvfit(sizepop)  # 初始化 pop ,
# +++++++++++ 3、计算全局最优位置,全局最优适应度值,局部最优位置,局部最优适应度值 ++++++++
gbestpop,gbestfitness,pbestpop,pbestfitness = getinitbest(fitness,pop)

result = np.zeros(maxgen)
for i in range(maxgen):
    t=0.5
    #速度更新
    for j in range(sizepop):
        v[j] += lr[0]*np.random.rand()*(pbestpop[j]-pop[j])+lr[1]*np.random.rand()*(gbestpop-pop[j])
    v[v<rangespeed[0]] = rangespeed[0]
    v[v>rangespeed[1]] = rangespeed[1]

    #粒子位置更新
    for j in range(sizepop):
        pop[j] = t*(0.5*v[j])+(1-t)*pop[j]
    pop[pop<rangepop[0]] = rangepop[0]
    pop[pop>rangepop[1]] = rangepop[1]
    #适应度更新
    for j in range(sizepop):
        fitness[j] = func(pop[j])

    for j in range(sizepop):
        if fitness[j] > pbestfitness[j]:
            pbestfitness[j] = fitness[j]
            pbestpop[j] = pop[j].copy()
     
    if pbestfitness.max() > gbestfitness :
        gbestfitness = pbestfitness.max()
        gbestpop = pop[pbestfitness.argmax()].copy()

    result[i] = gbestfitness

plt.plot(result)
plt.show()
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个简单的粒子群优化算法Python实现代码。请注意,这只是一个示例,可以根据特定问题进行修改。 ```python import random # 定义问题,目标函数为 x^2 def objective_function(x): return x ** 2 # 定义粒子类 class Particle: def __init__(self, dims): self.position = [random.uniform(-5.0, 5.0) for _ in range(dims)] self.velocity = [0.0 for _ in range(dims)] self.best_position = self.position self.best_score = float('inf') def update_velocity(self, global_best_position, omega, phi_p, phi_g): for i in range(len(self.velocity)): r_p = random.random() r_g = random.random() cognitive = phi_p * r_p * (self.best_position[i] - self.position[i]) social = phi_g * r_g * (global_best_position[i] - self.position[i]) self.velocity[i] = omega * self.velocity[i] + cognitive + social def update_position(self): for i in range(len(self.position)): self.position[i] += self.velocity[i] def evaluate(self): score = objective_function(self.position) if score < self.best_score: self.best_position = self.position self.best_score = score # 定义PSO算法类 class PSO: def __init__(self, dims, num_particles, max_iter): self.dims = dims self.num_particles = num_particles self.max_iter = max_iter self.particles = [Particle(dims) for _ in range(num_particles)] self.global_best_position = self.particles[0].position self.global_best_score = float('inf') def optimize(self): for i in range(self.max_iter): for particle in self.particles: particle.evaluate() if particle.best_score < self.global_best_score: self.global_best_position = particle.best_position self.global_best_score = particle.best_score for particle in self.particles: particle.update_velocity(self.global_best_position, 0.5, 0.5, 0.5) particle.update_position() # 使用示例 pso = PSO(1, 10, 100) pso.optimize() print(pso.global_best_position) ``` 这里我们定义了一个简单的目标函数 `objective_function`,它的实现是 $x^2$。然后我们定义了一个 `Particle` 类来表示粒子,其中包括位置、速度、最佳位置和最佳得分。然后我们定义了一个 `PSO` 类来表示整个算法,其中包括粒子群、最大迭代次数和全局最佳位置和最佳得分。 在 `optimize` 方法中,我们首先遍历所有粒子并评估它们的得分。如果某个粒子的最佳得分比全局最佳得分更好,则更新全局最佳位置和最佳得分。然后我们再次遍历所有粒子,并更新它们的速度和位置。 最后,我们可以使用 `PSO` 类来解决特定问题。在这个示例中,我们使用 `PSO(1, 10, 100)` 来寻找一个一维函数的最小值,其中有10个粒子,最大迭代次数为100。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Performer_Cherry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值