# [0619] Task01 绪论、马尔可夫过程、动态规划

news2024/7/4 5:56:30
  • easy-rl PDF版本 笔记整理 P1 - P2
  • joyrl 比对 补充 P1 - P3
  • 相关 代码 整理

在这里插入图片描述

最新版PDF下载
地址:https://github.com/datawhalechina/easy-rl/releases
国内地址(推荐国内读者使用)
链接: https://pan.baidu.com/s/1isqQnpVRWbb3yh83Vs0kbw 提取码: us6a

easy-rl 在线版本链接 (用于 copy 代码)
参考链接 2:https://datawhalechina.github.io/joyrl-book/

其它:
【勘误记录 链接】
——————
5、深度强化学习基础 ⭐️
开源内容:https://linklearner.com/learn/summary/11
——————————

在这里插入图片描述

在这里插入图片描述
即时反馈 难以获取
延迟奖励 增加了 网络训练的难度

强化学习 输入: 序列数据

探索 exploration 利用 exploitation

在机器学习中, 如果观测数据有非常强的关联,会使得训练非常不稳定。

——> 独立同分布

轨迹 trajectory τ = ( s 0 , a 0 , s 1 , a 1 , ⋯   ) \tau=(s_0,a_0,s_1,a_1,\cdots) τ=(s0,a0,s1,a1,)

轨迹到底包不包含 奖励 reward 呢?

回合 episode 或 试验 (trial)

2012 年 AlexNet 卷积神经网络
端到端: 特征提取 + 分类

GPU 更快地做更多的试错尝试

智能体 走路、机械臂学习一个统一的抓取算法

先在虚拟环境中得到一个很好的智能体, 再应用到真实的机器人中。

  • 真实的机械臂易损坏且昂贵, 无法大批购买。

在这里插入图片描述

最大化 累积奖励的期望

即时奖励 和 延迟奖励

当智能体能够观察到环境的所有状态时,强化学习通常 建模成 一个马尔可夫决策过程 (Markov decision process,MDP)的问题

部分可观测马尔可夫决策过程 ( S , A , T , R , Ω , O , γ ) (S, A, T, R, \Omega, O, \gamma) (S,A,T,R,Ω,O,γ)

  • 状态 S S S
  • 动作 A A A
  • 状态转移概率 T ( s ′ ∣ s , a ) T(s^\prime|s, a) T(ss,a)
  • 奖励 R R R
  • 观测概率 Ω ( o ∣ s , a ) \Omega(o|s, a) Ω(os,a)
  • 观测空间 O O O
  • 折扣因子 γ \gamma γ

离散动作
连续动作: 机器人 360° 任意角度移动

策略增加随机性, 可以更好地探索环境,避免被对手预测下一步动作。

状态值 v π ( s ) = E π [ G t ∣ s t = s ] = E π [ ∑ k = 0 ∞ γ k ⋅ r t + k + 1 ∣ s t = s ]    ∀   s ∈ S     v_\pi(s)=\mathbb E_\pi[G_t|s_t=s]=\mathbb E_\pi\Big[\sum\limits_{k=0}^{\infty}\gamma^k·r_{t+k+1}|s_t=s\Big]~~\forall~s\in\cal S~~~ vπ(s)=Eπ[Gtst=s]=Eπ[k=0γkrt+k+1st=s]   sS    注意 从 r t + 1 r_{ t + 1} rt+1 开始累积

动作值 q π ( s , a ) = E π [ G t ∣ s t = s , a t = a ] = E π [ ∑ k = 0 ∞ γ k ⋅ r t + k + 1 ∣ s t = s , a t = a ]          q_\pi(s, a)=\mathbb E_\pi[G_t|s_t=s, a_t=a]=\mathbb E_\pi\Big[\sum\limits_{k=0}^\infty\gamma^k·r_{t+k+1}|s_t=s, a_t=a\Big]~~~~~~~~ qπ(s,a)=Eπ[Gtst=s,at=a]=Eπ[k=0γkrt+k+1st=s,at=a]         将 动作 a a a 加入考量范围, 其它同上

