q-learning强化学习使用基础

news/2024/5/19 0:11:14 标签: 强化学习, gym

强化学习

通过策略的方式来学习,q-learing(马尔科夫链模型)

马尔科夫链:奖励*折扣因子,R(t)=reward(1)+yR(t+1),马尔可夫链多次迭代后分布趋于稳定所以可以得到最优解

q-learning

  • 构建qtable,二维数组包含两个维度,state、action,qtable迭代过程中值不大于1
-action1action2action3
state1
state2
state3

action更新公式:Q(s,a)←Q(s,a)+α[reward+γmax′​Q(s′,a′)−Q(s,a)]
给每个action打分,最后使用numpy的argmax得到最大值索引
γ折扣因子,值越大,当前action权重越大,否者历史action权重大

训练过程引入贪心算法
在这里插入图片描述

gym_20">gym使用

import gym

quit = False
env = gym.make("CartPole-v1", render_mode="human")
print(env.observation_space,env.action_space)
state = env.reset()    #reset返回env内在的状态4参数,qtable的state=4个参数组成一个state值,再根据state的参数范围,划分出n个状态,action=0,1左右2个值
while not quit:
    env.render()
    env.step(1)

官方demo

env = gym.make('CartPole-v0')
for i_episode in range(20):
    observation = env.reset() #初始化环境每次迭代
    for t in range(100):
        env.render() #显示
        print(observation)
        action = env.action_space.sample() #随机选择action
        observation, reward, done, info = env.step(action)
        if done:#判断游戏是否结束
            print("Episode finished after {} timesteps".format(t+1))
            break
env.close()

在这里插入图片描述

q-learning

官方demo,gym的reward奖励不需要自己构建,gym会根据用户操作给出相应的reward值,step函数返回

alpha = 0.8
nstate = 50   #划分状态区间,平衡游戏只在初始位置有效,平均划分状态值不好训练
gamma = 1  #衰减因子
env = gym.make("CartPole-v0", render_mode="human")
table = np.zeros((nstate,nstate,nstate,nstate,env.action_space.n))#左右两个action
print(env.observation_space,env.action_space)

for i in range(10000):
    t=0
    observation = env.reset()
    high = env.observation_space.high
    low = env.observation_space.low
    high[1]=high[3]=10   #重新定义取值范围,否则state索引位置不变化
    low[1]=low[3]=-10   #重新定义取值范围,否则state索引位置不变化
    while True:
        env.render()
        div = (high-low)/nstate
        state = tuple(((observation[0]-env.observation_space.low)/div).astype(int))
        if np.random.random() < 0.3:#随机选择
            action = env.action_space.sample()
        else:
            action = np.argmax(table[state])
        t+=1
        observation = env.step(action)
        table[state][action] += (alpha*(observation[1]+ gamma * np.max(table[state])-table[state][action]))
        if observation[2]: 
            print("{} Episode finished after {} timesteps".format(state,t+1))
            break;    

小车爬山的例子

在这里插入图片描述

env = gym.make("MountainCar-v0", render_mode="human")
n_states = 40
iter_max = 10000
gamma = 1.0
epsilon = 0.3
alpha = 0.5

def obs_to_state(obs):   #把参数范围划分40个状态,求当前值在哪个状态区间
    env_low = env.observation_space.low
    env_high = env.observation_space.high
    env_dx = (env_high - env_low) / n_states
    state_index = tuple(((obs - env_low) / env_dx).astype(int))
    return state_index

Q = np.zeros((n_states, n_states, env.action_space.n))
obs = env.reset()
s = obs_to_state(obs[0])
while True:
    env.render()
    if np.random.uniform(0, 1) < epsilon:
        a = env.action_space.sample()
    else:
        a = np.argmax(Q[s])
    obs = env.step(a)
    if obs[2]: break
    next_s = obs_to_state(obs[0])
    td_target = obs[1] + gamma * np.max(Q[next_s])
    td_error = td_target - Q[s][a]
    Q[s][a] += alpha * td_error
    s = next_s

print(Q)

保存参数值

numpy.save(“1”,qtable)
numpy.load(“1”)

qtable保存,每次使用qtable的结果执行,训练过程中保存state的多维数组的索引都有遍历到,去掉随机因子就可以使用qtable决策了,qtable需要遍历所有的qtable得到一个稳定的结果,训练太慢可以是DQN网络

gym以外的其他游戏,需要自定义reward奖励,每个状态的奖励值差别越大学习越快。

q-learning适用于离散的运动,连续的状态变换效果不是很好


http://www.niftyadmin.cn/n/5042007.html

相关文章

VR全景应用在企业招聘和求职上有什么特别之处?

每年国家在反诈骗宣传上都要花费巨大的心力&#xff0c;电信诈骗的案例总是不绝于耳&#xff0c;还记得《孤注一掷》的潘生吗&#xff1f;遭受职场不公后&#xff0c;经人介绍加入海外一家游戏公司赚取高薪&#xff0c;结果一脚踏入电信诈骗的深渊。 这些真实的案例让不少求职人…

【2023华为杯B题】DFT类矩阵的整数分解逼近(思路及代码下载)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

ORACLE修改service_name服务名

ORACLE修改service_name服务名 1.备份相关参数文件 #备份spfile create pfile/tmp/pfile from spfile;#备份tnsnames.ora cd $ORACLE_HOME/network/admin/ cp tnsnames.ora tnsnames.bak2.修改service_name #查看当前服务名 show parameter service_names;#修改服务名 ALTER…

2023年前端流行什么技术和框架了?

Web前端三大主流框架有React、Vue.js和Angular&#xff0c;由于接触过Vue.js&#xff0c;接下来主讲最新的Vue3.0&#xff01; Vue3.0作为最新版本的Vue.js框架&#xff0c;拥有更强大的性能和更丰富的功能&#xff0c;为低代码开发平台注入了全新的活力。而JNPF快速开发平台作…

C++ 字符串格式化方法

最近用C写代码的时候,发现C居然没有自己的字符串格式化的方法(PS:C20才推出了自己format),所以如果不支持C20,就没有现成的用,在网上找了一圈,发现了某位大神自己写的C字符串格式化的工具,就是一个Format.h头文件,可以直接用,很方便 Github地址:https://github.com/arajar/for…

服务器租用多少钱一年?

租用服务器的费用是企业非常关心的问题&#xff0c;一般来说这个价格是由多种因素决定的&#xff0c;包括服务器商、服务器自身的配置、带宽、地域、服务时长等都有关系&#xff0c;大概在几百、几千到几万元不等&#xff0c;今天就来讲一讲这些影响服务器租用价格的因素吧&…

2023上海工博会,正运动展位现场直击(二)

9月21日&#xff0c;上海工博会已经成功开展了2天&#xff0c;热度仍旧不减&#xff0c;正运动技术展位6.1H-E261不仅吸引了大量工业自动化专业人士&#xff0c;而且也为他们呈现了一系列令人印象深刻的产品和运动控制解决方案。其中&#xff0c;高性能软硬件产品引发了广泛关注…

想学嵌入式开发,薪资怎么样?

想学嵌入式开发&#xff0c;薪资怎么样&#xff1f; 对于嵌入式工程师来说呢&#xff0c;它重点学习内容就是首先一定要打好基础&#xff0c;如果从编程语言角度来讲&#xff0c;那么可以在语言上选C或者C&#xff0c;你可以选择其中任何一门语言作为你的入门。 最近很多小伙伴…