强化学习——蛇棋游戏策略迭代实现

  • 1"表格式"Agent
  • 2、对游戏的评估
  • 3、策略迭代
    • 3.1、策略评估
    • 3.2、策略改善

1"表格式"Agent

  在之前的文章的基础之上,本文对搭建的蛇棋游戏采用策略迭代的方法实现。策略迭代时,环境的状态转移概率需要对Agent公开,这样Agent就能利用这些信息做出更好的决策。对于蛇棋来说,如果知道骰子的每一面朝上的概率是均匀的,以及棋盘上的每一个梯子都是可见的,就可以计算出状态转移概率。下面一段简单的代码,根据环境的信息生成问题中所有实体“表格式”数据结构,Agent代码的基本结构如下所示:

class TableAgent(object):def __init__(self, env):self.s_len = env.observation_space.n # |S|self.a_len = env.action_space.n # |A|self.r = [env.reward(s) for s in range(0, self.s_len)] # Rself.pi = np.array([0 for s in range(0, self.s_len)]) # πself.p = env.p # Pself.value_pi = np.zeros((self.s_len)) # Vself.value_q = np.zeros((self.s_len, self.a_len)) # Qself.gamma = 0.8 # γdef play(self, state):return self.pi[state]

2、对游戏的评估

  代码中实现了三种策略:最优策略、全部执行第一个行动的策略和全部执行第二个行动的策略。为了简化代码,直接用一个数组表示Agent要执行的行动。完成了策略的构建,就可以评估策略了,这其实就是让Agent在真实的环境上进行交互,得到回报总和。代码如下:

def eval_game(env, policy):state = env.reset()return_val = 0# 有两种play的方法,一种是用我们定义的智能体去玩,另一种是直接指定每个s的a。while True:if isinstance(policy, TableAgent) or isinstance(policy, ModelFreeAgent):act = policy.play(state)elif isinstance(policy, list):act = policy[state]else:raise Error('Illegal policy')state, reward, terminate, _ = env.step(act) # 不断游戏直至结束return_val += rewardif terminate:breakreturn return_val
def test_easy():policy_opt = [1] * 97 + [0] * 3 # 最优策略policy_0 = [0] * 100 # 全部都投掷第一个骰子(1~3)policy_1 = [1] * 100 # 全部都投掷第二个骰子(1~6)np.random.seed(0)sum_opt = 0sum_0 = 0sum_1 = 0env = SnakeEnv(0, [3, 6])for i in range(10000):sum_opt += eval_game(env, policy_opt)sum_0 += eval_game(env, policy_0)sum_1 += eval_game(env, policy_1)print('opt avg={}'.format(sum_opt / 10000.0))print('0 avg={}'.format(sum_0 / 10000.0))print('1 avg={}'.format(sum_1 / 10000.0))

  在程序中,我们使用每一种策略进行一万局游戏,并显示每一种策略的平均得分,由于棋盘上没有梯子,所以棋局的环境不用发生变化。游戏最终的平均得分如下:

3、策略迭代

3.1、策略评估

策略评估公式:vT(st)=∑aπ(a∣st)∑st+1p(st+1∣st,a)[rt+1+γvT−1(st+1)]{v^T}({s_t}) = \sum\limits_a {\pi (a|{s_t})} \sum\limits_{{s_{t + 1}}} {p({s_{t + 1}}|{s_t},a)[{r_{t + 1}} + \gamma {v^{T - 1}}({s_{t + 1}})]} vT(st​)=a∑​π(a∣st​)st+1​∑​p(st+1​∣st​,a)[rt+1​+γvT−1(st+1​)]
程序如下:

 # 迭代计算V直至收敛def policy_evaluation(self, agent, max_iter=-1):iteration = 0while True:iteration += 1new_value_pi = agent.value_pi.copy()for i in range(1, agent.s_len):value_sas = []ac = agent.pi[i]transition = agent.p[ac, i, :]value_sa = np.dot(transition, agent.r + agent.gamma * agent.value_pi)new_value_pi[i] = value_sadiff = np.sqrt(np.sum(np.power(agent.value_pi - new_value_pi, 2)))if diff < 1e-6:breakelse:agent.value_pi = new_value_piif iteration == max_iter:break