状态转移概率 p ( s t + 1 = s ′ ∣ s t = s , a t = a ) p(s_{t+1}=s^\prime|s_t=s, a_t=a) p(st+1=sst=s,at=a)

总回报 R ( s , a ) = E [ r t + 1 ∣ s t = s , a t = a ] R(s, a)=\mathbb E[r_{t+1}|s_t=s, a_t=a] R(s,a)=E[rt+1st=s,at=a]

value-based: 维护一个关于值 的表格 或函数, 直接选取 值 最大的动作。

policy-based:根据 策略 确定 动作

是否 对环境 进行建模了?
model-based 状态转移
model-free 值函数 和 策略函数

模型 不易 确定

智能体 执行行动前, 能否对下一步的状态和奖励进行预测,若可以, 则可采用 有模型学习。

免模型 数据

两亿帧游戏画面。

利用: 直接采取已知的奖励最大的动作

Gym 仿真库_OpenAI

OpenAI 的 Gym 库是一个环境仿真库

离散控制场景(输出的动作是可数的,比如Pong游戏中输出的向上或向下动作)一般使用雅达利环境评估;
连续控制场景(输出的动作是不可数的,比如机器人走路时不仅有方向,还有角度,角度就是不可数的,是一个连续的量 )一般使用 MuJoCo 环境评估。
Gym Retro是对 Gym 环境的进一步扩展,包含更多的游戏。

使用 env = gym.make(环境名) 调用模拟的环境
使用 env.reset() 初始化环境,
使用 env.step(动作) 执行一步 动作,
使用 env.render() 环境渲染,
使用 env.close() 关闭环境。

相关库安装

pip install gym==0.25.2
pip install pygame
import gym

在刚开始测试强化学习的时候,我们可以选择这些简单环境,因为强化学习在这些环境中可以在一两分钟之内见到效果。

在这里插入图片描述
Acrobot 需要让一个双连杆机器人立起来;
CartPole 需要通过控制一辆小车,让杆立起来;
MountainCar 需要通过前后移动车,让它到达旗帜的位置。

包含的 仿真环境 查看

from gym import envs
env_specs = envs.registry.all()
envs_ids = [env_spec.id for env_spec in env_specs]
print(envs_ids)

在这里插入图片描述

车杆平衡 CartPole-v0

import gym  # 导入 Gym 的 Python 接口环境包
env = gym.make('CartPole-v0')  # 构建实验环境
env.reset()  # 重置一个回合
for _ in range(1000):
    env.render()  # 显示图形界面
    action = env.action_space.sample() # 从动作空间中随机选取一个动作
    env.step(action) # 用于提交动作,括号内是具体的动作
env.close() # 关闭环境
  • 报错, 暂时不清楚 是啥问题。。

在这里插入图片描述

——> Colab 可以跑, 不报错。

import gym  
env = gym.make('CartPole-v0')  
env.reset()  
for _ in range(1000):
    env.render()  
    action = env.action_space.sample() 
    observation, reward, done, info = env.step(action)
    print(observation)
env.close()   
  • 和之前的报错一样
    ——> Colab 可以跑, 能输出数据,就是 env.render() 没反应。

——> 需要自己可视化。

如何 与 gym 库 交互。 MountainCar-v0 【车上 山顶】

import gym
env = gym.make('MountainCar-v0')
print('观测空间 = {}'.format(env.observation_space))
print('动作空间 = {}'.format(env.action_space))
print('观测范围 = {} ~ {}'.format(env.observation_space.low,
        env.observation_space.high))
print('动作数 = {}'.format(env.action_space.n))

在这里插入图片描述
在 Gym 库中,
环境的观测空间env.observation_space 表示,
动作空间env.action_space 表示。
离散空间 gym.spaces.Discrete 类表示,
连续空间用 gym.spaces.Box 类表示。
对于离散空间,Discrete (n) 表示可能取值的数量为 n;
对于连续空间,Box 类实例成员中的 lowhigh 表示每个浮点数的取值范围。

