python 实现粒子群算法(带绘制)

本文章用python实现了粒子群算法,

标准PSO的算法流程如下:

  1. 初始化一群微粒(群体规模为m),包括随机的位置和速度;
  2. 评价每个微粒的适应度;
  3. 对每个微粒,将它的适应值和它经历过的最好位置pbest的作比较,如果较好,则将其作为当前的最好位置pbest;
  4. 对每个微粒,将它的适应值和全局所经历最好位置gbest的作比较,如果较好,则重新设置gbest的索引号;
  5. 根据方程变化微粒的速度和位置;
  6. 如未达到结束条件(通常为足够好的适应值或达到一个预设最大代数Gmax),回到2)。

 公式为:

# 速度 = 速度 + 学习因子(c1)*rand(0~1)*(最好位置-当前位置)+学习因子(c2)*rand(0~1)*(群体最好位置-当前位置)
# 位置 = 位置+速度

代码如下:

import math
import random
import matplotlib.pyplot as plt
import numpy as np


def initialization(n, v_m, x_1, x_2):  # 初始化粒子群(鸟群)
    p = []
    for i in range(n):
        p.append([random.uniform(-5, 5), random.uniform(-0.5, 0.5), 0, 0, -float('Inf')])  # 位置,速度,当前值,最好位置,最好值
    return p


def fun(x):  # 适应度,这里求最大值
    # ⁅𝑥^3+2𝑥^2−𝑒^𝑥−10𝑥⁆        可以扔win10计算器里看看长什么样(-5~5)
    return pow(x, 3) + 2 * pow(x, 2) - pow(math.e, x) - 10 * x


def PSO(particle, p_number, v_max, x_max, x_min, loop_max, c1, c2, fig):
    all_good = 0  # 群体最好值的粒子索引
    loop = 0
    while True:
        # 计算所有粒子的值,并更新最好结果
        for i in range(p_number):
            particle[i][2] = fun(particle[i][0])
            if particle[i][2] > particle[i][4]:
                particle[i][3] = particle[i][0]
                particle[i][4] = particle[i][2]
                if particle[i][4] > particle[all_good][4]:  # 超过自己的最优值才能超越群体的最优值
                    all_good = i
        Plt_PSO(fig, particle, x_max, x_min, all_good)  # 绘制图形
        if loop >= loop_max:  # 循环终止条件
            break
        loop += 1
        # 更新速度和位置
        # 速度 = 速度 + 学习因子(c1)*rand(0~1)*(最好位置-当前位置)+学习因子(c2)*rand(0~1)*(群体最好位置-当前位置)
        # 位置 = 位置+速度
        for i in range(p_number):
            particle[i][1] += c1 * random.random() * (particle[i][3] - particle[i][0]) + c2 * random.random() * (
                    particle[all_good][3] - particle[i][0])
            if particle[i][1] > v_max:  # 限制最大速度
                particle[i][1] = v_max
            elif particle[i][1] < -v_max:
                particle[i][1] = -v_max
            particle[i][0] += particle[i][1]
            if particle[i][1] > x_max:  # 限制位置范围
                particle[i][1] = x_max
            elif particle[i][1] < x_min:
                particle[i][1] = x_min
    pass


def Plt_PSO(fig, particle, x_max, x_min, all_good):  # 绘制训练过程
    # 清除上次绘图
    fig.clf()
    # 设置显示范围
    plt.xlim(x_min, x_max)
    scatter_x = [i[0] for i in particle]
    scatter_y = [i[2] for i in particle]
    plt.scatter(scatter_x, scatter_y, c='b', alpha=0.5)  # 绘点散点
    plt.scatter(particle[all_good][3], particle[all_good][4], c='r', alpha=0.8)  # 最好的结果
    plot_x = np.linspace(x_min, x_max, (x_max - x_min) * 20)
    plot_y = [fun(x) for x in plot_x]
    plt.plot(plot_x, plot_y)    # 曲线
    # 刷新图形
    plt.draw()
    plt.pause(0.5)


v_max = 0.25  # 粒子最大速度
x_max = 5  # 最右边界
x_min = -5  # 最左边界
p_number = 10  # 粒子数目
loop_max = 20  # 循环轮数
c1 = 2  # 个体经验系数
c2 = 2  # 群体经验系数
particle = initialization(p_number, v_max, x_max, x_min)
fig = plt.figure()
plt.pause(1)  # 方便录像用,开窗口后等1秒再出图,你们建议删去
# 结果中,蓝色点就是粒子点,红色的是整个群体到达过的最佳点。
PSO(particle, p_number, v_max, x_max, x_min, loop_max, c1, c2, fig)
plt.show()

所用函数形状为:

这里取-5~5的部分

结果如下:

粒子群算法过程

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验目的: 通过编写Python程序,使用粒子群算法(PSO)解决优化问题,进一步理解和掌握粒子群算法的原理和应用。 实验要求: 1. 确保已经安装好Python编程环境,并具备基本的编程能力。 2. 了解粒子群算法的基本原理和流程。 3. 编写Python程序实现粒子群算法。 4. 设计合适的优化问题,用编写的粒子群算法求解,并给出实验结果。 5. 实验结果包括最终求解的最优解及其适应值,以及迭代过程中的最优解变化情况。 实验步骤: 1. 了解粒子群算法的基本原理和流程,包括粒子的表示、适应度计算、速度更新、位置更新等步骤。 2. 根据粒子群算法的原理,编写Python程序实现粒子群算法。 3. 根据实验要求,设计一个适当的优化问题,比如求解函数的最小值或者最大值。 4. 在编写的程序中定义适应度函数、速度和位置的更新函数,以及终止条件等。 5. 设置合适的参数,包括粒子数目、迭代次数、惯性权重等,进行实验运行。 6. 分析实验结果,记录最优解及其适应值,绘制迭代过程中的最优解变化曲线。 实验报告: 实验报告应包括以下内容: 1. 实验目的、要求和步骤的简要说明。 2. 粒子群算法的原理和流程的介绍。 3. 设计的优化问题的详细描述。 4. 程序的实现过程,包括适应度函数、速度和位置的更新函数等的代码实现。 5. 实验结果的展示和分析,包括最优解及其适应值的展示、最优解变化曲线的绘制等。 6. 对实验结果的总结和展望,包括算法的优缺点、改进方向等。 7. 程序代码的附录,确保代码清晰完整。 总之,通过本次实验,学生将在实践中理解粒子群算法的原理和应用,培养编程和问题求解能力,并能独立设计和实现基于粒子群算法的优化算法

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值