Scikit-learn强化学习代码批注及相关练习

news2025/1/11 4:28:58

一、游戏介绍

木棒每保持平衡1个时间步,就得到1分。每一场游戏的最高得分为200分每一场游戏的结束条件为木棒倾斜角度大于41.8°或者已经达到200分。最终获胜条件为最近100场游戏的平均得分高于195。代码中env.step(),的返回值就分别代表了。观测Observation:当前step执行后,环境的观测。奖励Reward:执行上一步动作(action)后,智能体(agent)获得的奖励,不同的环境中奖励值变化范围也有不同,但是强化学习的目标就是总奖励值最大。完成Done表示是否需要将环境重置env.reset,大多数情况下,当Done为True时,就表明当前回合(episode)结束。信息Info:针对调试过程的诊断信息,在标准的智能体仿真评估当中不会使用到这个info。
在这里插入图片描述
在这里插入图片描述

二、代码批注

import gym
import numpy as np

env = gym.make('CartPole-v0')

max_number_of_steps = 200   # 每一场游戏的最高得分
#---------获胜的条件是最近100场平均得分高于195-------------
goal_average_steps = 195
num_consecutive_iterations = 100
#----------------------------------------------------------
num_episodes = 5000 # 共进行5000场游戏
last_time_steps = np.zeros(num_consecutive_iterations)  # 只存储最近100场的得分(可以理解为是一个容量为100的栈)

# q_table是一个256*2的二维数组
# 离散化后的状态共有4^4=256中可能的取值,每种状态会对应一个行动
# q_table[s][a]就是当状态为s时作出行动a的有利程度评价值
# 我们的AI模型要训练学习的就是这个映射关系表
q_table = np.random.uniform(low=-1, high=1, size=(4 ** 4, env.action_space.n))

# 分箱处理函数,把[clip_min,clip_max]区间平均分为num段,位于i段区间的特征值x会被离散化为i
def bins(clip_min, clip_max, num):
    return np.linspace(clip_min, clip_max, num + 1)[1:-1]

# 离散化处理,将由4个连续特征值组成的状态矢量转换为一个0~~255的整数离散值
def digitize_state(observation):
    # 将矢量打散回4个连续特征值
    cart_pos, cart_v, pole_angle, pole_v = observation
    # 分别对各个连续特征值进行离散化(分箱处理)
    digitized = [np.digitize(cart_pos, bins=bins(-2.4, 2.4, 4)),
                 np.digitize(cart_v, bins=bins(-3.0, 3.0, 4)),
                 np.digitize(pole_angle, bins=bins(-0.5, 0.5, 4)),
                 np.digitize(pole_v, bins=bins(-2.0, 2.0, 4))]
    # 将4个离散值再组合为一个离散值,作为最终结果
    return sum([x * (4 ** i) for i, x in enumerate(digitized)])

# 根据本次的行动及其反馈(下一个时间步的状态),返回下一次的最佳行动
def get_action(state, action, observation, reward):
    next_state = digitize_state(observation)    # 获取下一个时间步的状态,并将其离散化
    next_action = np.argmax(q_table[next_state])    # 查表得到最佳行动
    #-------------------------------------训练学习,更新q_table----------------------------------
    alpha = 0.2     # 学习系数α
    gamma = 0.99    # 报酬衰减系数γ
    q_table[state, action] = (1 - alpha) * q_table[state, action] + alpha * (reward + gamma * q_table[next_state, next_action])
    # -------------------------------------------------------------------------------------------
    return next_action, next_state

def get_action2(state, action, observation, reward, episode):
    next_state = digitize_state(observation)
    epsilon = 0.2*(0.95**episode)   # ε-贪心策略中的ε
    if epsilon <= np.random.uniform(0, 1):
        next_action = np.argmax(q_table[next_state])
    else:
        next_action = np.random.choice([0, 1])
    #-------------------------------------训练学习,更新q_table----------------------------------
    alpha = 0.2     # 学习系数α
    gamma = 0.99    # 报酬衰减系数γ
    q_table[state, action] = (1 - alpha) * q_table[state, action] + alpha * (reward + gamma * q_table[next_state, next_action])
    # -------------------------------------------------------------------------------------------
    return next_action, next_state

# 重复进行一场场的游戏
for episode in range(num_episodes):
    observation = env.reset()   # 初始化本场游戏的环境
    state = digitize_state(observation)     # 获取初始状态值
    action = np.argmax(q_table[state])      # 根据状态值作出行动决策

    episode_reward = 0
    # 一场游戏分为一个个时间步
    for t in range(max_number_of_steps):
        env.render()    # 更新并渲染游戏画面
        observation, reward, done, info = env.step(action)  # 获取本次行动的反馈结果
        print(reward)
        if done:
            reward = -200
        action, state = get_action2(state, action, observation, reward, episode)  # 作出下一次行动的决策
        episode_reward += reward
        if done:
            # print('%d Episode finished after %f time steps / mean %f' % (episode, t + 1, last_time_steps.mean()))
            last_time_steps = np.hstack((last_time_steps[1:], [episode_reward]))  # 更新最近100场游戏的得分stack
            break
            # 如果最近100场平均得分高于195
        if (last_time_steps.mean() >= goal_average_steps):
            # print('Episode %d train agent successfuly!' % episode)
            break

