1. 随机搜索策略

在本节中,我们将学习一种比随机选择动作更复杂的策略来解决 CartPole 问题——随机搜索策略。

一种简单但有效的方法是将智能体对环境的观测值映射到代表两个动作的二维向量,然后我们选择值较高的动作执行。映射函数使用权重矩阵描述,权重矩阵的形状为 4 x 2,因为在CarPole环境中状态是一个 4 维向量,而动作有 2 个可能值。在每个回合中,首先随机生成权重矩阵,并用于计算此回合中每个步骤的动作,并在回合结束时计算总奖励。重复此过程,最后将能够得到最高总奖励的权重矩阵作为最终的动作选择策略。由于在每个回合中我们均会随机选择权重矩阵,因此称这种方法为随机搜索,期望通过在多个回合的测试中找到最佳权重。

2. 使用 PyTorch 实现随机搜索算法

在本节中,我们使用 PyTorch 实现随机搜索算法。

首先,导入 Gym 和 PyTorch 以及其他所需库,并创建一个 CartPole 环境实例:

import gym
import torch
from matplotlib import pyplot as plt
env = gym.make('CartPole-v0')

获取并打印状态空间和行动空间的尺寸:

n_state = env.observation_space.shape[0]
print(n_state)
# 4
n_action = env.action_space.n
print(n_action)
# 2

当我们在之后定义权重矩阵时,将会使用这些尺寸,即权重矩阵尺寸为 (n_state, n_action) = (4 x 2)

接下来,定义函数用于使用给定输入权重模拟 CartPole 环境的一个游戏回合并返回此回合中的总奖励:

def run_episode(env, weight):
    state = env.reset()
    total_reward = 0
    is_done = False
    while not is_done:
        state = torch.from_numpy(state).float()
        action = torch.argmax(torch.matmul(state, weight))
        state, reward, is_done, _ = env.step(action.item())
        total_reward  = reward
    return total_reward

在以上代码中,我们首先将状态数组 state 转换为浮点型张量,然后计算状态数组和权重矩阵张量的乘积 torch.matmul(state, weight),以将状态数组进行映射映射为动作数组,使用 torch.argmax() 操作选择值较高的动作,例如值为 [0.122, 0.333],则应选择动作 1。然后使用 item() 方法获取操作结果值,因为此处的 step() 方法需要接受单元素张量,获取新的状态和奖励。重复以上过程,直到回合结束。

指定回合数,并初始化变量用于记录最佳总奖励和相应权重矩阵,并初始化数组用于记录每个回合的总奖励:

n_episode = 1000
best_total_reward = 0
best_weight = None
total_rewards = []

接下来,我们运行 n_episode 个回合,在每个回合中,执行以下操作:

  • 构建随机权重矩阵
  • 智能体根据权重矩阵将状态映射到相应的动作
  • 回合终止并返回总奖励
  • 更新最佳总奖励和最佳权重,并记录总奖励
for e in range(n_episode):
    weight = torch.rand(n_state, n_action)
    total_reward = run_episode(env, weight)
    print('Episode {}: {}'.format(e 1, total_reward))
    if total_reward > best_total_reward:
        best_weight = weight
        best_total_reward = total_reward
    total_rewards.append(total_reward)

运行 1000 次随机搜索获得最佳策略,最佳策略由 best_weight 参数化。在测试最佳策略之前,我们可以计算通过随机搜索获得的平均总奖励:

print('Average total reward over {} episode: {}'.format(n_episode, sum(total_rewards) / n_episode))
# Average total reward over 1000 episode: 46.722

可以看到,对比使用随机动作获得的结果 (22.19),使用随机搜索获取的总奖励是其两倍以上。

接下来,我们使用随机搜索得到的最佳权重矩阵,在 1000 个新的回合中测试其表现如何:

n_episode_eval = 1000
total_rewards_eval = []
for episode in range(n_episode_eval):
    total_reward = run_episode(env, best_weight)
    print('Episode {}: {}'.format(episode 1, total_reward))
    total_rewards_eval.append(total_reward)

print('Average total reward over {} episode: {}'.format(n_episode_eval, sum(total_rewards_eval) / n_episode_eval))
# Average total reward over 1000 episode: 114.786

随机搜索算法的效果能够获取较好结果的主要原因是 CartPole 环境较为简单。它的观察状态数组仅由四个变量组成。而在 Atari Space Invaders 游戏中的观察值超过 100000 (即 210 \times 160 \times 3210×160×3)。同样 CartPole 中动作状态的维数也仅仅为 2。通常,使用简单算法可以很好地解决简单问题。

我们也可以注意到,随机搜索策略的性能优于随机选择动作。这是因为随机搜索策略将智能体对环境的当前状态考虑在内。有了关于环境的相关信息,随机搜索策略中的动作就可以比完全随机的选择动作更加智能。