import gym
import numpy as np


class SimpleAgent:
    def __init__(self, env):
        pass
    
    def decide(self, observation): # 决策
        position, velocity = observation
        lb = min(-0.09 * (position + 0.25) ** 2 + 0.03,
                0.3 * (position + 0.9) ** 4 - 0.008)
        ub = -0.07 * (position + 0.38) ** 2 + 0.07
        if lb < velocity < ub:
            action = 2
        else:
            action = 0
        return action # 返回动作

    def learn(self, *args): # 学习
        pass
    

def play(env, agent, render=False, train=False): # 环境,  render 是否图示,  train: 学习时 为 True, 测试时 为 False
    episode_reward = 0. # 记录回合总奖励,初始化为0
    observation = env.reset() # 重置游戏环境,开始新回合
    while True: # 不断循环,直到回合结束
        if render: # 判断是否显示
            env.render() # 显示图形界面,图形界面可以用 env.close() 语句关闭
        action = agent.decide(observation)
        next_observation, reward, done, _ = env.step(action) # 执行动作
        episode_reward += reward # 收集回合奖励
        if train: # 判断是否训练智能体
            agent.learn(observation, action, reward, done) # 学习
        if done: # 回合结束,跳出循环
            break
        observation = next_observation
    return episode_reward # 返回回合总奖励


env = gym.make('MountainCar-v0')
env.seed(3) # 设置随机种子,让结果可复现
agent = SimpleAgent(env)
print('观测空间 = {}'.format(env.observation_space))
print('动作空间 = {}'.format(env.action_space))
print('观测范围 = {} ~ {}'.format(env.observation_space.low,
        env.observation_space.high))
print('动作数 = {}'.format(env.action_space.n))

episode_reward = play(env, agent, render=True)
print('回合奖励 = {}'.format(episode_reward))

episode_rewards = [play(env, agent) for _ in range(100)]   #  100 个 回合 !
print('平均回合奖励 = {}'.format(np.mean(episode_rewards)))

  • 和之前的报错一样
    ——> Colab

在这里插入图片描述

测试智能体在 Gym 库中某个任务的性能时,出于习惯使然,学术界一般最关心 100 个回合的平均回合奖励。
对于有些任务,还会指定一个参考的回合奖励值,当连续 100 个回合的奖励大于指定的值时,则认为该任务被解决了。

SimpleAgent 类对应策略的平均回合奖励在−110 左右,而对于小车上山任务,只要连续 100 个回合的平均回合奖励大于 -110,就可以认为该任务被解决了。

补充: Gym 升级版本 Gymnasium

Gym 库官网链接

链接: 强化学习算法测试 简单环境

在这里插入图片描述

Gymnasium GitHub 链接

备选的报错解决方案

pip install gymnasium

官方示例:

import gymnasium as gym
env = gym.make("CartPole-v1")

observation, info = env.reset(seed=42)
for _ in range(1000):
    action = env.action_space.sample()
    observation, reward, terminated, truncated, info = env.step(action)

    if terminated or truncated:
        observation, info = env.reset()
env.close()

补充: Jupyter 中显示 gym 渲染窗口及保存为 gif _ matplotlib

参考链接

Colab:

import numpy as np
import time 
import gym
import matplotlib.pyplot as plt 
from matplotlib import animation 
%matplotlib inline
from IPython import display


# 显示gym渲染窗口的函数,在运行过程中将 env.render() 替换为 show_state(env, step, info).
def show_state(env, step=0, info=""):
    plt.figure(3)
    plt.clf()
    plt.imshow(env.render(mode='rgb_array'))
    plt.title("Step: %d %s" % (step, info))
    plt.axis('off')

    display.clear_output(wait=True)
    display.display(plt.gcf())

