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的部分

结果如下:

粒子群算法过程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/275609.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

众和策略股市行情分析:股票开户后什么时候能交易?

股票开户后什么时候能生意&#xff1f; 股票开户后不才一生意日便能正常展开生意操作&#xff0c;包含申报股票生意及非生意事务。假设投资者是周五或接近节假期时结束的开户&#xff0c;就要不才周一或假期结束后才华进行生意。 当然&#xff0c;假设投资者注册的是一些特别…

BDD - Python Behave 配置文件 behave.ini

BDD - Python Behave 配置文件 behave.ini 引言behave.ini配置参数的类型配置项 behave.ini 应用feature 文件step 文件创建 behave.ini执行 Behave 引言 前面文章 《BDD - Python Behave Runner Script》就是为了每次执行 Behave 时不用手动敲一长串选项&#xff0c;其实还有…

《深入理解C++11:C++11新特性解析与应用》笔记四

第四章 新手易学&#xff0c;老兵易用 4.1 右尖括号>的改进 在 C98 中&#xff0c;有一条需要程序员规避的规则:如果在实例化模板的时候出现了连续的两个右尖括号 >&#xff0c;那么它们之间需要一个空格来进行分隔&#xff0c;以避免发生编译时的错误。C98 会将>&g…

【量化】蜘蛛网策略复现

文章目录 蜘蛛网策略研报概述持仓数据整理三大商品交易所的数据统一筛选共有会员清洗数据计算研报要求数据全部代码 策略结果分析无参数策略有参数策略正做反做 MSD技术指标化 蜘蛛网策略 策略来自《东方证券-股指期货趋势交易之蜘蛛网策略——从成交持仓表中捕捉知情投资者行为…

腾讯云轻量应用服务器详细介绍

腾讯云轻量应用服务器开箱即用、运维简单的轻量级云服务器&#xff0c;CPU内存带宽配置高并且价格特别优惠&#xff0c;轻量2核2G3M带宽62元一年、2核2G4M优惠价118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;756元3年、4核8G12M带宽646元15个月等&#xf…

Linux操作系统:LVM与磁盘配额

目录 一、LVM逻辑卷管理基础 1、LVM逻辑卷管理的概念 2、LVM逻辑卷管理的核心组件 3、LVM逻辑卷管理的优势 4、LVM逻辑卷管理的命令 4.1 扫描命令的用法 4.1.1 pvscan 4.1.2 vgscan 4.1.3 lvscan 4.2 查看命令的用法 4.2.1 pvdisplay 4.2.2 vgdisplay 4.2.3 lvdis…

12.27_黑马数据结构与算法笔记Java(补2)

目录 279 0-1 背包问题 动态规划 实现 280 0-1 背包问题 动态规划 降维 281 完全背包问题 动态规划 分析 282 完全背包问题 动态规划 实现 283 零钱兑换问题 动态规划 分析 284 零钱兑换问题 动态规划 实现 285 零钱兑换问题 动态规划 降维 286 零钱兑换II 动态规划 分析…

【idea】运行工程时候卡了许久Java Method Breakpoints

老以为是数据库连接不上&#xff0c;此问题概率性小&#xff0c;操作上面不小心打了断点… 应该是打断点的时候&#xff0c;打到了方法上面&#xff0c;去掉哟 Java Method Breakpoints

C++day2作业

把课上strcut的练习&#xff0c;尝试着改成class #include <iostream>using namespace std; class Stu { private:int age;string sex;int hign; public:int soce;void get_information();void set_information(); }; void Stu::set_information() {static Stu s1;cout …

C++ DAY2作业

1.课堂struct练习&#xff0c;用class&#xff1b; #include <iostream>using namespace std;class Stu { private:int age;char sex;int high; public:double score;void set_values(int a,char b,int c,double d);int get_age();char get_sex();int get_high(); }; vo…