3.2、策略改善

完成上面的部分之后,根据之前的状态值函数计算状态行为值函数:q(st,at)=∑st+1p(st+1∣st,at)[rt+γv(st+1)]q({s_t},{a_t}) = \sum\limits_{{s_{t + 1}}} {p({s_{t + 1}}|{s_t},{a_t})[{r_t} + \gamma v({s_{t + 1}})]}q(st​,at​)=st+1​∑​p(st+1​∣st​,at​)[rt​+γv(st+1​)]完成计算之后,根据同意状态下的行为值函数更新策略:π(s)=arg⁡max⁡aq(s,a)\pi (s) = \mathop {\arg \max }\limits_a q(s,a)π(s)=aargmax​q(s,a)
代码如下:

 # 根据V更新πdef policy_improvement(self, agent):new_policy = np.zeros_like(agent.pi)for i in range(1, agent.s_len):for j in range(0, agent.a_len):agent.value_q[i, j] = np.dot(agent.p[j, i, :], agent.r + agent.gamma * agent.value_pi)max_act = np.argmax(agent.value_q[i, :])new_policy[i] = max_actif np.all(np.equal(new_policy, agent.pi)):return Falseelse:agent.pi = new_policyreturn True# 大框架:进行一定次数的迭代,每次先策略评估,再策略改善

再将上面的程序联合起来,怎个算法的执行如下所示:

 def policy_iteration(self, agent):iteration = 0while True:iteration += 1self.policy_evaluation(agent)ret = self.policy_improvement(agent)if not ret:breakprint('Iter {} rounds converge'.format(iteration))

运行程序:

env = SnakeEnv(0, [3,6])
agent = TableAgent(env)
pi_algo = PolicyIteration()
pi_algo.policy_iteration(agent)
print('return_pi={}'.format(eval_game(env, agent)))
print(agent.pi)

运行结果如下:

  可以看出,每一轮迭代结束,策略都进行了一次更新,当策略没有更新时,迭代结束。