def display_frames_as_gif(frames, SavePath = './test.gif'):
    patch = plt.imshow(frames[0])
    plt.axis('off')
    def animate(i):
        patch.set_data(frames[i])

    anim = animation.FuncAnimation(plt.gcf(), animate, frames = len(frames), interval=1)
    anim.save(SavePath, writer='ffmpeg', fps=30)


############################################

# 运行环境实例 1

import gym

frames=[]
env = gym.make('CartPole-v1')
info = env.reset() # 重置环境 

for step in range(100):
    frames.append(env.render(mode='rgb_array')) # 加载各个时刻图像到帧
    show_state(env, step, info = 'CartPole_test') # 显示渲染窗口
    action = env.action_space.sample() # 随机动作,需要学习的动作模型
    # action=np.random.choice(2) # 随机返回: 0 小车向左,1 小车向右

    observation,reward,done,info = env.step(action) # 执行动作并返回结果

env.close()

display_frames_as_gif(frames, SavePath = './CartPole_result.gif') # 保存运行结果动图

在这里插入图片描述
Colab + gym

!pip install -q swig
!pip install box2d==2.3.2 gym[box2d]==0.25.2 box2d-py pyvirtualdisplay tqdm numpy==1.22.4
!pip install box2d==2.3.2 box2d-kengz
import numpy as np
import time 
import gym
import matplotlib.pyplot as plt 
from matplotlib import animation 
%matplotlib inline
from IPython import display


# 显示gym渲染窗口的函数,在运行过程中将 env.render() 替换为 show_state(env, step, info).
def show_state(env, step=0, info=""):
    plt.figure(3)
    plt.clf()
    plt.imshow(env.render(mode='rgb_array'))
    plt.title("Step: %d %s" % (step, info))
    plt.axis('off')

    display.clear_output(wait=True)
    display.display(plt.gcf())

def display_frames_as_gif(frames, SavePath = './test.gif'):
    patch = plt.imshow(frames[0])
    plt.axis('off')
    def animate(i):
        patch.set_data(frames[i])

    anim = animation.FuncAnimation(plt.gcf(), animate, frames = len(frames), interval=1)
    anim.save(SavePath, writer='ffmpeg', fps=30)


############################################

# 运行环境实例2

import gym

frames=[]
env = gym.make("LunarLander-v2")
env.reset()
env.action_space.seed(42)

observation, info = env.reset(seed=42, return_info=True)

for step in range(100):
    frames.append(env.render(mode='rgb_array')) # 加载各个时刻图像到帧
    # env.render(mode='human') # 这行不能和env定义写在一行,否则会报错,原因不明
    time.sleep(0.1) # 控制显示速度变慢
    show_state(env, step, info="LunarLander_test")
    observation, reward, done, info = env.step(env.action_space.sample())
    # observation, reward, terminated, truncated, info = env.step(env.action_space.sample())
    if done:
    # if terminated or truncated:
        observation, info = env.reset(return_info=True)

env.close()
display_frames_as_gif(frames, SavePath = './LunarLander_result.gif') # 保存运行结果动图

在这里插入图片描述

  • 通过 pygame 可视化
  • Xvfb 可参考链接

————————————————

强化学习:环境、动作、奖励。
强化学习 的使用场景: 多序列决策问题。

第 2 章 马尔可夫决策过程

状态非常多 的 ( s , a , r ) (s, a,r) (s,a,r) 过程 求解: 迭代
1、动态规划
2、蒙特卡洛 (采样)
3、时序差分 (TD-learning) = 蒙特卡洛 + 动态规划

在这里插入图片描述

bootstrapping 自举: 根据其它估计值 来更新 估计值。

在这里插入图片描述

动态规划: 最优子结构 + 重叠子问题

策略迭代:
1、策略评估
2、策略改进

值迭代 中间过程 的策略 和 值 是没有意义的。
策略迭代的每一次迭代的结果都是有意义的, 都是一个完整的策略。

在这里插入图片描述

