遗传算法与深度学习实战(12)——粒子群优化详解与实现

news2024/12/24 10:14:07

遗传算法与深度学习实战(12)——粒子群优化详解与实现

    • 0. 前言
    • 1. 粒子群优化
      • 1.1 粒子群优化原理
      • 1.2 算法流程
    • 2. 实现 PSO 解决方程
      • 2.1 问题描述
      • 2.2 代码实现
    • 小结
    • 系列链接

0. 前言

粒子群优化 (Particle Swarm Optimization, PSO) 是一种借鉴适者生存和群集行为概念的进化计算方法。在本节中,我们使用 PSO 来近似求解函数所需的最优参数,展示 PSO 在解决参数函数输入上的强大能力。

1. 粒子群优化

1.1 粒子群优化原理

粒子群优化 (Particle Swarm Optimization, PSO) 是从单个生物的自然分组中获得启发,例如鸟群或鱼群(通常称为群)。生物体在群内相互作用而无需中央监督,朝着共同目标努力。这种观察到的行为产生了一种计算方法,该方法可以通过使用一组由类似于群内生物的粒子表示的候选解决方案来解决或优化给定问题。粒子在搜索空间中移动,以寻找最佳解决方案,它们的移动由涉及其位置和速度(方向速度)的简单规则控制。

1.2 算法流程

PSO 算法是迭代的,并且在每次迭代中,将评估每个粒子的位置,并在必要时更新其到目前为止的最佳位置以及整个粒子组中的最佳位置。每个粒子的速度根据以下信息更新:

  • 粒子的当前速度和运动方向
  • 迄今为止找到的粒子的最佳位置(局部最佳)
  • 迄今为止,整个群中的最佳位置(全局最佳)
  • 然后,根据新计算的速度更新粒子的位置

迭代过程一直进行到满足某些停止条件(例如迭代限制)为止。此时,算法将组的当前最佳位置作为解决方案。

2. 实现 PSO 解决方程

2.1 问题描述

粒子群优化 (Particle Swarm Optimization, PSO) 的常见应用是解决给定方程或函数中所需的输入参数。例如,如果我们想要将炮弹射出指定的距离,可以利用以下方程:

炮弹射程方程

其中, v i v_i vi 表示炮弹射速, a a a 表示炮弹角度。我们可以尝试使用多种数学和优化方法来解决以上方程,但本节中,我们将使用 PSO 求解所需的炮弹初始速度和发射角度的最佳值。

2.2 代码实现

(1) 首先,导入所需库:

import math
import time

import numpy as np

from deap import base
from deap import benchmarks
from deap import creator
from deap import tools
from IPython.display import clear_output

(2) 定义 generate 运算符和同名函数,generate() 函数创建了一个粒子数组,其起始位置由 pminpmax 定义。在粒子群优化期间,每个粒子都有一个初始的速度或距离,并可以在优化过程中更新。在更新过程中,粒子根据适应度移动到新的位置:

def generate(size, pmin, pmax, smin, smax):
    part = creator.Particle(np.random.uniform(pmin, pmax, size)) 
    part.speed = np.random.uniform(smin, smax, size)
    part.smin = smin
    part.smax = smax
    return part

(3) 定义更新运算符函数 updateParticle(),该函数负责在群优化的每次迭代的过程中更新粒子的位置。PSO 的核心是不断地将粒子集群在适应度最高的粒子周围。在 updateParticle() 函数中,粒子通过改变速度和位置来进行集群:

def updateParticle(part, best, phi1, phi2):
    u1 = np.random.uniform(0, phi1, len(part))
    u2 = np.random.uniform(0, phi2, len(part))
    v_u1 = u1 * (part.best - part)
    v_u2 = u2 * (best - part)
    part.speed += v_u1 + v_u2
    for i, speed in enumerate(part.speed):
        if abs(speed) < part.smin:
            part.speed[i] = math.copysign(part.smin, speed)
        elif abs(speed) > part.smax:
            part.speed[i] = math.copysign(part.smax, speed)
    part += part.speed

下图展示了 PSO 如何将各种粒子集群在优化目标区域周围。如果我们将角度和速度绘制在图上,则可以将每个粒子视为射击炮弹的尝试。PSO 的目标是找到最优参数(速度和角度),以将炮弹射出目标距离。

粒子群优化过程