我们还可以在训练和测试阶段绘制每个回合的总奖励:

plt.plot(total_rewards, label='search')
plt.plot(total_rewards_eval, label='eval')
plt.xlabel('episode')
plt.ylabel('total_reward')
plt.legend()
plt.show()

可以看到,每个回合的总奖励是非常随机的,并且并没有因为回合数的增加显示出改善的趋势。在训练过程中,可以看到在实现前期有些回合的总奖励已经可以达到 200,由于智能体的策略并不会因为回合数的增加而改善,因此我们可以在回合总奖励达到 200 时结束训练:

n_episode = 1000
best_total_reward = 0
best_weight = None
total_rewards = []
for episode in range(n_episode):
    weight = torch.rand(n_state, n_action)
    total_reward = run_episode(env, weight)
    print('Episode {}: {}'.format(episode 1, total_reward))
    if total_reward > best_total_reward:
        best_weight = weight
        best_total_reward = total_reward
    total_rewards.append(total_reward)
    if best_total_reward == 200:
        break

由于每回合的权重都是随机生成的,因此获取最大奖励的策略出现的回合也并不确定。要计算所需训练回合的期望,可以重复以上训练过程 1000 次,并取训练次数的平均值作为期望:

n_training = 1000
n_episode_training = []
for _ in range(n_training):
    for episode in range(n_episode):
        weight = torch.rand(n_state, n_action)
        total_reward = run_episode(env, weight)
        if total_reward == 200:
            n_episode_training.append(episode 1)
            break
print('Expectation of training episodes needed: ', sum(n_episode_training) / n_training)
# Expectation of training episodes needed:  14.26

可以看到,平均而言,我们预计大约需要 14 个回合才能找到最佳策略。

到此这篇关于使用PyTorch实现随机搜索策略的文章就介绍到这了,更多相关PyTorch随机搜索内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

使用PyTorch实现随机搜索策略的更多相关文章

  1. PHP实现文件安全下载

    例如你希望客户要填完一份表格,才可以下载某一文件,你第一个想法一定是用"Redirect"的方法,先检查表格是否已经填写完毕和完整,然后就将网址指到该文件,这样客户才能下载,但如果你想做一个关于"网上购物"的电子商务网站,考虑安全问题,你不想用户直接复制网址下载该文件,笔者建议你使用PHP直接读取该实际文件然后下载的方法去做。feof){echofread;}fclose;}这样就可以用PHP直接输出文件了。

  2. 实现“上一页”和“下一页按钮

    offset=$prevoffset\">上一页\n";}//计算页面数$pages=intval;//$pagesnowcontainsintofpagesneededunlessthereisaremainderfromdivisionif{//hasremaindersoaddonepage$pages;}for{//显示页数$newoffset=$limit*;print"

  3. php获取指定数量随机字符串的方法

    这篇文章主要介绍了php获取指定数量随机字符串的方法,涉及php针对数组的遍历及字符串运算相关操作技巧,需要的朋友可以参考下

  4. 利用PHP实现与ASP Banner组件相似的类

    ********************************************************//*广告条管理程序publicmethodGetAdvertisementparametersTarget=Width=Height=Border=Redirect=*/classAdRotator{var$Target="_blank";var$Width="460";var$Height="60";var$Border=0;var$Redirect="";var$BannerData=ar

  5. vue实现搜索关键词高亮的详细教程

    这篇文章主要为大家介绍了vue实现搜索关键词高亮的详细教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  6. Mybatis-Plus主键生成策略的方法

    本文主要介绍了Mybatis-Plus主键生成策略的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  7. Yii2.0框架实现带分页的多条件搜索功能示例

    这篇文章主要介绍了Yii2.0框架实现带分页的多条件搜索功能,涉及Yii2.0数据库查询及分页显示相关操作技巧,需要的朋友可以参考下

  8. iOS 使用UITextField自定义搜索框 实现用户输入完之后“实时搜索”功能

    这篇文章主要介绍了iOS 使用UITextField自定义搜索框 实现用户输入完之后“实时搜索”功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  9. php 从一个数组中随机的取出若干个不同的数实例

    本文章向码农介绍php从一个不重复的数组中随机的取出若干个不同的元素,难点是防止在取数的时候出现已经取到过的情况(特别是取到最后),需要尽可能的降低碰撞,需要的朋友可以参考下

  10. 用Php实现链结人气统计

    php//功能:传入参数id,在计数文件查找相应的url,增加计数,并返回实际的链接$countfile="count.txt";$lines=file;//将计数文件内容读到数组$lines中for{list=explode;//分解字符串为$id,$url,$countif//查找指定id{$count=1;//增加计数$lines[$i]=$sid."|".$url."|"."$count"."\n";//重新生成计数字符串break;}}//写入计数信息$fp=fopen;forfputs;fcl

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部