JoyRL

试错学习

序列决策

在机器人中实现强化学习 的成本 比较高:
1、观测环境的状态 需要 大量传感器
2、试错学习 的实验成本 高昂
3、训练过程中 决策失误造成设备损坏

仿真

金融: 根据价格变化进行股票买卖决策, 最大化资产。

逆强化学习 【奖励函数 也通过学习来确定】。 专家数据的噪声

探索: 避免局部最优

离线强化学习

在离线环境中训练一个世界模型,然后将世界模型部署到在线环境中进行决策。
世界模型的思路是将环境分为两个部分,一个是世界模型,另一个是控制器。世界模型的作用是预测下一个状态,而控制器的作用是根据当前的状态来决策动作
如何提高世界模型的预测精度?

多任务强化学习
在实际应用中,智能体往往需要同时解决多个任务,例如机器人需要同时完成抓取、搬运、放置等任务,而不是单一的抓取任务。在这种情况下,如何在多个任务之间做出权衡是一个难题。

目前比较常用的方法有 联合训练分层强化学习 等等。

  • 联合训练的思路是将多个任务的奖励进行加权求和,然后通过强化学习来学习一个策略
  • 分层强化学习的思路是将多个任务分为两个层次,一个是高层策略,另一个是低层策略。
    高层策略的作用是决策当前的任务,而低层策略的作用是决策当前任务的动作。这样就可以通过强化学习来学习高层策略和低层策略,从而解决多任务强化学习的问题。
    如何提高 高层策略 的决策精度?

———————————

随机变量 大写

马尔可夫性质:

P ( S t + 1 ∣ S t ) = P ( S t + 1 ∣ S 0 , S 1 , ⋯   , S t − 1 , S t ) P(S_{t+1}|S_t)=P(S_{t+1}|\textcolor{blue}{S_0, S_1, \cdots, S_{t-1}},S_t) P(St+1St)=P(St+1S0,S1,,St1,St)

在给定历史状态 S 0 , S 1 , ⋯   , S t − 1 , S t S_0, S_1, \cdots, S_{t-1},S_t S0,S1,,St1,St 的情况下, 某个状态的未来只和当前状态 S t S_t St 有关, 与历史状态无关。

AlphaGO 算法:用深度学习神经网络来表示当前的棋局,并用蒙特卡洛搜索树等技术来模拟玩家的策略和未来可能的状态,来构建一个新的决策模型

状态转移概率 : 当前状态 s s s ——> 下一状态 s ′ s^\prime s

P s s ′ = P ( S t + 1 = s ′ ∣ S t = s ) P_{ss^\prime}=P(S_{t+1}=s^\prime|S_t=s) Pss=P(St+1=sSt=s)

动态规划问题 的 3 个 性质:
1、最优化原理
2、无后效性 【某阶段状态一旦确定,就不受这个状态以后决策的影响。马尔可夫性质】
3、有重叠子问题

状态值函数: V π ( s ) = E π ( G t ∣ S t = s ) V_\pi(s)=\mathbb E_{\pi}(G_t|S_t=s) Vπ(s)=Eπ(GtSt=s)

  • 从特定状态出发, 按照某个策略 π \pi π 【一般带一定随机性】进行决策所能得到的回报期望值。

动作值函数: Q π ( s , a ) = E π [ G t ∣ s t = s , a t = a ] Q_\pi(s, a)=\mathbb E_\pi [G_t|s_t=s, a_t=a] Qπ(s,a)=Eπ[Gtst=s,at=a]

V π ( s ) = ∑ a ∈ A π ( a ∣ s ) Q π ( s , a ) V_\pi(s)=\sum\limits_{a\in\mathcal A}\pi(a|s)Q_\pi(s, a) Vπ(s)=aAπ(as)Qπ(s,a)

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

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

相关文章

xcode和iPhone真机或者watch真机连接问题