print('Failed!')

三、问题回答

代码中两个策略get_action和get_action2分别对应哪个算法?去除第73-74行游戏结束的reward值赋值,结果有什么变化?

get_action:Q-learning
在这里插入图片描述
上面的α被称为学习系数,γ被称为报酬衰减系数,rt为时间步为t时得到的报酬。如果在时间步t时,状态为st,我们采取的行动为at,本次行动的有利程度记为Q(st,at)。
在这里插入图片描述
get_action2:Q-learning +ε-贪心策略
在get_action2中加入了贪心的策略。以ε的概率以均匀概率随机选一个方向进行移动;以1-ε的概率选择目前为止探索到的对于当前状态的最佳行动方向进行移动。
在这里插入图片描述
如果取去掉reward,得不到反馈。在main函数中的开头,这里的意思其实就是每次获得一个最好的action,然后计算,用更好的去填补他。这里evn.step每次返回的reward都是1,if done其实就代表了游戏被迫结束,如果不减值,那么相当于对模型没有反馈,模型会每次会找最好的值,但呢个最好的值是随机算出来的,最终的结果会卡在一个比较低的分数附近上上下下。
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

超全!年薪40w项目经理都在用的10个管理工具

大家好&#xff0c;我是老原。 今天的文章&#xff0c;当然还是干货为主。 这期给你安利一些免费、好用、高效、简洁的项目管理工具&#xff0c;这些工具都非常适合从事项目的打工人使用。 其实对于工作比较久的职场人来说&#xff0c;会有一个思维惯性&#xff0c;就是对免…

聚焦重要数据价值丨DolphinDB 降采样算法介绍

1. 绪论 在真实的业务场景中&#xff0c;时间序列数据具有以下特点&#xff1a; 采集频率&#xff08;秒级甚至毫秒级&#xff09;高&#xff0c;导致数据量非常庞大。数据价值密度低。 对数据进行合理的降采样不仅极大地可以降低系统压力、节约存储成本&#xff0c;同时也可…

基于Redhat8.5 部署zabbix5.4

仓库配置 本地源配置 mount /dev/sr0 /mnt //先挂载vim /etc/fatab //编辑挂载文件 以便于开机自动挂载/dev/sr0 /mnt iso9660 defaults 0 0mount -a 编辑yum 仓库 vim /etc/yum.repo.d/redhat.repo[BaseOS] namebaseos baseurlfile:///mnt/BaseOS gpgcheck0[AppS…

时空智友企业流程化管控系统文件上传漏洞

时空智友企业流程化管控系统文件上传漏洞 一、 产品简介二、 漏洞概述三、 影响范围四、 复现环境五、 漏洞复现小龙poc检测脚本测试连接 六、 修复建议 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的…

Java“牵手”快手商品详情数据,根据商品ID获取快手商品详情数据接口,快手API接口申请指南

快手小店怎么查看宝贝详情 快手小店作为快手平台上的一个电商服务&#xff0c;让很多卖家可以方便地在快手上开设店铺&#xff0c;销售自己的商品。如果你是快手小店的卖家&#xff0c;你可能会想知道如何查看自己的宝贝详情&#xff0c;以便更好地管理自己的店铺。下面就让我…

2.文章复现《热电联产系统在区域综合能源系统中的定容选址研究》(附matlab程序)

0.代码链接 1.简述 光热发电是大规模利用太阳能的新兴方式&#xff0c;其储热系 统能够调节光热电站的出力特性&#xff0c;进而缓解光热电站并网带来的火电机组调峰问题。合理配置光热电站储热容量&#xff0c;能够 有效降低火电机组调峰成本。该文提出一种光热电站储热容 量配…

原生JS实现拾色器功能

没事儿干&#xff0c;写一个拾色器&#xff0c;原生 JS 实现&#xff0c;先看效果图&#xff1a; 一、写页面 <div class"circle"></div>.circle {width: 200px;height: 200px;border: 1px #999 solid;margin: 200px 0 0 200px;border-radius: 50%;back…

rust库学习-env_logger(actix-web添加彩色日志、rust添加彩色日志 )

文章目录 介绍actix-web启用彩色日志crate地址&json格式日志 我们在进行rust的web开发时&#xff0c;如果不指定日志&#xff0c;就不会有输出&#xff0c;非常不友好 这里我们使用env_logger进行日志打印 介绍 env_logger 需要配合 log 库使用, env_logger 是 Rust 社区…

