当前位置: 首页 > news >正文

强化学习-蒙特卡洛方法

强化学习-数学理论

  1. 强化学习-基本概念
  2. 强化学习-贝尔曼公式
  3. 强化学习-贝尔曼最优公式
  4. 强化学习-值迭代与策略迭代
  5. 强化学习-蒙特卡洛方法

文章目录


一、蒙特卡洛方法理论(Monte Carlo, MC)

  上一篇博客介绍的是model-base的方法,本篇博客开始介绍model-free的方法,model-free的核心思想是基于数据来估计出一个模型。
  如何在没有模型的情况下去进行估计,有一个重要的思想:Monte Carlo estimation。下面以抛硬币的例子为大家讲解该思想。

假设我们正在进行抛硬币游戏,将其结果用 X X X来表示,结果是正面时 X = 1 X=1 X=1;结果是反面时 X = − 1 X=-1 X=1,我们的目的是去求解 E [ X ] \mathbb E[X] E[X],有如下两种方法:

方法一:model-base
假设我们知道有一个概率模型, p ( X = 1 ) = 0.5 , p ( X = − 1 ) = 0.5 p(X=1)=0.5, p(X=-1)=0.5 p(X=1)=0.5,p(X=1)=0.5,那么 E [ X ] = Σ x x p ( x ) = 1 × 0.5 + ( − 1 ) × 0.5 = 0 \mathbb E[X] = \underset{x}\Sigma xp(x)=1\times0.5 + (-1)\times0.5=0 E[X]=xΣxp(x)=1×0.5+(1)×0.5=0,然而事实上我们可能没有办法获取这么精确的概率模型。
方法二:model-free(Monte Carlo estimation
投掷硬币很多次(做多次试验)得到很多采样结果,把所有的采样结果求平均。具体如下:假如做了N次实验,这N次实验的结果是${x_1,x_2,x_3,…,x_N}$,把结果相加再除于N得到 x ‾ \overline{\text{x}} x,当N足够大时 x ‾ \overline{\text{x}} x 近似等于 E [ X ] \mathbb E[X] E[X],等式为: E [ X ] ≈ x ‾ = 1 N Σ N j = 1 x j \mathbb E[X]\approx\overline{\text{x}}=\frac{1}{N}\underset{j=1}{\overset{N}\Sigma}x_j E[X]x=N1j=1ΣNxj。这个思想就是 Monte Carlo estimation

  Monte Carlo estimation思想的数学理论支撑如下图所示,相关证明这里不再给出,感兴趣的朋友可以查阅相关参考资料。
数学原理


二、MC Basic

2.1 算法拆解

  上一篇博客我们讲过policy iteration这个算法,在上一篇中它是模型确定的,本篇的核心是如何将policy iteration转变成model-free的方法。

policy iteration算法有如下两部分:

{ p o l i c y e v a l u a t i o n : v π k = r π k + γ P π k v π k v a l u e i m p r o v e m e n t : π k + 1 = a r g m a x π ( r π + γ P π v k ) \begin{cases} policy\ evaluation:\ v_{\pi_k}=r_{\pi_k}+ \gamma P_{\pi_k} v_{\pi_k}\\ value\ improvement:\ \pi_{k+1}=argmax_\pi(r_\pi+\gamma P_\pi v_k) \end{cases} {policy evaluation: vπk=rπk+γPπkvπkvalue improvement: πk+1=argmaxπ(rπ+γPπvk)

policy improvementelementwise form如下:

π k + 1 ( s ) = a r g m a x π Σ a π ( a ∣ s ) [ Σ r p ( r ∣ s , a ) r + γ Σ s ′ p ( s ′ ∣ s , a ) v k ( s ′ ) ] ⏟ q π k ( s , a ) , s ∈ S \begin{aligned} \pi_{k+1}(s)=\underset{\pi}{argmax}\underset{a}\Sigma\pi(a|s)\underbrace{[\underset{r}\Sigma p(r|s,a)r+\gamma\underset{s'}\Sigma p(s'|s,a)\textcolor{red}{v_k(s')}]}_{\textcolor{red}{q_{\pi_k}(s,a)}}, \quad s\in S \end{aligned} πk+1(s)=πargmaxaΣπ(as)qπk(s,a) [rΣp(rs,a)r+γsΣp(ss,a)vk(s)],sS
算法的关键在于如何计算 q π k ( s , a ) \textcolor{red}{q_{\pi_k}(s,a)} qπk(s,a)!

同样求解 q k ( s , a ) \textcolor{red}{q_k(s,a)} qk(s,a)有如下两种方式:

方案一:model-base
q π k ( s , a ) = Σ r p ( r ∣ s , a ) r + γ p s ′ ( s ′ ∣ s , a ) v π k ( s ′ ) q_{\pi_k}(s,a) = \underset{r}\Sigma p(r|s,a)r+\gamma\underset{s'}p(s'|s,a)v_{\pi_k}(s') qπk(s,a)=rΣp(rs,a)r+γsp(ss,a)vπk(s)
方案二:model-free【本篇博客的方法】
q π k ( s , a ) = E [ G t ∣ S t = a , A t = a ] q_{\pi_k}(s,a) = \mathbb E[G_t|S_t=a,A_t=a] qπk(s,a)=E[GtSt=a,At=a]

如何基于数据去求解 q k ( s , a ) \textcolor{red}{q_k(s,a)} qk(s,a)?答案:采用章节一中提到的 Monte Carlo estimation,具体步骤如下所示:

首先我们从任意的一个s和a的一个组合出发,然后根据当前的策略得到一个episode并计算出该episode对应的discounted return 为 g ( s , a ) g(s,a) g(s,a),这里的 g ( s , a ) g(s,a) g(s,a) G t G_t Gt的一个采样。假设我们有很多这样的词啊样集合: { g ( j ) ( s , a ) } \{g^{(j)}(s,a)\} {g(j)(s,a)},那么根据Monte Carlo estimation思想我们可以得到:
q k ( s , a ) = E [ G t ∣ S t = a , A t = a ] ≈ 1 N Σ N i = 1 g i ( s , a ) q_k(s,a) = \mathbb E[G_t|S_t=a,A_t=a] \approx\frac{1}{N}\underset{i=1}{\overset{N}\Sigma}g^{i}(s,a) qk(s,a)=E[GtSt=a,At=a]N1i=1ΣNgi(s,a)

总之,没有数据时得有模型,没有模型时得有数据!!!

2.2 MC Basic算法

  给定一个初始策略 π 0 \pi_0 π0,这个策略可能是不好的,慢慢地对其进行改进,然后在第k个iteration它包含两个步骤:

1️⃣ policy evaluation:计算出所有 ( s , a ) (s,a) (s,a)对应的 q π k q_{\pi_k} qπk,其计算方法是:从 ( s , a ) (s,a) (s,a)出发得到很多的episode,求得episode的return并求平均;
2️⃣ policy improvement:在步骤一中我们得到了 q π k q_{\pi_k} qπk,这个步骤主要求解一个最优化问题得到一个新的策略。

  伪代码如下图所示:
伪代码


三、MC Exploring Starts

3.1 算法拆解

  该算法是MC Basic算法的一个推广,使得MC Basic算法更加高效,下面通过一个例子为大家讲解。

3.1.1 高效利用数据

在一个网格世界里,假如有一个策略 π \pi π,我们可以得到一个episode,如下所示:
s 1 → a 2 s 2 → a 4 s 1 → a 2 s 2 → a 3 s 5 → a 1 . . . s_1\overset{a_2}\rightarrow s_2\overset{a_4}\rightarrow s_1\overset{a_2}\rightarrow s_2\overset{a_3}\rightarrow s_5\overset{a_1}\rightarrow ... s1a2s2a4s1a2s2a3s5a1...
这里引入一个新的概念visit,每出现一次state-action pair我们就认为有了一次访问。前面所讲到的MC Basic算法也叫Initial-visit method,即对于某个episode我们只考虑 ( s 1 , a 2 ) (s_1,a_2) (s1,a2),然后利用该episode剩下所得到的return来估计 ( s 1 , a 2 ) (s_1,a_2) (s1,a2)的action value。因此,我们可以清楚的知道MC Basic算法的问题在于它没有充分利用这个episode,因为里面有很多的数据被浪费掉了。
如下图所示,我们可以利用episode所得的return去估计前一个 q π ( s 2 , a 4 ) q_\pi(s_2,a_4) qπ(s2,a4),如此依赖就可以充分利用该episode中的数据。这里也有两种方法:

  • first-visit method:如下图所示,在第三次的时候又出现了一次 ( s 1 , a 2 ) (s_1,a_2) (s1,a2),该方法的意思是:只要出现过一次的state-action pair 后面再次出现就不在进行估计了。
  • every-visit method:与上面的方案截然相反,出现第二次时就用第二次后面的📄进行估计,出现第三次时就用第三次后面的值进行估计,如此类推。

浪费过程

3.1.2 高效更新策略

  上面所提到的方案是如何让数据利用更加高效,下面将为大家讲解如何让策略更新的更高效,这里也有两种方案。

第一种【原始法】:MC Basic算法在进行策略更新的时候,其原理是:收集从 state-action pair 开始的所有episode,然后使用return的平均值来近似action value。原始方案的缺点在于“要等”,要等所有的episode,这就造成了性能的低效。
第二种【改进法】:针对上述方案的缺点,该方法的核心是:我得了一个episode时就用这个episode的return立刻去估计action value,然后就直接开始改进策略,后面都采用这样及时的方法从而提高性能。该方案的支撑理论见:truncated policy iteration

3.2 MC Exploring Starts算法

  MC Exploring Starts方法的伪代码如下:
伪代码

3.3 为什么必须要有exploring starts这个条件呢?

  • exploring代表:指的是从每一个 ( s , a ) (s,a) (s,a)出发都要有episode,只有这样才能用后面生成的这些return去计算 q π ( s , a ) q_\pi(s,a) qπ(s,a),假设有一个state action没有被访问到,就无法确保所选的action是最优的了。
  • starts代表:要访问每一个 ( s , a ) (s,a) (s,a)从它后面能够生成reward的这些数据,有两种方案:1) 从 ( s , a ) (s,a) (s,a)开始一个episode就是start,2)visit方法,即我从其他状态出发,得到的episode经过了 ( s , a ) (s,a) (s,a)这个状态,但目前来说visit这个方法无法确保一定能够经过剩下的这些 ( s , a ) (s,a) (s,a)
  • 理论上,只有对每个状态的每个 action value 都进行了很好的探索,我们才能正确地选择最优 action。否则,如果未探索某个操作,则此操作可能恰好是最佳操作,因此会错过。在实践中,exploring starts很难实现。对于许多应用程序,尤其是那些涉及与环境物理交互的应用程序,很难从每个state-action pair 对开始收集episode。

四、MC Epsilon-Greedly

  MC Epsilon-Greedly算法通过soft policy的方式对MC Exploring Starts算法进行改进,从而拿掉MC Exploring Starts算法中的硬性条件exploring starts。

4.1 soft policy理论

  前几章提到的greedy policy是deterministic的,而soft policy是stochastic的。如果我从一个state-action pair如 ( s , a ) (s,a) (s,a)出发,假设后面的episode特别特别长,因为它是探索性的,因此就能够确保任何一个s和a被这个episode访问到。基于这个理论,我们就可以去掉exploring starts这个条件了。

4.2 ε \varepsilon ε-greedy policy(soft policy的一种)

π ( a ∣ s ) = { 1 − ε ∣ A ( s ) ∣ ( ∣ A ( s ) ∣ − 1 ) , f o r t h e g r e e d y a c t i o n ε ∣ A ( s ) ∣ , f o r t h e o t h e r ∣ A ( s ) ∣ − 1 a c t i o n \pi(a|s) = \begin{cases}1-\frac{\varepsilon}{|\mathcal A(s)|}(|\mathcal A(s)|-1), &for\,the\,greedy\,action \\ \frac{\varepsilon}{|\mathcal A(s)|}, &for\,the\,other\,|\mathcal A(s)|-1\,action \end{cases} π(as)={1A(s)ε(A(s)1),A(s)ε,forthegreedyactionfortheotherA(s)1action
其中 ε ∈ [ 0 , 1 ] \varepsilon \in [0,1] ε[0,1] ∣ A ( s ) ∣ |\mathcal A(s)| A(s)为状态 s 的动作数量。 ε \varepsilon ε-greedy policy可以平衡 exploitation 和 exploration。从上式也可得出,当 ε = 0 \varepsilon = 0 ε=0时, policy 就是 greedy的,充分利用性强,探索性弱; 当 ε = 1 \varepsilon = 1 ε=1时, 此时策略就是随机的且其探索性就很强。

4.3 MC Epsilon-Greedly算法

4.3.1 如何将 ε \varepsilon ε-greedy policy引入MC Basic?

先前,MC Basic和MC Exploring Starts算法在解决policy improvement时,计算公式如下:
π k + 1 ( s ) = a r g m a x π ∈ Π Σ a π ( a ∣ s ) q π k ( s , a ) \pi_{k+1}(s)=\underset{\pi \in \Pi}{argmax}\underset{a}\Sigma\pi(a|s)q_{\pi_k}(s,a) πk+1(s)=πΠargmaxaΣπ(as)qπk(s,a)
这里的 Π \Pi Π代表了所有可能的policy。最大策略计算方式如下:
π ( a ∣ s ) = { 1 , a = a k ∗ , 0 , a ≠ a k ∗ , \pi(a|s) = \begin{cases}1,&a=a_k^*,\\ 0, &a \neq a_k^*, \end{cases} π(as)={10,a=aka=ak
这里 a k ∗ = a r g m a x a q π k ( s , a ) a_k^*=argmax_a q_{\pi_k}(s,a) ak=argmaxaqπk(s,a).

现在,只需要把原来的 π ∈ Π \pi \in \Pi πΠ ε \varepsilon ε-greedy policy替代即可,即 π ∈ Π ε \pi \in \Pi_\varepsilon πΠε,具体公式如下所示:
π k + 1 ( s ) = a r g m a x π ∈ Π ε Σ a π ( a ∣ s ) q π k ( s , a ) \pi_{k+1}(s)=\underset{\pi \in \Pi_\varepsilon}{argmax}\underset{a}\Sigma\pi(a|s)q_{\pi_k}(s,a) πk+1(s)=πΠεargmaxaΣπ(as)qπk(s,a)
这里的 Π \Pi Π只包含一部分的策略,最大策略计算如下:

π ( a ∣ s ) = { 1 − ∣ A ( s ) ∣ − 1 ∣ A ( s ) ∣ ε , a = a k ∗ 1 ∣ A ( s ) ∣ ε , a ≠ a k ∗ \pi(a|s) = \begin{cases}1-\frac{|\mathcal A(s)|-1}{|\mathcal A(s)|}\varepsilon, &a=a_k^* \\ \frac{1}{|\mathcal A(s)|}\varepsilon, &a\neq a_k^* \end{cases} π(as)={1A(s)A(s)1ε,A(s)1ε,a=aka=ak

4.3.2 MC Epsilon-Greedly算法伪代码

伪代码


总结

内容小结

  • Monte Carlo estimation:将大量的数据采样求平均进行估计;
  • MC Basic:基于Monte Carlo estimation思想,将policy iteration算法从model-base的方法转为model-free的方法;
  • MC Exploring Starts:是对MC Basic算法的优化,从数据和策略两个方面进行优化;
  • MC Epsilon-Greedly:通过soft policy的方式对MC Exploring Starts算法进行改进,拿掉了硬性条件exploring starts。

参考资料

  1. 蒙特卡洛方法视频版

相关文章:

强化学习-蒙特卡洛方法

强化学习-数学理论 强化学习-基本概念强化学习-贝尔曼公式强化学习-贝尔曼最优公式强化学习-值迭代与策略迭代强化学习-蒙特卡洛方法 文章目录 强化学习-数学理论一、蒙特卡洛方法理论(Monte Carlo, MC)二、MC Basic2.1 算法拆解2.2 MC Basic算法 三、MC Exploring Starts3.1 …...

IIO(Industrial I/O)驱动介绍

文章目录 IIO(Industrial I/O)驱动是Linux内核中用于工业I/O设备的子系统,主要用于处理传感器数据采集和转换。以下是其关键点: 功能 数据采集:从传感器读取数据。数据处理:对原始数据进行滤波、校准等操作…...

画流程图 代码生成流程图 流程图自动运行

一:在线平台 典藏 drawio:完全免费;可拆入代码生成;使用方法 Kimi drawio生成流程图:Kimi里面生成Mermaid格式——>生成代码并复制——>进入drawio里面点插入"号"——>高级——>Mermaid——…...

Maven 配置本地仓库

步骤 1&#xff1a;修改 Maven 的 settings.xml 文件 找到你的 Maven 配置文件 settings.xml。 Windows: C:\Users\<你的用户名>\.m2\settings.xmlLinux/macOS: ~/.m2/settings.xml 打开 settings.xml 文件&#xff0c;找到 <localRepository> 标签。如果没有该标…...

计算机网络常见协议

目录 OSPF(Open Shortest Path First) NAT(Network Address Translation) ICMP (Internet Control Message Protocol) HTTPS&#xff08;SSL/TLS加密&#xff09; HTTPS协议 1. 对称加密 2. 非对称加密 3. 证书验证 4. 回顾https协议传输流程 HTTP TCP UDP 1. TCP&a…...

SCSSA-BiLSTM基于改进麻雀搜索算法优化双向长短期记忆网络多特征分类预测Matlab实现

SCSSA-BiLSTM基于改进麻雀搜索算法优化双向长短期记忆网络多特征分类预测Matlab实现 目录 SCSSA-BiLSTM基于改进麻雀搜索算法优化双向长短期记忆网络多特征分类预测Matlab实现分类效果基本描述程序设计参考资料 分类效果 基本描述 SCSSA-BiLSTM基于改进麻雀搜索算法优化双向长…...

基于Java+SpringBoot+Vue的前后端分离的体质测试数据分析及可视化设计

基于JavaSpringBootVue的前后端分离的体质测试数据分析及可视化设计 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码…...

Ansible实战:如何正确选择 command 和shell模块?

在使用Ansible进行自动化运维时&#xff0c;command 和 shell 模块是我们执行命令的好帮手。虽然它们看起来很相似&#xff0c;但在功能特性和适用场景上其实有着明显的不同。正确选择合适的模块不仅能够提高任务的效率&#xff0c;还能帮助我们规避一些潜在的风险。在这篇文章…...

机器学习:监督学习与非监督学习

监督学习是利用带有标签的数据进行训练,模型通过学习输入和输出之间的关系来进行预测。也就是说,数据集中既有输入特征,也有对应的输出标签,模型的目标是找到从输入到输出的映射关系。 而无监督学习则使用没有标签的数据进行训练,模型的任务是发现数据中的内在结构或模式…...

近红外简单ROI分析matlab(NIRS_SPM)

本次笔记主要想验证上篇近红外分析是否正确&#xff0c;因为叠加平均有不同的计算方法&#xff0c;一种是直接将每个通道的5分钟实时长单独进行叠加平均&#xff0c;另一种是将通道划分为1分钟的片段&#xff0c;将感兴趣的通道数据进行对应叠加平均&#xff0c;得到一个总平均…...

运输层安全协议SSL

安全套接字层 SSL (Secure Socket Layer) SSL 作用在端系统应用层的 HTTP 和运输层之间&#xff0c;在 TCP 之上建立起一个安全通道&#xff0c;为通过 TCP 传输的应用层数据提供安全保障。 应用层使用 SSL 最多的就是 HTTP&#xff0c;但 SSL 并非仅用于 HTTP&#xff0c;而是…...

“扣子”开发之四:与千帆AppBuilder比较

上一个专题——“扣子”开发——未能落地&#xff0c;开始抱着极大的热情进入&#xff0c;但迅速被稚嫩的架构模型折磨打击&#xff0c;硬着头皮坚持了两周&#xff0c;终究还是感觉不实用不趁手放弃了。今天询问了下豆包&#xff0c;看看还有哪些比较好的AI开发平台&#xff0…...

Asp .Net Core 实现微服务:集成 Ocelot+Nacos+Swagger+Cors实现网关、服务注册、服务发现

什么是 Ocelot ? Ocelot是一个开源的ASP.NET Core微服务网关&#xff0c;它提供了API网关所需的所有功能&#xff0c;如路由、认证、限流、监控等。 Ocelot是一个简单、灵活且功能强大的API网关&#xff0c;它可以与现有的服务集成&#xff0c;并帮助您保护、监控和扩展您的…...

62_Redis服务器集群优化

Redis集群虽然具备高可用特性,且能实现自动故障恢复,但是如果使用不当,也会存在一些问题,总结如下。 集群完整性问题集群带宽问题数据倾斜问题客户端性能问题命令的集群兼容性问题Lua和事务问题1.集群完整性问题 在 Redis 集群的默认配置下,当节点检测到存在至少一个哈希…...

【React】静态组件动态组件

目录 静态组件动态组件创建一个构造函数(类)使用 class 实现组件**使用 function 实现类组件** 静态组件 函数组件是静态组件&#xff1a; 组件第一次渲染完毕后&#xff0c;无法基于内部的某些操作让组件更新「无法实现自更新」&#xff1b;但是&#xff0c;如果调用它的父组…...

深度学习中的卷积和反卷积(四)——卷积和反卷积的梯度

本系列已完结&#xff0c;全部文章地址为&#xff1a; 深度学习中的卷积和反卷积&#xff08;一&#xff09;——卷积的介绍 深度学习中的卷积和反卷积&#xff08;二&#xff09;——反卷积的介绍 深度学习中的卷积和反卷积&#xff08;三&#xff09;——卷积和反卷积的计算 …...

ASP.NET Core - IStartupFilter 与 IHostingStartup

ASP.NET Core - IStartupFilter 与 IHostingStartup 1. IStartupFilter2 IHostingStartup2.5.1 创建外部程序集2.5.2 激活外部程序集 1. IStartupFilter 上面讲到的方式虽然能够根据不同环境将Startup中的启动逻辑进行分离&#xff0c;但是有些时候我们还会可以根据应用中的功能…...

【零基础租赁实惠GPU推荐及大语言模型部署教程01】

租赁GPU推荐及大语言模型部署简易教程 1 官网地址2 注册账号及登录3 租用GPU3.1 充值&#xff08;不限制充值最低金额&#xff0c;1元亦可&#xff09;3.2 容器实例&#xff08;实际就是你租用的GPU电脑&#xff09;3.3 选择镜像&#xff08;选择基础环境&#xff1a;框架版本和…...

接口传参 data格式和json格式区别是什么

接口传参 data格式和json格式区别是什么 以下是接口传参 data 格式和 JSON 格式的区别&#xff1a; 定义和范围 Data 格式&#xff1a; 是一个较为宽泛的概念&#xff0c;它可以指代接口传递参数时所使用的任何数据的组织形式。包括但不限于 JSON、XML、Form 数据、纯文本、二进…...

踏上 C++ 编程之旅:开篇之作

踏上 C 编程之旅&#xff1a;开篇之作 在计算机编程的广袤天地中&#xff0c;C 宛如一座巍峨的高峰&#xff0c;吸引着无数开发者攀登探索。今天&#xff0c;就让我们一同开启这段充满挑战与惊喜的 C 编程之旅&#xff0c;在代码的世界里开辟属于自己的道路。 一、为什么选择…...

docker在不删除容器的情况下修改端口映射

注意&#xff1a;必须先停止docker服务&#xff01;&#xff01;&#xff01;&#xff01; 1) 停止容器 2) 停止docker服务(systemctl stop docker) 3) 修改这个容器的hostconfig.json和config.v2.json文件中的端口 先查看容器id docker inspect jenkins 进入该目录 hostcon…...

Mysql tinyint与Java的数据类型的对应关系

参考资料 理解误区——mysql中tinyint与Java的数据类型的对应关系&#xff1b;tinyint(1) 与tinyint(4)的区别 1.1 tinyint字段取值 数据库字段类型为 tinyint,值为0或1,直接通过SQL语句查询的话,0会取出false;1会取出true目前就想取出的结果为 0 或 1 selectpg_id ,pg_name…...

mac intel芯片下载安卓模拟器

一、调研 目前主流两个模拟器&#xff1a; 雷神模拟器 不支持macosmumu模拟器pro版 不支持macos intel芯片 搜索到mumu的Q&A中有 “Intel芯片Mac如何安装MuMu&#xff1f;” q&a&#x1f517;&#xff1a;https://mumu.163.com/mac/faq/install-on-intel-mac.html 提…...

掌握 Ubuntu 终端 mv 与 rename 命令的高效重命名使用方法

在日常的计算任务中&#xff0c;文件重命名是一个经常性的需求。对于熟悉图形用户界面&#xff08;GUI&#xff09;的人来说&#xff0c;通过右键点击并选择“重命名”选项&#xff0c;这个过程简单直接。然而&#xff0c;当涉及到大量文件或需要自动化流程时&#xff0c;命令行…...

【Python】数据容器:列表,元组,字符串,集合字典及通用操作

文章目录 一.序列1.1list列表定义常用操作列表的遍历 1.2tuple元组定义常见操作元组的遍历 1.3str字符串定义常见操作字符串的遍历 1.4序列常用操作——切片 二.set集合定义常见操作集合的遍历 三.dict字典定义常用操作字典的嵌套 *数据容器对比总结四.数据容器的通用操作4.1通…...

基于Oracle与PyQt6的电子病历多模态大模型图形化查询系统编程构建

一、引言 1.1 研究背景阐述 在当今数字化时代,医疗行业正经历着深刻的变革,数字化转型的需求日益迫切。电子病历(EMR)作为医疗信息化的核心,其管理的高效性和数据利用的深度对于提升医疗服务质量、优化临床决策以及推动医学研究具有至关重要的意义。传统的电子病历管理系…...

2025智能网联汽车数据分类分级白皮书

智能网联汽车作为现代交通技术的重要成果&#xff0c;其核心特征之一是产生了大量的、多样化的数据&#xff0c;这些数据不仅对提升车辆性能和用户体验至关重要&#xff0c;对维护交通安全、推动智能交通系统的发展具有深远影响。在数字经济时代&#xff0c;数据的价值日益凸显…...

使用Dify创建个问卷调查的工作流

为啥要使用Dify创建工作流呢&#xff1f;一个基于流程的智能体的实现&#xff0c;特别是基于业务的实现&#xff0c;使用Dify去实现时&#xff0c;通常都是一个对话工作流&#xff0c;当设计到相对复杂一些的流程时&#xff0c;如果将所有逻辑都放在对话工作流中去实现&#xf…...

紫光无人机AI飞控平台介绍

随着无人机技术的迅猛发展&#xff0c;无人机飞控平台的智能化需求不断提升。紫光无人机AI飞控平台作为一款创新型产品&#xff0c;为用户提供了从飞行控制到任务管理的一站式解决方案&#xff0c;尤其在AI实时识别和事件分析方面具有显著优势。本文将介绍平台的核心功能、技术…...

UI自动化测试:异常截图和page_source

自动化测试过程中&#xff0c;是否遇到过脚本执行中途出错却不知道原因的情况&#xff1f;测试人员面临的不仅是问题的复现&#xff0c;还有对错误的快速定位和分析。而异常截图与页面源码&#xff08;Page Source&#xff09;的结合&#xff0c;正是解决这一难题的利器。 在实…...