(4) 定义注册到 toolbox 的评估函数 evaluate()。首先,定义目标距离,由于方程式中的速度项包含平方运算,我们只允许正值,防止出现负值。同样地,我们假设角度以度为单位,然后将其转换为弧度用于方程中。最后,我们使用方程计算距离,并计算其与目标距离的差值。然后,返回差值的平方值,以将平方误差项的总和作为元组从函数中返回:

distance = 575 #@param {type:"slider", min:10, max:1000, step:5}
def evaluate(individual):
    v = individual[0] if individual[0] > 0 else 0  #velocity
    a = individual[1] * math.pi / 180  #angle to radians
    return ((2*v**2 * math.sin(a) * math.cos(a))/9.8 - distance)**2,
设置toolbox,注册关键函数,用于生成、更新和评估粒子。
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Particle", np.ndarray, fitness=creator.FitnessMax, speed=list, 
smin=None, smax=None, best=None)

toolbox = base.Toolbox()
toolbox.register("particle", 
                 generate, size=2, pmin=-6, pmax=6, smin=-3, smax=3)
toolbox.register("population", 
                 tools.initRepeat, list, toolbox.particle)
toolbox.register("update", 
                 updateParticle, phi1=200, phi2=200)
toolbox.register("evaluate", evaluate)

(5) 基本操作设置完成后,继续编写粒子群代码,相比之前介绍的其他遗传算法或遗传编程示例要简单得多。与遗传算法或遗传编程不同,在粒子群优化中,粒子在整个模拟中存在。由于粒子寿命较长,我们可以跟踪每个粒子的最佳适应度值。跟踪每个粒子的最佳适应度允许当前最佳粒子在代码清单中被交换,用 best 表示。在群集中重新定位粒子的地方调用 toolbox.update,根据最佳粒子的位置,使用 updateParticle() 函数:

import matplotlib.pyplot as plt

def plot_population(pop):  
    xs = [x for x,_ in pop]
    ys = [y for _,y in pop]    
    plt.scatter(xs,ys)  
plt.show()

pop = toolbox.population(n=500)
stats = tools.Statistics(lambda ind: ind.fitness.values)
stats.register("avg", np.mean)
stats.register("std", np.std)
stats.register("min", np.min)
stats.register("max", np.max)

logbook = tools.Logbook()
logbook.header = ["gen", "evals"] + stats.fields

GEN = 100
best = None

for g in range(GEN):          
    for part in pop:
        part.fitness.values = tuple(np.subtract((0,), toolbox.evaluate(part)))        
        if part.best is None or part.best.fitness < part.fitness:
            part.best = creator.Particle(part)
            part.best.fitness.values = part.fitness.values
        if best is None or best.fitness < part.fitness:
            best = creator.Particle(part)
            best.fitness.values = part.fitness.values
    for part in pop:
        toolbox.update(part, best)
    
    if (g+1) % 10 == 0:
        logbook.record(gen=g, evals=len(pop), **stats.compile(pop))      
        clear_output()
        print(best)
        plot_population(pop) 
        print(logbook.stream)
        time.sleep(1)

随着模拟的运行,可以看到粒子开始收敛到最佳或多个最佳解,如下图所示。需要注意的是,此问题中的角度和速度有两个正确的解,同时粒子在解的一定距离范围分布。这是由于选择了超参数 pminpmaxsminsmaxphi1phi2,可以通过调整这些值来改变粒子的分布。如果想让粒子的分布范围更小,需要将这些超参数调整为较小的值,然后重新运行。

PSO 运行结果

(6) 最后,评估最佳粒子的预设解决方案。但由于该问题有两个解,我们有可能评估多个最佳解。从输出值中,可以看到 PSO 可以相对快速地近似解决炮弹射击给定距离的问题。

v, a = best
a = a * math.pi / 180  #angle to radians
distance = (2*v**2 * math.sin(a) * math.cos(a))/9.8
print(distance)
# 575.0449970299468

PSO 可以应用于多种其他问题,并具有不同的效果。群集优化是一种轻量级的方法,用于找到未知参数,PSO 可以对深度学习系统的超参数进行简单的优化。可以通过完成以下问题进一步理解粒子群算法:

  • 修改目标距离,观察其对 PSO 解决方案的影响
  • 修改 pminpmaxsminsmax 输入,然后重新运行
  • 修改 phi1phi2 参数,然后重新运行,观察其对 PSO 解决方案的影响

小结