1.如果真机是第一次连接xocde&#xff0c;就需要开启真机上的开发者模式&#xff0c;开启开发者模式的方式&#xff1a; iphone/ipad开启方式: 设置 > 隐私与安全 > 开发者模式 > 开启&#xff0c;然后重启就可以了 watch设置&#xff1a;很麻烦&#xff0c;看文章…

Hive期末总结

hive的概念&#xff0c;谁开发的 Apache Hive 是一个Apache 软件基金会维护的开源项目 Facebook贡献 hive是一个基于hadoop的数据仓库工具&#xff08;对数据汇总查询和分析的工具&#xff09; hive执行原理 Hive通过给用户提供的一系列交互接口&#xff0c;接收到用户的指令…

Leetcode3179. K 秒后第 N 个元素的值

Every day a Leetcode 题目来源&#xff1a;3179. K 秒后第 N 个元素的值 解法1&#xff1a;模拟 模拟 k 轮&#xff0c;数组保存上一次结果&#xff0c;然后计算当前轮次的结果。 代码&#xff1a; /** lc appleetcode.cn id3179 langcpp** [3179] K 秒后第 N 个元素的值…

自然语言处理概述

目录 1.概述 2.背景 3.作用 4.优缺点 4.1.优点 4.2.缺点 5.应用场景 5.1.十个应用场景 5.2.文本分类 5.2.1.一般流程 5.2.2.示例 6.使用示例 7.总结 1.概述 自然语言处理&#xff08;NLP&#xff09;是计算机科学、人工智能和语言学的交叉领域&#xff0c;旨在实…

JAVA 注解搜索工具类与注解原理讲解(获取方法和类上所有的某个注解,父类继承的注解也支持获取)

文章目录 JAVA 注解搜索工具类与注解原理讲解&#xff08;获取方法和类上所有的某个注解&#xff0c;父类继承的注解也支持获取&#xff09;代码测试方法上加注解&#xff0c;类上不加类上加注解、方法上加注解 注解原理性能测试 JAVA 注解搜索工具类与注解原理讲解&#xff08…

技术差异,应用场景;虚拟机可以当作云服务器吗

虚拟机和云服务器是现在市面上常见的两种计算资源提供方式&#xff0c;很多人把这两者看成可以相互转换或者替代的物品&#xff0c;实则不然&#xff0c;这两种资源提供方式有许多相似之处&#xff0c;但是也有不少区别&#xff0c;一篇文章教你识别两者的技术差异&#xff0c;…

人工智能中的监督学习和无监督学习

欢迎来到 Papicatch的博客 目录 &#x1f349;引言 &#x1f349;监督学习 &#x1f348;基本思想 &#x1f348;具体过程 &#x1f34d;数据收集 &#x1f34d;数据预处理 &#x1f34d;模型选择 &#x1f34d;模型训练 &#x1f34d;模型评估 &#x1f34d;模型部署…

深入理解预处理

1.预定义符号 C语言设置了⼀些预定义符号&#xff0c;可以直接使用&#xff0c;预定义符号也是在预处理期间处理的。 __FILE__ //进⾏编译的源⽂件 __LINE__ //⽂件当前的⾏号 __DATE__ //⽂件被编译的⽇期 __TIME__ //⽂件被编译的时间 __STDC__ //如果编译器遵循ANSI C&…

DSP28335:中断系统

1.中断介绍 F28335的中断&#xff1a; 中断源可分为片内中断源和片外中断源&#xff0c;这些外设中断源需要把中断请求传递给内核需要中断线。 14个课屏蔽中断是通过相应的使能寄存器控制是否进行中断。 28335总共的中断源有58个&#xff0c;可是只有12个中断线&#xff0c;如…

分页插件bs_pagination与Bootstrap4、jQuery3.7.1不兼容的问题

问题场景&#xff1a; 开发环境&#xff1a; 项目&#xff1a;CRM IDE&#xff1a;intelij IDEA JDK: jdk21.0.2 JQuery&#xff1a;3.7.1 Bootstrap&#xff1a;4.6 项目中需要查询数据库中的数据&#xff0c;并且以分页显示的方式显示在页面上&#xff0c;前端页面用到了分页…