23年5月软考电子版证书已上线!

首先恭喜一下&#xff0c;5月软考考试通过的小伙伴们&#xff0c;几个月的辛苦耕耘&#xff0c;终于得到了回报&#xff01;即日起&#xff0c;23年5月软考电子版证书已上线&#xff01;可以登录网址自行下载了&#xff01; 2023年5月软考电子版证书查询打印方法一&#xff1a…

USB Type-C端口集成式ESD静电保护方案 安全低成本

Type-C端口是根据USB3.x和USB4协议传输数据的&#xff0c;很容易受到电气过载&#xff08;EOS&#xff09;和静电放电&#xff08;ESD&#xff09;事件的影响。由于Type-C支持随意热插拔功能&#xff0c;其内部高集成度的芯片&#xff0c;更容易受到人体静电放电的伤害和损坏。…

【算法系列篇】二分查找——这还是你所知道的二分查找算法吗?

文章目录 前言什么是二分查找算法1.二分查找1.1 题目要求1.2 做题思路1.3 Java代码实现 2.在排序数组中查找元素的第一个和最后一个位置2.1 题目要求2.2 做题思路2.3 Java代码实现 3.搜索插入位置3.1 题目要求3.2 做题思路3.3 Java代码实现 4.x的平方根4.1 题目要求4.2 做题思路…

2023年中,量子计算产业现状——

2023年上半年&#xff0c;量子计算&#xff08;QC&#xff09;领域取得了一系列重要进展和突破&#xff0c;显示出量子计算技术的快速发展和商业应用的不断拓展。在iCV TAnk近期发表的一篇报告中&#xff0c;团队从制度进步、产业生态、投融资形势、总结与展望四个方面对量子计…

word文件怎么免费转换为pdf格式?

大家在编辑word文件的时候&#xff0c;可能需要进行格式的转换&#xff0c;比如将word转换为pdf格式这时候需要使用工具软件。接下来小编就给大家介绍word文件怎么免费转换为pdf格式&#xff0c;免费word转pdf格式的方法。 免费word转pdf格式的方法 我们需要在电脑中安装并打开…

PySide6学习笔记--gui小模版使用

一、界面绘制 1.desiner画图 2.画图代码 # -*- coding: utf-8 -*-################################################################################ ## Form generated from reading UI file t1gui.ui ## ## Created by: Qt User Interface Compiler version 6.5.2 ## ##…

Ajax+Vue+ElementUI

文章目录 1.Ajax1.1 介绍1.2 Ajax快速入门1.3 案例-用户注册时&#xff0c;检测用户名是否数据库已经存在1.4 Axios1.4.1 Axios快速入门1.4.2 请求别名 1.5 JSON1.5.1 Json的基础语法1.5.2 FastJson的使用5.3.2 Fastjson 使用 2. Vue2.1 介绍2.2 Vue快速入门2.3 Vue常用指令和生…

el-upload 图片上传

1、这三个是必须的 2、设置对应的参数 3、设置上传之前和成功之后的回调

动态数据源切换类AbstractRoutingDataSource

写在前面 在工作中为了能够提高数据库的读写能力&#xff0c;经常会用到分库分表等技术&#xff0c;此时不可避免的就要涉及到动态数据源切换的内容&#xff0c;针对这个问题&#xff0c;spring提供了AbstractRoutingDataSource类来满足我们的需求&#xff0c;本文就一起来看下…

AI智能问答在哪些领域可以应用呢

对于AI智能问答这个全新的领域很多人都是懵懵懂懂的&#xff0c;以为这就和一些科技大企业有关。但是其实不是的&#xff0c;这和我们每个人的日常生活都息息相关。这篇文章&#xff0c;looklook就来和大家讲讲AI智能问答可以有哪些应用的方向&#xff0c;有需要的朋友们就看下…

F#奇妙游(22):Monte Carlo方法的F#实现

一个小问题的求解 问题 一根 1m 长的玻璃棒&#xff0c;摔倒地上断成 3 段&#xff0c;最短一段的平均值是多少&#xff1f; 假设玻璃棒一定会摔成三段&#xff0c;且玻璃棒质地均匀&#xff0c;为理想状态。 物理的视角 玻璃棒摔成三段&#xff0c;其物理过程是什么样的&…

VUE调用高德地图之电子围栏

最近项目上电子围栏功能,就是地图上限定的区域内实现限行功能,用我们身边的事物来举例,共享单车的限行、限停区域就是电子围栏。由此可见,电子围栏最基础的做法就是在地图上实现多边形覆盖物。 效果图大概如下: 照例,第一步:加载JS AP。 1.在public/index.html中加入…