粒子群优化 (Particle Swarm Optimization, PSO) 使用一组个体在解决空间中移动,随着粒子的移动,适应度更高的个体引导粒子聚焦于更好的解决方案,PSO 可用于寻找函数或复杂问题的解决方案参数。在本节中,介绍了 PSO 算法的基本原理与算法流程,并实现 PSO 解决炮弹射程方程。

系列链接

遗传算法与深度学习实战(1)——进化深度学习
遗传算法与深度学习实战(2)——生命模拟及其应用
遗传算法与深度学习实战(3)——生命模拟与进化论
遗传算法与深度学习实战(4)——遗传算法详解与实现
遗传算法与深度学习实战(5)——遗传算法中常用遗传算子
遗传算法与深度学习实战(6)——遗传算法框架DEAP
遗传算法与深度学习实战(7)——DEAP框架初体验
遗传算法与深度学习实战(8)——使用遗传算法解决N皇后问题
遗传算法与深度学习实战(9)——使用遗传算法解决旅行商问题
遗传算法与深度学习实战(10)——使用遗传算法重建图像
遗传算法与深度学习实战(11)——遗传编程详解与实现

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

医疗行业怎么节约和管理能源

医院建筑能耗平台 医院智能照明平台 医院能源综合管理平台 目前&#xff0c;能源短缺已成为一个全球性问题。在建筑业的发展中&#xff0c;建筑电气照明系统的节能水平与中国的能源利用率有关。照明系统中的低功率因数和高电压波动将导致较大的功率损失。因此&#xff0c;要认…

计算机网络——ARP篇(二)

上一次学习了ARP的基本概念&#xff0c;ARP缓存&#xff0c;ARP类型&#xff0c;以及ARP协议在网络中是如何工作的。这一次&#xff0c;我又深入的了解了ARP协议的工作原理&#xff0c;下面是我的学习笔记&#xff1a; 在学习之前&#xff0c;首先提出三个问题&#xff1a;ARP协…

BizDevOps落地实践

我理解BizDevOps就是端到端&#xff0c;从战略业务机会到开发上线 参考资料 十六年所思所感&#xff0c;聊聊这些年我所经历的 DevOps 系统 必致&#xff08;BizDevOps&#xff09;白皮书2022免费下载_在线阅读_藏经阁-阿里云开发者社区 具体落地实践 战略规划 战略&…

C#使用TCP-S7协议读写西门子PLC(一)

之前本人发布西门子S7协议的报文 西门子PLC的S7协议报文解析说明_西门子报文详解-CSDN博客 西门子PLC的S7协议是西门子公司在ModbusTcp协议的基础上自定义的一种协议,仅支持西门子PLC,S7协议本质仍然属于TCP协议的一种自定义具体实现 第一步,准备工作。VS2022中新建窗体应…

动态规划及其MATLAB实现

目录 引言 动态规划的基本原理 动态规划的常见应用 动态规划的求解步骤 动态规划的复杂度分析 表格总结&#xff1a;动态规划常见问题及其复杂度 结论 引言 动态规划&#xff08;Dynamic Programming, DP&#xff09;是一种求解最优化问题的有效方法&#xff0c;特别适合…

华为 HCIP-Datacom H12-821 题库 (16)

1.需要题库的小伙伴至博客最下方添加微信公众号关注后回复题库 2.有兴趣交流IT问题的小伙伴微信公众号回复交流群&#xff0c;加入微信IT交流群 1. OSPF 邻居关系建立出现故障&#xff0c;通过 display ospf error 命令来检查&#xff0c;输出结果如图所示&#xff0c;根据图中…

从零开始配置 TypeScript 项目

ESLint 配置 从背景的介绍中可以理解&#xff0c;对于全新的 TypeScript 项目&#xff08;直接抛弃 TSLint&#xff09;需要包含解析 AST 的解析器 typescript-eslint/parser 和使用校验规则的插件 typescript-eslint/eslint-plugin&#xff0c;这里需要在项目中进行安装&…

CentOS 安装Squid代理

环境&#xff1a; 华为云服务器一台&#xff1a;123.60.53.69&#xff0c;放行3128端口 Windows 11 电脑&#xff1a;动态IP 需求&#xff1a; 客户端电脑通过华为云服务器实现代理上网 一、服务器设置 1、安装 yum install squid httpd-tools -y 2、创建用户&#x…

word文档转换为PPT文档最佳方案