「从红月开始」运输公司遭精神污染,小十七救哥哥,事发地陷危机

Hello,小伙伴们&#xff0c;我是拾荒君。 国漫《从红月开始》第3集超前爆料&#xff0c;本次透露陆辛首次被派遣去调查精神污染的任务。他的目的地是四方运输公司&#xff0c;一个主要由亡命之徒组成的组织。他们表面上从事运输业务&#xff0c;但背地里进行偷渡和走私活动。 …

【CSAPP】探究BombLab奥秘:Phase_2的解密与实战

&#x1f4cb; 前言 ​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《斯坦福大学之CSAPP》⏰诗赋清音&#xff1a;桃花灼灼春风暖&#xff0c;心随乐曲扬徐徐。 苦尽甘来梦未阑&#xff0c;岁月长河任舟游。 ​ &#x1f389;欢迎…

cnPuTTY 0.80.0.1—PuTTY Release 0.80中文版本简单说明~~

2023-12-18 官方发布了PuTTY 0.80本次发布主要是针对Terrapin攻击(CVE-2023-48795)的修改发布。 更多详细的内容请查看PuTTY Change Log。 有关Terrapin攻击可用简单参考&#xff1a;警告&#xff01;&#xff01;&#xff01;Terrapin攻击(CVE-2023-48795)~~~ 为了缓解此漏洞…

【线性代数】通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗?

一、通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗&#xff1f; 如果你进行的矩阵乘法涉及一个线性方程组 Ax b&#xff0c;并且你乘以一个可逆矩阵 M&#xff0c;且产生新的方程组 M(Ax) Mb&#xff0c;那么这两个系统是等价的&#xff1b;它们具有相同的解集。这…

【unity3D-粒子系统】粒子系统主模块-Particle System篇

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的粒子系统主模块-Particle System 基础知识 Particle System 介绍&#xff1a;粒子系统的主模块&#xff0c;是必需的模块&#x…

在线客服系统推荐:提升客户满意度与工作效率的利器

客服系统分为售前和售后&#xff0c;售前客户系统是为了能够及时解决客户在购买产品前的问题&#xff0c;通过客服人员让客户了解产品的功能点是能够满足他们的需求点&#xff0c;从未达到转化的目的。 而售后客户系统主要是提供给购买后的客户强大的产品售后支持&#xff0c;…

PiflowX组件-DataGen

DataGen组件 组件说明 按数据生成规则模拟数据。在开发和演示场景下使用比较方便。具体可以查看Flink官方DataGen connector。 计算引擎 flink 有界性 字段的数据全部生成完成后&#xff0c;source 就结束了。 因此&#xff0c;有界性取决于字段的有界性。 组件分组 co…

SQL Server 索引和视图

CSDN 成就一亿技术人&#xff01; 难度指数&#xff1a;* * * CSDN 成就一亿技术人&#xff01; 目录 1.索引 什么是索引&#xff1f; 索引的作用&#xff1f; 索引的分类 1. 唯一索引 2. 主键索引 3. 聚集索引 4.非聚集索引 5.复合索引 6.全文搜索 索引的创建&am…

Springboot拦截器及统一异常处理

文章目录 一、Java中异常相关概念1、异常类2、异常处理方法3、注意事项4、自定义异常 二、配置全局异常处理1、统一返回体定义2、定义异常处理实现类3、全局异常处理类 三、Springboot拦截器1、定义拦截器2、注册拦截器 四、验证效果 一、Java中异常相关概念 1、异常类 Throw…

C语言—每日选择题—Day64

前言 两天没更新了&#xff0c;作者在复习期末考试&#xff0c;更新一波&#xff0c;祝大家都能顺利通过期末考试&#xff01;&#xff01;&#xff01; 指针相关博客 打响指针的第一枪&#xff1a;指针家族-CSDN博客 深入理解&#xff1a;指针变量的解引用 与 加法运算-CSDN博…
最新文章