【强化学习】手把手教你实现游戏通关AI(2)——Q-Learning
系列文章目录
在本系列文章中笔者将手把手带领大家实现基于强化学习的通关类小游戏,笔者将考虑多种方案,让角色顺利通关。本文将讲述如何使用Q-Learning算法实现AI通关。
完整代码已上传至github:https://github.com/TommyGong08/RL_shoot_game
【强化学习】手把手教你实现游戏通关AI(1)——游戏界面实现
【强化学习】手把手教你实现游戏通关AI(2)——Q-Learning
文章目录
- 系列文章目录
- Q-Learning算法
- 主程序
- Q-Learning代码
- 效果展示
- 总结
- 参考资料
Q-Learning算法
QL的思想是:为每个状态-动作对学习动作函数Q(s,a)
Q(s,a)的值是在状态s中执行动作a之后获得的累计返回值。agent直接从历史经验中学习,不需要完全了解环境模型。当agent做出决策时,只需要比较s状态下每个动作对应的Q(s,a)值,就可以确定s状态下的最优策略,而不考虑状态s的后续状态。
Q_learning算法流程如图所示:
在主函数中我们按照如下步骤进行:
- 随机初始化Q表
- 对于每一个游戏情节:
- 从Q表中选择当前状态对应的action
- 实施这个action(这时候物体已经移动到下一个状态s_了)
- 对于状态s_,观察奖励reward
- 更新Q表
即如下流程图所示:
主程序
# main.py
# -*- coding: UTF-8 -*-"""
游戏的主程序,调用q_learning和env
"""from game import Mygame
from q_learning import QLearning
import pygamedef update():for episode in range(100): # 100次游戏情节# 初始化 state(状态)state = env.reset()print(state)step_count = 0 # 记录走过的步数while True:# 更新可视化环境clock = pygame.time.Clock() # 设置时钟clock.tick(10) # 每秒执行100次# RL 大脑根据 state 挑选 actionaction = RL.choose_action(str(state))# 探索者在环境中实施这个 action, 并得到环境返回的下一个 state, reward 和 done (是否是踩到炸弹或者找到宝藏)state_, reward, done = env.step(action)# print(state_)step_count += 1 # 增加步数# 机器人大脑从这个过渡(transition) (state, action, reward, state_) 中学习RL.learn(str(state), action, reward, str(state_))# 机器人移动到下一个 statestate = state_env.person = stateenv.draw_map()# 如果踩到炸弹或者找到宝藏, 这回合就结束了if done:print("回合 {} 结束. 总步数 : {}\n".format(episode + 1, step_count))break# 结束游戏并关闭窗口print('游戏结束')pygame.quit()if __name__ == "__main__":# 创建环境 env 和 RLpygame.init() # 初始化pygameenv = Mygame()RL = QLearning(actions=list(range(env.n_actions)))# 执行update函数update()print('\nQ table:')print(RL.q_table)
Q-Learning代码
注:为了避免角色陷入局部解,我们在动作选择函数choose_action中采用Epsilon Greedy 贪婪方法。
# q_learning.py
# -*- coding: UTF-8 -*-
"""
Q Learning Algorithm
"""import numpy as np
import pandas as pdclass QLearning:def __init__(self, actions, learning_rate=0.01, discount_factor=0.9, e_greedy=0.1):self.actions = actions # action 列表self.lr = learning_rate # 学习速率self.gamma = discount_factor # 折扣因子self.epsilon = e_greedy # 贪婪度self.q_table = pd.DataFrame(columns=self.actions, dtype=np.float32) # Q 表# 检测 q_table 中有没有这个 state# 如果还没有当前 state, 那我们就插入一组全 0 数据, 作为这个 state 的所有 action 的初始值def check_state_exist(self, state):if state not in self.q_table.index:# 插入一组全 0 数据self.q_table = self.q_table.append(pd.Series([0] * len(self.actions),index=self.q_table.columns,name=state,))# 根据 state 来选择 actiondef choose_action(self, state):self.check_state_exist(state) # 检测此 state 是否在 q_table 中存在# 选行为,用 Epsilon Greedy 贪婪方法if np.random.uniform() < self.epsilon:# 随机选择 actionaction = np.random.choice(self.actions)else: # 选择 Q 值最高的 actionstate_action = self.q_table.loc[state, :]# 同一个 state, 可能会有多个相同的 Q action 值, 所以我们乱序一下state_action = state_action.reindex(np.random.permutation(state_action.index))action = state_action.idxmax() # 获取最大值的索引位置return action# 学习。更新 Q 表中的值def learn(self, s, a, r, s_):self.check_state_exist(s_) # 检测 q_table 中是否存在 s_q_predict = self.q_table.loc[s, a] # 根据 Q 表得到的 估计(predict)值# q_target 是现实值if s_ != 'terminal': # 下个 state 不是 终止符q_target = r + self.gamma * self.q_table.loc[s_, :].max()else:q_target = r # 下个 state 是 终止符# 更新 Q 表中 state-action 的值self.q_table.loc[s, a] += self.lr * (q_target - q_predict)
效果展示
总结
结合上一篇游戏界面制作,我们就介绍完了Q_learning算法制作通关类游戏AI的基本过程。将上一篇中的game.py以及本文中的main.py和q_learning.py相结合,能完整实现整个项目。各位读者可以实操一下,完整代码我已上传至github:https://github.com/TommyGong08/RL_shoot_game。
下文我将带领大家用DQN算法是继续完善我们的小游戏。
参考资料
强化学习学习总结(二)——QLearning算法更新和思维决策
强化学习——从Q-Learning到DQN到底发生了什么?
【强化学习】手把手教你实现游戏通关AI(2)——Q-Learning相关推荐
- 【强化学习】手把手教你实现游戏通关AI(1)——游戏界面实现
系列文章目录 在本系列文章中笔者将手把手带领大家实现基于强化学习的通关类小游戏,笔者将考虑多种方案,让角色顺利通关. 完整代码已上传至github:https://github.com/TommyGo ...
- python_强化学习算法DQN_玩五子棋游戏
本文公开一个基于强化学习算法DQN的五子棋游戏自动下棋算法源码,并对思路进行讲解. 完整代码和预训练模型(Saver文件夹)地址: python_强化学习算法DQN_玩五子棋游戏 一个基于CNN构成的 ...
- 手把手教你编写游戏模拟器 - Chip8篇(1)
转自 http://www.cnblogs.com/YiranXie/p/3439934.html 手把手教你编写游戏模拟器 - Chip8篇(1) 手把手教你编写游戏模拟器 - Chip8篇 翻译整 ...
- 强化学习快餐教程(2) - atari游戏
强化学习快餐教程(2) - atari游戏 不知道看了上节的内容,大家有没有找到让杆不倒的好算法. 现在我们晋阶一下,向世界上第一种大规模的游戏机atari前进. 太空入侵者 可以通过 pip ins ...
- ai可以用c 语言编程,C语言手把手教你实现贪吃蛇AI(上)
本文实例为大家分享了手把手教你实现贪吃蛇AI的具体步骤,供大家参考,具体内容如下 1. 目标 编写一个贪吃蛇AI,也就是自动绕过障碍,去寻找最优路径吃食物. 2. 问题分析 为了达到这一目的,其实很容 ...
- AI:百度飞桨EasyDL多门视频课程,手把手教你如何定制高精度AI模型
AI:百度飞桨EasyDL多门视频课程,手把手教你如何定制高精度AI模型 目录 百度飞桨EasyDL多门视频课程,手把手教你如何定制高精度AI模型 百度飞桨EasyDL多门视频课程,手把手教你如何定制 ...
- 人人都能当“苍天哥” 手把手教你制作游戏视频
作者:小M来源:家用电脑 玩魔兽世界的朋友大多都知道苍天哥这个人物,苍天哥制作了一系列魔兽世界高端职业玩家的游戏视频,其幽默.搞笑的解说风格,广受玩家追捧,一时间成为网络热门人物,目前已经当上了好几个 ...
- CNTK与深度强化学习笔记: Cart Pole游戏示例
CNTK与深度强化学习笔记之二: Cart Pole游戏示例 前言 前面一篇文章,CNTK与深度强化学习笔记之一: 环境搭建和基本概念,非常概要的介绍了CNTK,深度强化学习和DQN的一些基本概念.这 ...
- 自定义view学习-手把手教你制作一个可扩展日历控件
来看看效果图先,手把手教你实现一个简易,但高扩展度的日历控件,可自由扩展成签到,单选,多选日期. 首先我们来分析实现思路.对于上图的效果,很明显是一个6x7的表格. 我们可以两个for循环控制绘制每个 ...
最新文章
- memcache nginx
- RPC框架的可靠性设计
- 什么是事件冒泡?如何阻止事件冒泡?
- linux 写一个包含test的脚本程序,linux的test命令及相关shell脚本详解
- SpiderKeeper的使用
- 前端系统化学习【JS篇】:(一)浏览器简述
- 禁止snmpd写入日志到syslog
- C#.Net 使用 JsonReader/JsonWriter 高性能解析/生成 Json 文档
- 加工中心刻字宏程序_加工中心通用铣螺纹宏程序
- J1939协议实用指南与J1939数据记录方案
- 自抗扰控制器-6线性自抗扰控制器LADRC
- 如何用计算机函数计算房租,Excel商铺租金模板,租金每两年递增5%,具备收租期、租赁起止期、单价函数自动计算功能...
- windows下基于selenium保存网页为图片
- 中国微流体元件行业市场供需与战略研究报告
- 【解码芯片MIPI输出 四合一】XS9922B 国产 4通道模拟复合视频解码芯片 对标TP2815
- C# 利用winrar解压带密码的压缩包
- Python实现猜拳游戏
- linux驱动开发之九鼎板载蜂鸣器驱动测试【转】
- 黑客用恶意软件Dropper攻击了Pale Moon存档服务器
- 戴尔服务器bios进不去系统,戴尔电脑进不了系统和BIOS