目前&#xff0c;笔者发现word文档转换为ppt最好的解决方案。 注&#xff1a;目前AI生成PPT&#xff0c;一般是给定一个标题&#xff0c;直接生成PPT文档内容&#xff0c;属于AI原创&#xff1b;另外&#xff0c;还有一些在线编辑、生成PPT工具&#xff0c;需要付费&#xff0c…

MySQL数据库SQL语句和常用函数大全

前言 MySQL 8数据库提供了丰富的SQL语句操作功能以及一系列高级特性&#xff0c;这些功能使得数据库的管理、查询、更新和维护变得更加高效和灵活。以下是对MySQL 8数据库SQL语句操作大全及高级特性的详细概述&#xff1a; 一、SQL语句操作大全 1. 数据定义语言&#xff08…

【雅特力AT32】 MCU CAN入门指南(超详细)

通信协议与接口知识参考文章&#xff1a; 【通信理论知识】数据传送的方式&#xff1a;串/并行&#xff1b;传输方向&#xff1a;单工、半/全双工&#xff1b;传输方式&#xff1a;同步/异步 【串口通信详解】USART/UART、RS232、RS485标准接口与协议特点解析 【同步串行通信接…

重拾精髓:go doc -http让离线包文档浏览更便捷

Go语言团队近期接受了Go团队成员、Go圣经《The Go Programming Language[1]》合著者Alan Donovan[2]的新提案[3]&#xff0c;旨在进一步提升开发者体验。这个提案为go doc命令[4]的离线文档展示形式&#xff0c;同时增强了查看本地文档的交叉引用功能。看到这个提案功能&#x…

重装电脑系统时硬盘被重新分区:数据恢复实战指南与深度解析

在数字化时代的浪潮中&#xff0c;电脑作为我们日常生活和工作的核心工具&#xff0c;其系统的稳定性与数据的完整性至关重要。然而&#xff0c;在追求系统性能优化或解决系统故障的过程中&#xff0c;重装电脑系统成为了一个常见的操作。不幸的是&#xff0c;这一过程中若不慎…

PB9一个运行时错误:Non-array expected in ANY Variable

反编译修改一个项目。遇到这个问题。 仿佛一看&#xff0c;这是一个莫名其妙的问题&#xff0c;在百度也只搜到一个类似问题。 但是定睛一看&#xff0c;是一个很奇怪的错误&#xff0c;就是说代码自己写错了 for i 1 to uo_1.is_arr ls_arrstr uo_1.is_arr[i] ... next …

掌握 JavaScript ES6+:现代编程技巧与模块化实践

掌握 JavaScript ES6&#xff1a;现代编程技巧与模块化实践 一 . 变量声明 let二 . 声明常量 const三 . 模板字符串四 . 函数的参数默认值五 . 箭头函数六 . 对象初始化七 . 解构7.1 接收 JSON 对象7.2 接收数组 八 . 延展操作符九 . 导入和导出9.1 方式一9.2 方式二 这篇文章我…

校篮球联赛系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;公告管理&#xff0c;基础数据管理&#xff0c;球队管理&#xff0c;球员管理&#xff0c;赛事信息管理&#xff0c;用户管理&#xff0c;轮播图信息 微信端账号功能包括&#…

文章解读与仿真程序复现思路——电网技术 EI\CSCD\北大核心《面向日前市场邀约的电动自行车换电站运行规划》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

聚观早报 | 2025款比亚迪汉上市;iPhone 16天猫全球同步首发

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 9月11日消息 2025款比亚迪汉上市 iPhone 16天猫全球同步首发 菜鸟L4级无人车正式发售 OPPO Find X8配置细节曝光…

DB33/T629 视频联网配置 USC安防平台

海康平台配置介绍 如下以海康ISC为例&#xff0c;配置DB33/T629接入流程。其中海康平台域标识为130101000020000099。DB33/T629 支持目录同步到usc。 DB33/T629服务配置 假设DB33/T629服务已经配置好&#xff0c;参考配置-》级联-》DB33/T629服务 DB33/T629下级域 进入配置-》…

全球服务业和制造业PMI:8月份差距继续扩大

标普全球综合PMI产出指数在8月份回升&#xff0c;增加0.3个百分点至52.8&#xff0c;此前两个月一直在下降。这对于2024年第三季度中的全球活动来说是一个鼓励的信号。然而&#xff0c;这个改进掩盖了服务业和制造业之间的明显分歧。8月份&#xff0c;全球服务业指数达到自2023…