嵌入式实验---实验二 中断功能实验

一、实验目的 1、掌握STM32F103中断程序设计流程&#xff1b; 2、熟悉STM32固件库的基本使用。 二、实验原理 1、在上一章的实验基础上&#xff0c;添加一个按键和一个LED&#xff1b; 2、使用中断的方式实现以下两个功能&#xff1a; &#xff08;1&#xff09;KEY1按键…

考研计组chap4指令系统

目录 一、指令格式 155 13.操作码地址码 2.按照地址码数量 &#xff08;1&#xff09;零地址指令 &#xff08;2&#xff09;一地址指令 &#xff08;3&#xff09;二地址指令 &#xff08;4&#xff09;三地址指令 &#xff08;5&#xff09;四地址指令 3.指令长度 …

RabbitMQ实践——超时消息的处理方法

大纲 准备工作整个队列的消息都有相同的时效性抛弃超时消息新建带x-message-ttl的队列新建绑定关系实验 超时消息路由到死信队列新建带死信和ttl的队列新建绑定关系实验 消息指定自己的超时时间新建带死信的队列绑定实验 消息自带TTL和队列TTL的关系消息TTL < 队列指定TTL消…

vxe-table 列表过滤踩坑_vxe-table筛选

但是这个过滤输入值必须是跟列表的值必须一致才能查到&#xff0c;没做到模糊查询的功能&#xff0c;根据关键字来过滤并没有实现。 下面提供一下具体实现方法&#xff1a;&#xff08;关键字来过滤&#xff09; filterNameMethod({ option, row }) {if (row.name.indexOf(op…

Vue65-vue-resource:ajax请求

vue-resource是vue的插件库&#xff0c;用vue.use(xxxx)使用插件。 1、安装 2、引入和使用 这个库&#xff0c;维护的频率不高了。还是建议使用&#xff1a;axios&#xff0c;vue-resource只是了解即可。

Qt Quick 教程(一)

文章目录 1.Qt Quick2.QML3.Day01 案例main.qml退出按钮&#xff0c;基于上面代码添加 4.使用Qt Design StudioQt Design Studio简介Qt Design Studio工具使用版本信息 1.Qt Quick Qt Quick 是一种现代的用户界面技术&#xff0c;将声明性用户界面设计和命令性编程逻辑分开。 …

win11照片裁剪视频无法保存问题解决

win11照片默认走核显&#xff0c;intel的显卡可能无法解码&#xff0c;在设置里把照片的显示卡默认换成显卡就好了

基于百度飞桨PaddleOCR应用开发实践银行卡卡面内容检测识别系统

OCR相关的内容我在之前的工作中虽有所涉及&#xff0c;但是还是比较少的&#xff0c;最近正好需要用到OCR的一些技术&#xff0c;查了一些资料&#xff0c;发现国内的话百度这块做的还是比较全面系统深入的&#xff0c;抱着闲来无事学习了解的心态&#xff0c;这里花了点时间基…

M1失效后,哪个是观察A股的关键新指标?

M1失效后&#xff0c;哪个是观察A股的关键新指标&#xff1f; 央地支出增速差&#xff08;地方-中央支出增速的差值&#xff09;或许是解释沪深300定价更有效的前瞻指标。该数值扩张&#xff0c;则有利于大盘指数&#xff0c;反之亦然&#xff0c;该指标从2017年至今对大盘指数…

【CSS in Depth2精译】1.1.4 源码顺序

解决层叠冲突的最后一环叫做 源码顺序&#xff0c;有时又称为 出现顺序&#xff08;order of appearance&#xff09;。如果其他判定规则均一致&#xff0c;则样式表中后出现的、或者在页面较晚引入的样式表声明&#xff0c;将最终胜出。 也就是说&#xff0c;可以通过控制源码…