强化学习——蛇棋游戏策略迭代实现相关推荐

  1. 强化学习——蛇棋游戏gym环境搭建

    强化学习--蛇棋游戏gym环境搭建   学习强化学习精要核心算法与Tensorflow实现这本书中,关于蛇棋游戏利用gym搭建.游戏的规则非常简单,详细请参考冯超的书<<强化学习精要核心算 ...

  2. ADPRL - 近似动态规划和强化学习 - Note 8 - 近似策略迭代 (Approximate Policy Iteration)

    Note 8 近似策略迭代 Approximate Policy Iteration 近似策略迭代 Note 8 近似策略迭代 Approximate Policy Iteration 8.1 通用框 ...

  3. 用深度强化学习玩atari游戏_被追捧为“圣杯”的深度强化学习已走进死胡同

    作者 | 朱仲光 编译 | 夕颜出品 | AI科技大本营(ID:rgznai1100) [导读]近年来,深度强化学习成为一个被业界和学术界追捧的热门技术,社区甚至将它视为金光闪闪的通向 AGI 的圣杯 ...

  4. 《强化学习周刊》第7期:强化学习应用之游戏

    No.07 智源社区 强化学习组 强 化 学  习 研究 观点 资源 活动 关于周刊 强化学习作为人工智能领域研究热点之一,它在游戏领域中的应用的研究进展与成果也引发了众多关注.为帮助研究与工程人员了 ...

  5. 强化学习(三)—— 策略学习(Policy-Based)及策略梯度(Policy Gradient)

    强化学习(三)-- 策略学习(Policy-Based)及策略梯度(Policy Gradient) 1. 策略学习 2. 策略梯度 3. 案例 1. 策略学习 Policy Network 通过策略 ...

  6. 用深度强化学习玩atari游戏_(一)深度强化学习·入门从游戏开始

    1.在开始正式进入学习之前,有几个概念需要澄清,这样有利于我们对后续的学习有一个大致的框架感 监督型学习与无监督型学习 深度强化学习的范畴 监督型学习是基于已有的带有分类标签的数据集合,来拟合神经网络 ...

  7. 强化学习(九)- 策略梯度方法 - 梯度上升,黑箱优化,REINFORCE算法及CartPole实例

    策略梯度方法 引言 9.1 策略近似和其优势 9.2 策略梯度定理 9.2.1 梯度上升和黑箱优化 9.2.2 策略梯度定理的证明 9.3 REINFORCE:蒙特卡洛策略梯度 9.3.1 轨迹上的R ...

  8. AAAI 2020使用深度强化学习的MOBA游戏《Towards Playing Full MOBA Games with Deep Reinforcement Learning》打败王者荣耀顶尖选手

    不知道你是否玩过王者荣耀,不知道你是不是经历过被人机疯狂怼在塔下强杀然后嘲讽你的经历?就,真说多了就是泪. 最近,NeurlPS2020会议收录了来自腾讯AI Lab的一篇强化学习的论文<Tow ...

  9. 多智能体强化学习及其在游戏AI上的应用与展望

    近年来,人工智能技术在很多领域都取得了亮眼成就,并逐步从感知智能向决策智能迈进.强化学习是实现决策智能的重要路径,而现实世界中往往存在着多智能体的交互,也催生了多智能体强化学习的发展.这篇文章主要对多 ...

最新文章

  1. 手工模拟实现 Docker 容器网络!
  2. 2009年依然兑现不了的10大IT安全预期
  3. 【EventBus】发布-订阅模式 ( EventBus 组成模块 | 观察者模式 )
  4. MATLAB实战系列(二十八)-用matlab爬取火车票信息
  5. Oracle 审计文件
  6. GItHub--Makedown语法学习(快速入门)
  7. pythoninterp error_Python numpy.interp方法代码示例
  8. 分组框 GroupBox
  9. 宝塔linux_Linux虚拟机上快速搭建宝塔 部署PHP运行环境
  10. 最简单的基于DirectShow的示例:视频播放器图形界面版
  11. kmp算法next计算方法_【数据结构——串】KMP算法——next数组Python的实现方式
  12. Java小项目(一)---超市管理系统
  13. 华展云-让展览更高效 2017第6届中国国防信息化装备与技术博览会会刊(参展商名录)
  14. html中b和strong的区别,i和em的区别
  15. 微信支付之App支付
  16. 使用python爬取图书封面
  17. java 半小时_java获取当前时间加半小时之后的时间
  18. css首行缩进字符间距行高_黑暗代码风格的学院:换行,间距和缩进
  19. 信息化系统工程IPTV或OTT-TV节目系统解决方案
  20. Python实现获取汉字笔画数,根据汉字笔画数量排序

热门文章

  1. 使用cmd命令创建vue2脚手架
  2. 临时尖底锥型过滤器 锥型过滤器
  3. Win11设置鼠标箭头图案的方法教程
  4. 字典树/Trie/前缀树-LeetCode总结:720词典中最长的单词;127. 单词接龙;677. 键值映射;面试题 17.17. 多次搜索;648. 单词替换
  5. Word控件Spire.Doc 【文本】教程(5) ;从 Word 文档中的文本框中提取文本
  6. 电脑配置检测软件下载
  7. 用批处理创建OU和域用户
  8. 织梦后台自带采集无法采集https站解决方法
  9. 关于乱码(MessyCode)问题
  10. 想知道pdf翻译软件哪个好用?pdf翻译如何实现?