Python手写强化学习Q-learning算法玩井字棋

简介: Python手写强化学习Q-learning算法玩井字棋

Q-learning 是强化学习中的一种常见的算法,近年来由于深度学习革命而取得了很大的成功。本教程不会解释什么是深度 Q-learning,但我们将通过 Q-learning 算法来使得代理学习如何玩 tic-tac-toe 游戏。尽管它很简单,但我们将看到它能产生非常好的效果。

要理解本教程,不必有任何关于强化学习的知识,但最好有一定的微积分和线性代数基础。首先,我们将通过一些必要的背景知识来快速了解强化学习,然后我们将介绍 Q-learning 算法,最后我们将介绍如何通过它来使得一个代理学会玩 tic-tac-toe。

强化学习简介

强化学习是指代理在不同状态的环境中,根据某种奖励函数来优化其行为的一门学科。在本教程中,环境是 tic-tac-toe 游戏,它有明确定义的动作,代理必须决定选择哪些动作才能赢得游戏。此外,代理人赢得游戏将获得一定奖励,这鼓励它在游戏中学习更好的策略。

强化学习的一个常见框架是(有限)马尔可夫决策过程(MDP, Markov Decision Process)。它帮助我们定义一组动作和状态,代理基于这些动作和状态进行决策。

MDP 通常包括有:

  • 一组有限的动作 A(在游戏面板上所有可以放置标记的位置)
  • 一组有限的状态 S(游戏面板上的所有可能情形)
  • 一种奖励函数 R(s,a)
  • 转移函数 T(s,a,s')

转换函数给出了在执行动作 a 时从状态 s 移动到 s' 的概率。当我们不确定动作是否总是产生期望结果时,转移函数十分必要。但是需要注意的是,对于 tic-tac-toe 游戏,我们确切地知道每个动作会做什么,所以我们不会使用转移函数。

image.png

在本例中,当前玩家可以执行六个可能的操作

MDP框架帮助我们将问题形式化,这样我们就可以根据当前状态确定哪些操作将在游戏期间使代理的总回报最大化。本教程中奖励函数 R(s,a) 将非常简单:

  • 如果代理在状态 s 执行一个操作 ,最终赢得游戏,那么 R(s,)=1.
  • 如果代理在状态 s 执行一个操作 ,最终输了游戏,那么 R(s,)=-1.
  • 否则,R(s,)=0.

在强化学习中,我们通常找到一个最优策略,代理通过该策略决定选择哪些动作。本教程中我们使用 Q-learning,简单地将策略表示为当代理处于s状态时执行动作 a 使函数 Q(s,a) 最大化:

image.png

Q-learning 中的状态更新

Q(s,a) 即代理在 s 状态下选择动作 a,则在游戏最后给出对应的奖励或惩罚。由于代理希望将其报酬最大化,因此它会选择使 Q 最大化的动作。

image.png

在场景中,首先计算当前玩家X所有动作的Q值,然后选择Q值最大的动作

要计算 Q(s,a),代理必须探索所有可能的状态和动作,同时从奖励函数 R(s,a) 获得反馈。在 tic-tac-toe 游戏中,我们通过让代理与对手进行多场比赛来迭代更新 Q(s,a),用于更新 Q 的方程如下:

image.png

  • 在当前状态 s 下执行动作 a
  • 考虑执行动作后的所有状态,计算其中的最大 Q 值。是执行动作 a 之后的新状态, 是下一个状态中的最佳动作
  • 学习率 α 决定我们覆盖旧值的程度,本例中将使用 α=0.1
  • 折现因子 γ 决定了在当前时间步 t 中,未来的奖励应加权多少。通常选择 γ=0.9

Q-learning 算法实现

为了得到一个经过充分训练的代理,我们需要获得 Q(s,a) 的值,这将通过让两个代理互相比赛来完成。首先,引入一个概率 ε,即每个代理选择一个随机动作,否则,它将根据 Q(s,a) 选择最佳动作。这样,我们就保证了学习的平衡,使代理有时探索新的行为,而其他时候则利用代理已经学习到的信息来执行动作。

训练阶段可以通过以下伪代码进行描述:

Initialise: Q(s,a) = 0, starting state s,
             starting player P, iterations N
for t = 0 : N
    With probability ε : P picks random action a
    Else, pick action a that maximise Q(s,a)
    Observe new state ŝ and reward R(s,a)
    If current player is our agent,
    update Q(s,a) = (1-α)Q(s,a) + α[R(s,a) + γ*max(Q(ŝ,â))]
    s = ŝ
    Switch turn, P = the other player

值得注意的是,迭代次数 N 必须相对较大,本例中进行了大约 500000 次迭代。此外,Q(s,a) 可以通过 Python dict 的数据格式进行存储;如果我们将 (s,a) 表示为整数,则可以通过二维数组的数据格式进行存储。最后,可以随时间改变概率 ε,以强调在早期迭代中更多的随机探索,从而加快学习速度。

在用上述算法训练代理之后,可以保存 Q(s,a) 并在想要进行比赛时加载它。然后,代理只需遵循最优策略,选择使 Q(s,a) 最大化的动作来赢得比赛。虽然由于 tic-tac-toe 游戏并不复杂,代理并没有获得高级智能,但是尝试这个方法可以学习如何实现 Q-learning 并了解它是如何工作的。

结语

本文首先介绍了马尔可夫决策过程以及如何在强化学习中应用它。然后使用状态、行动、奖励函数来对 tic-tac-toe 游戏进行建模。除此之外,我们还定义了函数 Q(s,a),该函数通过在状态 s 中选择动作 a 来量化预期的奖励,并通过重复玩游戏来计算 Q(s,a)。

目录
相关文章
|
12天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
眼疾识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了4种常见的眼疾图像数据集(白内障、糖尿病性视网膜病变、青光眼和正常眼睛) 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,实现用户上传一张眼疾图片识别其名称。
62 4
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
|
22天前
|
存储 缓存 监控
局域网屏幕监控系统中的Python数据结构与算法实现
局域网屏幕监控系统用于实时捕获和监控局域网内多台设备的屏幕内容。本文介绍了一种基于Python双端队列(Deque)实现的滑动窗口数据缓存机制,以处理连续的屏幕帧数据流。通过固定长度的窗口,高效增删数据,确保低延迟显示和存储。该算法适用于数据压缩、异常检测等场景,保证系统在高负载下稳定运行。 本文转载自:https://www.vipshare.com
117 66
|
3天前
|
存储 监控 算法
员工电脑监控屏幕场景下 Python 哈希表算法的探索
在数字化办公时代,员工电脑监控屏幕是保障信息安全和提升效率的重要手段。本文探讨哈希表算法在该场景中的应用,通过Python代码例程展示如何使用哈希表存储和查询员工操作记录,并结合数据库实现数据持久化,助力企业打造高效、安全的办公环境。哈希表在快速检索员工信息、优化系统性能方面发挥关键作用,为企业管理提供有力支持。
33 20
|
15天前
|
机器学习/深度学习 算法 PyTorch
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
软演员-评论家算法(Soft Actor-Critic, SAC)是深度强化学习领域的重要进展,基于最大熵框架优化策略,在探索与利用之间实现动态平衡。SAC通过双Q网络设计和自适应温度参数,提升了训练稳定性和样本效率。本文详细解析了SAC的数学原理、网络架构及PyTorch实现,涵盖演员网络的动作采样与对数概率计算、评论家网络的Q值估计及其损失函数,并介绍了完整的SAC智能体实现流程。SAC在连续动作空间中表现出色,具有高样本效率和稳定的训练过程,适合实际应用场景。
66 7
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
|
12天前
|
存储 算法 Serverless
剖析文件共享工具背后的Python哈希表算法奥秘
在数字化时代,文件共享工具不可或缺。哈希表算法通过将文件名或哈希值映射到存储位置,实现快速检索与高效管理。Python中的哈希表可用于创建简易文件索引,支持快速插入和查找文件路径。哈希表不仅提升了文件定位速度,还优化了存储管理和多节点数据一致性,确保文件共享工具高效运行,满足多用户并发需求,推动文件共享领域向更高效、便捷的方向发展。
|
27天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
57 20
|
19天前
|
算法 网络协议 Python
探秘Win11共享文件夹之Python网络通信算法实现
本文探讨了Win11共享文件夹背后的网络通信算法,重点介绍基于TCP的文件传输机制,并提供Python代码示例。Win11共享文件夹利用SMB协议实现局域网内的文件共享,通过TCP协议确保文件传输的完整性和可靠性。服务器端监听客户端连接请求,接收文件请求并分块发送文件内容;客户端则连接服务器、接收数据并保存为本地文件。文中通过Python代码详细展示了这一过程,帮助读者理解并优化文件共享系统。
|
1月前
|
机器学习/深度学习 算法
强化学习之父Richard Sutton给出一个简单思路,大幅增强所有RL算法
Richard Sutton领导的团队提出了一种称为“奖励中心化”的方法,通过从观察到的奖励中减去其经验平均值,使奖励更加集中,显著提高了强化学习算法的性能。该方法在解决持续性问题时表现出色,尤其是在折扣因子接近1的情况下。论文地址:https://arxiv.org/pdf/2405.09999
72 15
|
24天前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
50 5
|
24天前
|
存储 缓存 算法
探索企业文件管理软件:Python中的哈希表算法应用
企业文件管理软件依赖哈希表实现高效的数据管理和安全保障。哈希表通过键值映射,提供平均O(1)时间复杂度的快速访问,适用于海量文件处理。在Python中,字典类型基于哈希表实现,可用于管理文件元数据、缓存机制、版本控制及快速搜索等功能,极大提升工作效率和数据安全性。
61 0