《强化学习课程报告》
1. 实验概述
1.1 实验目的
本实验旨在通过自学和动手实践,深入理解和掌握Sarsa算法和Q-learning算法的基本原理和实现方法。通过对比这两种算法,理解它们在策略评估上的不同之处,并掌握在不同情境下选择合适算法的技巧。
1.2 实验内容
- 运行代码并保存实验结果截图
- 对比分析算法的运行时间和结果
- 分析各个算法的优势和缺点
- 设计一个6x6网格世界案例并进行实验
2. 算法介绍
2.1 Sarsa算法
Sarsa算法(State-Action-Reward-State-Action)是一种基于时间差分(Temporal-Difference, TD)学习的强化学习算法。它是一种on-policy算法,这意味着它在更新Q值时使用的是当前策略生成的动作。
基本原理
Sarsa算法通过与环境交互,逐步更新状态-动作值函数(Q值),从而找到最优策略。它的核心思想是通过估计当前状态-动作对的价值来更新Q值,并使用当前策略选择的动作来进行更新。
流程
- 初始化:
- 初始化Q表,对于每个状态-动作对,设置初始Q值(通常为0)。
- 选择动作:
- 在每个状态下,根据当前策略选择一个动作。常用的策略是ε-greedy策略,即以ε的概率随机选择一个动作,以1-ε的概率选择当前Q值最大的动作。
- 执行动作:
- 执行选择的动作,观察环境反馈的奖励和下一个状态。
- 选择下一个动作:
- 根据当前策略,在新的状态下选择下一个动作。
- 更新Q值:
- 使用以下公式更新Q值: Q ( s , a ) ← Q ( s , a ) + α [ r + γ Q ( s ′ , a ′ ) − Q ( s , a ) ] Q(s, a) \leftarrow Q(s, a) + \alpha \left[ r + \gamma Q(s', a') - Q(s, a) \right] Q(s,a)←Q(s,a)+α[r+γQ(s′,a′)−Q(s,a)] 其中, s s s 和 a a a 分别是当前状态和动作, r r r 是奖励, s ′ s' s′ 和 a ′ a' a′ 分别是下一个状态和动作, α \alpha α 是学习率, γ \gamma γ 是折扣因子。
- 迭代:
- 重复步骤2到5,直到达到终止条件。
2.2 Q-learning算法
Q-learning算法是一种基于时间差分(Temporal-Difference, TD)学习的强化学习算法。它是一种off-policy算法,这意味着它在更新Q值时使用的是通过最大化未来奖励所选择的动作,而不是当前策略生成的动作。
基本原理
Q-learning算法通过与环境交互,逐步更新状态-动作值函数(Q值),从而找到最优策略。它的核心思想是通过估计当前状态-动作对的价值来更新Q值,并使用未来最优动作的价值来进行更新。
流程
- 初始化:
- 初始化Q表,对于每个状态-动作对,设置初始Q值(通常为0)。
- 选择动作:
- 在每个状态下,根据当前策略选择一个动作。常用的策略是 ε-greedy策略,即以 ε ε ε 的概率随机选择一个动作,以 1 − ε 1-ε 1−ε 的概率选择当前Q值最大的动作。
- 执行动作:
- 执行选择的动作,观察环境反馈的奖励和下一个状态。
- 更新Q值:
- 使用以下公式更新Q值: Q ( s , a ) ← Q ( s , a ) + α [ r + γ max a ′ Q ( s ′ , a ′ ) − Q ( s , a ) ] Q(s, a) \leftarrow Q(s, a) + \alpha \left[ r + \gamma \max_{a'} Q(s', a') - Q(s, a) \right] Q(s,a)←Q(s,a)+α[r+γmaxa′Q(s′,a′)−Q(s,a)] 其中, s s s 和 a a a 分别是当前状态和动作, r r r 是奖励, s ′ s' s′ 是下一个状态, α \alpha α 是学习率, γ \gamma γ 是折扣因子。 max a ′ Q ( s ′ , a ′ ) \max_{a'} Q(s', a') maxa′Q(s′,a′) 是下一个状态中所有可能动作的最大 Q Q Q 。
- 迭代:
- 重复步骤2到4,直到达到终止条件。
3. 实验步骤
3.1 运行代码并保存实验结果
code3-5 基于值迭代的起始探索每次访问蒙特卡罗强化学习算法
- 最优策略
- 代码通过基于值迭代的起始探索每次访问蒙特卡罗强化学习算法,得到了21点问题的最优策略。最优策略保存在
opt_policy
变量中,表示在每个状态下智能体应该采取的最佳动作。
- HIT(继续叫牌):在某些状态下,智能体选择继续叫牌,以期望获得更高的总奖励。
- STICK(停牌):在其他状态下,智能体选择停牌,以避免超出21点。
- 代码通过基于值迭代的起始探索每次访问蒙特卡罗强化学习算法,得到了21点问题的最优策略。最优策略保存在
- 最优动作值函数
- 最优动作值函数保存在
opt_Q
变量中,表示在每个状态下采取不同动作的预期累积奖励。通过这些Q值,智能体可以评估不同动作的好坏,并选择最优动作。
- 最优动作值函数保存在
- 策略图像分析
- 代码通过
draw
函数绘制了两张图像,分别表示在有可用A和无可用A情况下的最优策略。
- Usable Ace(有可用A):
- 蓝色圆点(HIT):表示在该状态下智能体选择继续叫牌。
- 红色叉号(STICK):表示在该状态下智能体选择停牌。
- 图像横轴为庄家的牌面点数,纵轴为玩家的牌面点数。
- No Usable Ace(无可用A):
- 蓝色圆点(HIT):表示在该状态下智能体选择继续叫牌。
- 红色叉号(STICK):表示在该状态下智能体选择停牌。
- 图像横轴为庄家的牌面点数,纵轴为玩家的牌面点数。
- 代码通过
- 策略分析
- 有可用A的策略:
- 在有可用A的情况下,玩家的策略会更加激进,因为A可以灵活地作为1点或11点使用。
- 当玩家的总点数较低(小于18)时,智能体更倾向于继续叫牌(HIT),以期望获得更高的总点数。
- 当玩家的总点数较高(大于等于18)时,智能体更倾向于停牌(STICK),以避免超出21点。
- 无可用A的策略:
- 在无可用A的情况下,玩家的策略会更加保守,因为没有A可以灵活调整点数。
- 当玩家的总点数较低(小于18)时,智能体仍然会选择继续叫牌(HIT),但在某些情况下可能会更早选择停牌(STICK)。
- 当玩家的总点数较高(大于等于18)时,智能体几乎总是选择停牌(STICK)。
code3-6 基于值迭代的贪婪策略每次访问蒙特卡罗强化学习算法
epsilon-贪婪策略的影响
epsilon-贪婪策略在每个状态下以ε的概率选择一个随机动作,以
1
−
ε
1-ε
1−ε的概率选择当前Q值最大的动作。这样可以在探索新路径和利用已知最佳路径之间取得平衡。
- 探索:epsilon-贪婪策略允许智能体在一定程度上探索新的动作,即使当前动作不是最优的。这有助于避免陷入局部最优解。
- 利用:在大多数情况下,智能体仍然会选择当前Q值最大的动作,从而利用已知的最佳策略。
code3-8 异策略蒙特卡罗强化学习算法
- 异策略蒙特卡洛算法的影响 异策略蒙特卡洛算法通过使用行为策略(
b
p
o
l
i
c
y
b_{policy}
bpolicy)生成样本,并使用目标策略(
t
p
o
l
i
c
y
t_{policy}
tpolicy)进行策略评估和改进。行为策略在每个状态下以均等概率选择要牌或停牌(0.5, 0.5),而目标策略则根据Q值选择最优动作。
- 行为策略:行为策略的随机性允许智能体探索更多的状态-动作对,从而获得更多的经验。
- 目标策略:目标策略根据Q值选择最优动作,从而逐步改进策略,找到最优解。
- 重要性采样权重的作用 重要性采样权重(W)用于调整行为策略和目标策略之间的差异。通过计算每个状态-动作对的权重,算法能够更准确地评估目标策略的价值。
- 累积折扣奖励(G):累积折扣奖励表示从当前状态开始的总奖励。
- 重要性权重(W):重要性权重用于调整行为策略和目标策略之间的差异,确保策略评估的准确性。
code4-3 Sarsa算法求解WindyWorld
- 最优策略
代码通过Sarsa算法在WindyWorld环境中运行,得到了最优策略。最优策略保存在P_table
变量中,表示在每个状态下智能体应该采取的最佳动作。
- 方向指示:使用箭头符号(↑、→、↓、←)表示每个状态下的最佳动作。
- 策略表:通过
plot_policy_table
函数可视化策略表,展示智能体在不同状态下的决策。
- 最优动作值函数
最优动作值函数保存在Q
变量中,表示在每个状态下采取不同动作的预期累积奖励。通过这些Q值,智能体可以评估不同动作的好坏,并选择最优动作。
- Q值表:通过
plot_q_values
函数可视化Q值表,展示每个动作在不同状态下的Q值。
- 策略图像分析 代码通过
plot_policy_table
函数绘制了策略表,显示每个状态下的最佳动作。
- 策略表:
- 每个格子中的箭头表示智能体在该状态下的最佳动作。
- 图像横轴和纵轴分别表示环境的宽度和高度。
-
Q值图像分析
代码通过plot_q_values
函数绘制了Q值图,显示每个动作在不同状态下的Q值。- Q值图:
- 每个子图表示一个动作(↑、→、↓、←)的Q值。
- 图像横轴和纵轴分别表示环境的宽度和高度。
- 颜色表示Q值的大小,颜色越深表示Q值越大。
-
策略分析
- 策略表:
- 策略表展示了智能体在不同状态下的最佳动作。
- 通过观察策略表,可以看出智能体在不同状态下的决策依据。 - 在某些状态下,智能体可能会选择向上(↑)、向右(→)、向下(↓)或向左(←)移动,以期望获得更高的总奖励。
- Q值图:
- Q值图展示了每个动作在不同状态下的Q值。
- 通过观察Q值图,可以看出智能体在不同状态下对不同动作的评估。
- Q值较大的动作表示智能体在该状态下认为该动作能够获得更高的累积奖励。
- Sarsa算法
Sarsa算法通过与环境交互,逐步更新状态-动作值函数(Q值),从而找到最优策略。其核心思想是通过估计当前状态-动作对的价值来更新Q值,并使用当前策略选择的动作来进行更新。- epsilon-贪婪策略:在每个状态下以ε的概率选择随机动作,以1-ε的概率选择当前Q值最大的动作。这有助于在探索新路径和利用已知最佳路径之间取得平衡。
- 策略评估:通过不断迭代,Sarsa算法能够逐步改进策略,使得智能体在环境中获得最大化的累积奖励。
code4-4 Q-learning算法求解WindyWorld
-
Q-learning算法
Q-learning算法是一种基于时间差分(Temporal-Difference, TD)学习的强化学习算法。它是一种off-policy算法,这意味着它在更新Q值时使用的是通过最大化未来奖励所选择的动作,而不是当前策略生成的动作。 -
运行结果总结
- 策略表:策略表展示了智能体在不同状态下的最佳动作。通过观察策略表,可以看出智能体在不同状态下的决策依据。
- Q值图:Q值图展示了每个动作在不同状态下的Q值。通过观察Q值图,可以看出智能体在不同状态下对不同动作的评估。
- 收敛性:Q-learning算法通过不断迭代和更新Q值,能够逐步找到最优策略。在足够多的迭代后,Q值和策略趋于稳定。
3.2 对比分析
3.2.1 第三章算法对比
基于值迭代的起始探索每次访问蒙特卡罗强化学习算法
通过基于值迭代的起始探索每次访问蒙特卡罗强化学习算法,智能体能够学习到21点问题的最优策略。在有可用A和无可用A的情况下,智能体的策略有所不同。通过对策略图像的分析,可以看出智能体在不同状态下的决策依据。 这种基于蒙特卡罗方法的强化学习算法,通过不断采样和更新Q值,能够有效地找到复杂环境中的最优策略。
基于值迭代的贪婪策略每次访问蒙特卡罗强化学习算法
epsilon-贪婪策略通过在探索和利用之间取得平衡,帮助智能体找到更优的策略。通过不断采样和更新Q值,智能体能够有效地适应复杂环境中的变化,并找到最优策略。
异策略蒙特卡罗强化学习算法
异策略蒙特卡洛算法通过使用行为策略生成样本,并使用目标策略进行策略评估和改进,能够有效地找到复杂环境中的最优策略。重要性采样权重确保了策略评估的准确性,从而帮助智能体找到最优解。
综合对比分析
- 运行时间对比
- 基于值迭代的起始探索每次访问蒙特卡罗强化学习算法:
- 由于起始探索策略需要从环境中随机选择初始状态,这可能导致较长的收敛时间。
- 运行时间较长,因为每次都需要从头开始探索,直到达到终止状态。
- 基于值迭代的epsilon-贪婪策略每次访问蒙特卡罗强化学习算法:
- 由于epsilon-贪婪策略在每个状态下以一定概率选择随机动作,这增加了探索的时间。
- 运行时间适中,因为在大多数情况下,智能体会选择当前Q值最大的动作,从而减少了探索的时间。
- 异策略蒙特卡罗强化学习算法:
- 行为策略在每个状态下以均等概率选择要牌或停牌,这增加了探索的时间。
- 运行时间较长,因为需要计算重要性采样权重,并使用行为策略生成样本,这增加了计算复杂度。
- 结果对比
- 基于值迭代的起始探索每次访问蒙特卡罗强化学习算法:
- 由于起始探索策略的随机性,结果可能不稳定,但在足够多的迭代后能够找到较优策略。
- 最优策略在有可用A和无可用A情况下有所不同,智能体在不同状态下的决策依据较为合理。
- 基于值迭代的epsilon-贪婪策略每次访问蒙特卡罗强化学习算法:
- epsilon-贪婪策略在探索和利用之间取得了较好的平衡,结果较为稳定。
- 最优策略在有可用A和无可用A情况下有所不同,智能体在不同状态下的决策依据较为合理。
- 异策略蒙特卡罗强化学习算法:
- 异策略蒙特卡罗算法通过使用行为策略生成样本,并使用目标策略进行策略评估和改进,结果较为准确。
- 最优策略在有可用A和无可用A情况下有所不同,智能体在不同状态下的决策依据较为合理。
- 各个算法之间的优势和缺点
- 基于值迭代的起始探索每次访问蒙特卡罗强化学习算法:
- 优势:能够从环境中随机选择初始状态,增加了探索的多样性。
- 缺点:收敛时间较长,结果可能不稳定。
- 基于值迭代的epsilon-贪婪策略每次访问蒙特卡罗强化学习算法:
- 优势:在探索和利用之间取得了较好的平衡,结果较为稳定。
- 缺点:在某些情况下,可能会陷入局部最优解。
- 异策略蒙特卡罗强化学习算法:
- 优势:通过使用行为策略生成样本,并使用目标策略进行策略评估和改进,结果较为准确。
- 缺点:计算复杂度较高,运行时间较长。
- 综合分析性能
- 基于值迭代的起始探索每次访问蒙特卡罗强化学习算法:
- 起始探索策略能够从环境中随机选择初始状态,增加了探索的多样性,从而找到较优策略。
- 基于值迭代的epsilon-贪婪策略每次访问蒙特卡罗强化学习算法:
- epsilon-贪婪策略在探索和利用之间取得了较好的平衡,能够有效地找到最优策略。
- 异策略蒙特卡罗强化学习算法:
- 异策略蒙特卡罗算法通过使用行为策略生成样本,并使用目标策略进行策略评估和改进,能够准确地评估目标策略的价值,从而找到最优策略。
3.2.2 第四章算法对比
- 运行时间对比
-
Sarsa算法:
-
运行时间:Sarsa算法的运行时间通常较长,因为它是一个on-policy算法,需要在每一步都根据当前策略选择动作并进行更新。由于每个状态-动作对的更新都依赖于当前策略,导致收敛速度较慢。
-
时间复杂度:Sarsa算法的时间复杂度主要受制于每次迭代中状态-动作对的更新次数。
-
Q-learning算法:
-
运行时间:Q-learning算法的运行时间相对较短,因为它是一个off-policy算法,可以在每一步选择最大化未来奖励的动作进行更新。这样可以更快地找到最优策略。
-
时间复杂度:Q-learning算法的时间复杂度主要受制于每次迭代中状态-动作对的更新次数,但由于它使用的是最大化未来奖励的动作,收敛速度较快。
- 结果对比
- Sarsa算法:
- 结果:Sarsa算法在WindyWorld环境中能够找到较优的策略,但由于它是on-policy算法,结果可能会受到当前策略的影响,导致在某些情况下可能会陷入局部最优解。
- 策略稳定性:Sarsa算法的策略稳定性较好,因为它在每一步都根据当前策略进行更新,能够逐步改进策略。
- Q-learning算法:
- 结果:Q-learning算法在WindyWorld环境中能够更快地找到最优策略,因为它是off-policy算法,可以在每一步选择最大化未来奖励的动作进行更新。
- 策略稳定性:Q-learning算法的策略稳定性较好,因为它在每一步都选择最大化未来奖励的动作,能够更快地收敛到最优策略。
- 各个算法之间的优势和缺点
- Sarsa算法:
- 优势:
- 策略稳定性较好,因为它在每一步都根据当前策略进行更新,能够逐步改进策略。
- 更适合处理需要严格遵循当前策略的环境。
- 缺点:
- 运行时间较长,收敛速度较慢,因为每个状态-动作对的更新都依赖于当前策略。
- 结果可能会受到当前策略的影响,导致在某些情况下可能会陷入局部最优解。
- Q-learning算法:
- 优势:
- 运行时间较短,收敛速度较快,因为它可以在每一步选择最大化未来奖励的动作进行更新。
- 更适合处理需要快速找到最优策略的环境。
- 缺点:
- 策略稳定性可能较差,因为它在每一步都选择最大化未来奖励的动作,可能会导致策略的频繁变化。
- 在某些情况下,可能会因为过度利用而忽略了探索,导致策略不够全面。
4. 案例设计
4.1 状态空间、动作空间和策略设计
4.1.1 状态空间
在这个6x6网格世界中,状态空间可以表示为一个二维坐标系中的所有位置。每个状态可以表示为一个坐标对 ( x , y ) (x, y) (x,y) ,其中 x x x 和 y y y 的取值范围都是0到5。状态空间包括所有可能的坐标对,如 ( 0 , 0 ) , ( 0 , 1 ) , . . . , ( 5 , 5 ) (0, 0), (0, 1), ..., (5, 5) (0,0),(0,1),...,(5,5) 。
4.1.2 动作空间
动作空间包括智能体可以选择的四个方向的移动:
- 上 (Up)
- 下 (Down)
- 左 (Left)
- 右 (Right)
这些动作分别对应于向上、向下、向左和向右移动一个格子。
4.1.3 策略设计
智能体可以采用ε-greedy策略来选择行动方向。在这种策略中,智能体以ε的概率随机选择一个动作,以1-ε的概率选择当前Q值最大的动作。这样可以在探索新路径和利用已知最佳路径之间取得平衡。
4.2 分析问题难点和算法选择
4.2.1 问题难点
- 障碍物:在网格世界中,有几个障碍物位于(1, 2), (3, 3), (3, 5), (5, 4)。智能体不能经过障碍物,当尝试进入障碍物时,返回原位置并获得-15的奖励。
- 负奖励:每走一步都有-1的惩罚,这使得智能体需要尽量减少步数。
- 终点奖励:到达目标位置(5, 5)获得+20的奖励,这使得智能体需要找到最短路径。
- 中途奖励:在(2, 4)位置设置了一个+5的中途奖励,这会影响智能体的路径选择。
4.2.2 算法选择
Q-learning算法适合这个案例,因为它是一个off-policy算法,能够更好地处理探索和利用之间的平衡。Sarsa算法是一个on-policy算法,可能在处理负奖励和障碍物时表现不如Q-learning。Q-learning算法通过选择最大化未来奖励的动作进行更新,可以更快地找到最优策略。
4.3 奖励函数设计和其对策略的影响
4.3.1 奖励函数设计
- 每走一步有-1的惩罚。
- 到达终点(5, 5)获得+20的奖励。
- 尝试进入障碍物返回原位置并获得-15的奖励。 - 到达中途奖励位置(2, 4)获得+5的奖励。
4.3.2 奖励函数对策略的影响
奖励函数的设计会影响智能体的策略选择。负奖励会促使智能体尽量减少步数,终点奖励会引导智能体找到目标位置,中途奖励会影响智能体的路径选择,障碍物的惩罚会让智能体避免进入障碍物。
- 负奖励:智能体会尝试减少步数,以避免累积过多的负奖励。
- 终点奖励:智能体会优先选择能够到达终点的路径,以获得高额的正奖励。
- 中途奖励:智能体可能会选择经过中途奖励位置的路径,以获得额外的奖励。
- 障碍物:智能体会避免进入障碍物,以避免高额的负奖励。 通过这些奖励函数的设计,智能体能够在复杂的环境中找到最优路径,最大化其得到的总奖励。
5. 实验结果
5.1 运行结果截图
- 最优策略 代码通过Q-learning算法在6x6网格世界中运行,得到了最优策略。最优策略保存在
Q
变量中,表示在每个状态下智能体应该采取的最佳动作。
- 方向指示:使用箭头符号(↑、→、↓、←)表示每个状态下的最佳动作。
- 策略表:通过
plot_policy_table
函数可视化策略表,展示智能体在不同状态下的决策。
- 最优动作值函数 最优动作值函数保存在
Q
变量中,表示在每个状态下采取不同动作的预期累积奖励。通过这些Q值,智能体可以评估不同动作的好坏,并选择最优动作。
- Q值表:通过
plot_q_values
函数可视化Q值表,展示每个动作在不同状态下的Q值。
- 策略图像分析 代码通过
plot_policy_table
函数绘制了策略表,显示每个状态下的最佳动作。
- 策略表:
- 每个格子中的箭头表示智能体在该状态下的最佳动作。
- 图像横轴和纵轴分别表示环境的宽度和高度。
- Q值图像分析 代码通过
plot_q_values
函数绘制了Q值图,显示每个动作在不同状态下的Q值。
- Q值图:
- 每个子图表示一个动作(↑、→、↓、←)的Q值。
- 图像横轴和纵轴分别表示环境的宽度和高度。 - 颜色表示Q值的大小,颜色越深表示Q值越大。
- 策略分析
- 策略表:
- 策略表展示了智能体在不同状态下的最佳动作。
- 通过观察策略表,可以看出智能体在不同状态下的决策依据。
- 在某些状态下,智能体可能会选择向上(↑)、向右(→)、向下(↓)或向左(←)移动,以期望获得更高的总奖励。
- Q值图:
- Q值图展示了每个动作在不同状态下的Q值。
- 通过观察Q值图,可以看出智能体在不同状态下对不同动作的评估。
- Q值较大的动作表示智能体在该状态下认为该动作能够获得更高的累积奖励。
- Q-learning算法的影响 Q-learning算法是一种基于时间差分(Temporal-Difference, TD)学习的强化学习算法。它是一种off-policy算法,这意味着它在更新Q值时使用的是通过最大化未来奖励所选择的动作,而不是当前策略生成的动作。
- epsilon-贪婪策略:在每个状态下以ε的概率选择随机动作,以1-ε的概率选择当前Q值最大的动作。这有助于在探索新路径和利用已知最佳路径之间取得平衡。
- 策略评估:通过不断迭代,Q-learning算法能够逐步改进策略,使得智能体在环境中获得最大化的累积奖励。
- 运行结果总结
- 策略表:策略表展示了智能体在不同状态下的最佳动作。通过观察策略表,可以看出智能体在不同状态下的决策依据。
- Q值图:Q值图展示了每个动作在不同状态下的Q值。通过观察Q值图,可以看出智能体在不同状态下对不同动作的评估。
- 收敛性:Q-learning算法通过不断迭代和更新Q值,能够逐步找到最优策略。在足够多的迭代后,Q值和策略趋于稳定。
5.2 结果分析
策略表分析
- 策略表分析 从策略表中可以看到,智能体在6x6网格世界中的每个状态下的最佳动作方向。箭头表示智能体在当前状态下选择的最佳动作方向。
- 初始状态 (0, 0):
- 智能体从左上角 (0, 0) 出发,选择向下移动。
- 路径选择:
- 智能体在大多数情况下选择向下或向右移动,尽量避开障碍物。
- 在某些状态下,智能体选择向左或向上移动,以避开障碍物或达到中途奖励位置。
- 障碍物影响:
- 在 (1, 2), (3, 3), (3, 5), (5, 4) 位置有障碍物,智能体在这些位置附近的策略选择明显受到障碍物的影响,避免进入障碍物。
- 终点位置 (5, 5):
- 智能体的目标是到达右下角 (5, 5) 位置,策略表显示智能体在接近终点时选择向上移动,以避开障碍物 (5, 4)。
-
策略表中的具体路径
-
策略表的合理性
- 避开障碍物:
- 策略表显示智能体在接近障碍物时,会选择避开障碍物的路径。例如,在 (1, 2) 位置附近,智能体选择向右移动而不是向下移动。
- 中途奖励:
- 在 (2, 4) 位置设置了一个中途奖励,智能体在接近该位置时,会选择经过该位置以获得额外的奖励。
- 终点奖励:
- 智能体的目标是到达终点 (5, 5),策略表显示智能体在接近终点时,会选择最短路径到达终点。
Q值图像分析
- 图像展示了智能体在6x6网格世界中,每个状态下的四个动作(上、下、左、右)的Q值。颜色表示Q值的大小,颜色越深表示Q值越大。
- Action: ↑(向上):
- 在靠近终点(5, 5)和中途奖励位置(2, 4)附近,Q值较高,表示这些位置向上移动的策略较优。
- 在障碍物附近((1, 2), (3, 3), (3, 5), (5, 4)),Q值较低,表示这些位置向上移动的策略较差。
- Action: →(向右):
- 在靠近终点(5, 5)和中途奖励位置(2, 4)附近,Q值较高,表示这些位置向右移动的策略较优。
- 在障碍物附近((1, 2), (3, 3), (3, 5), (5, 4)),Q值较低,表示这些位置向右移动的策略较差。
- Action: ↓(向下):
- 在靠近终点(5, 5)和中途奖励位置(2, 4)附近,Q值较高,表示这些位置向下移动的策略较优。
- 在障碍物附近((1, 2), (3, 3), (3, 5), (5, 4)),Q值较低,表示这些位置向下移动的策略较差。
- Action: ←(向左):
- 在靠近终点(5, 5)和中途奖励位置(2, 4)附近,Q值较高,表示这些位置向左移动的策略较优。
- 在障碍物附近((1, 2), (3, 3), (3, 5), (5, 4)),Q值较低,表示这些位置向左移动的策略较差。
- Q值图像的具体分析
- 终点和中途奖励位置:
- 终点位置(5, 5)和中途奖励位置(2, 4)附近的Q值较高,表示智能体在这些位置采取相应动作(上、下、左、右)能够获得较高的累积奖励。
- 这些位置的高Q值表明智能体在接近终点和中途奖励位置时,选择相应的动作是最优策略。
- 障碍物影响:
- 障碍物位置(1, 2), (3, 3), (3, 5), (5, 4)附近的Q值较低,表示智能体在这些位置采取相应动作(上、下、左、右)会受到负奖励的影响。
- 这些位置的低Q值表明智能体在接近障碍物时,会选择避开这些位置的动作,以避免高额的负奖励。
- 路径选择:
- 智能体在大多数情况下选择向下或向右移动,尽量避开障碍物。
- 在某些状态下,智能体选择向左或向上移动,以避开障碍物或达到中途奖励位置。
附录
import numpy as np
import random
import matplotlib.pyplot as plt
# 定义网格世界的大小
grid_size = 6
# 定义状态空间和动作空间
states = [(x, y) for x in range(grid_size) for y in range(grid_size)]
actions = ['up', 'down', 'left', 'right']
# 定义奖励函数
def get_reward(state, action):
x, y = state
if action == 'up':
new_state = (x, y - 1)
elif action == 'down':
new_state = (x, y + 1)
elif action == 'left':
new_state = (x - 1, y)
elif action == 'right':
new_state = (x + 1, y)
# 检查是否进入障碍物
if new_state in [(1, 2), (3, 3), (3, 5), (5, 4)]:
return -15, state
# 检查是否超出边界
if new_state[0] < 0 or new_state[0] >= grid_size or new_state[1] < 0 or new_state[1] >= grid_size:
return -1, state
# 检查是否到达终点
if new_state == (5, 5):
return 20, new_state
# 检查是否到达中途奖励位置
if new_state == (2, 4):
return 5, new_state
return -1, new_state
# 初始化Q表
Q = {}
for state in states:
Q[state] = {}
for action in actions:
Q[state][action] = 0
# 定义参数
alpha = 0.1
gamma = 0.9
epsilon = 0.1
episodes = 1000
# Q-learning算法
for episode in range(episodes):
state = (0, 0)
while state != (5, 5):
if random.uniform(0, 1) < epsilon:
action = random.choice(actions)
else:
action = max(Q[state], key=Q[state].get)
reward, next_state = get_reward(state, action)
Q[state][action] = Q[state][action] + alpha * (reward + gamma * max(Q[next_state].values()) - Q[state][action])
state = next_state
# 打印Q表
for state in Q:
print(state, Q[state])
# 可视化智能体的路径
def visualize_path(Q):
state = (0, 0)
path = [state]
while state != (5, 5):
action = max(Q[state], key=Q[state].get)
_, state = get_reward(state, action)
path.append(state)
grid = np.zeros((grid_size, grid_size))
for x, y in path:
grid[y, x] = 1
# 设置障碍物
obstacles = [(1, 2), (3, 3), (3, 5), (5, 4)]
for x, y in obstacles:
grid[y, x] = -1
plt.imshow(grid, cmap='coolwarm', interpolation='nearest')
plt.title("Agent's Path in 6x6 Grid World")
plt.colorbar()
plt.show()
# 可视化策略表
def plot_policy_table(Q, title="Policy Table"):
directions = ['↑', '→', '↓', '←']
policy_grid = np.zeros((grid_size, grid_size), dtype=str)
for state in Q:
action = max(Q[state], key=Q[state].get)
if action == 'up':
policy_grid[state[1], state[0]] = '↑'
elif action == 'down':
policy_grid[state[1], state[0]] = '↓'
elif action == 'left':
policy_grid[state[1], state[0]] = '←'
elif action == 'right':
policy_grid[state[1], state[0]] = '→'
fig, ax = plt.subplots(figsize=(10, 7))
ax.set_title(title, fontsize=16)
for i in range(policy_grid.shape[0]):
for j in range(policy_grid.shape[1]):
ax.text(j, i, policy_grid[i, j], ha='center', va='center', fontsize=20)
ax.set_xticks(np.arange(policy_grid.shape[1] + 1) - 0.5, minor=True)
ax.set_yticks(np.arange(policy_grid.shape[0] + 1) - 0.5, minor=True)
ax.grid(which="minor", color="black", linestyle='-', linewidth=2)
ax.tick_params(which="minor", size=0)
ax.invert_yaxis()
plt.show()
# 可视化Q值
def plot_q_values(Q):
fig, axs = plt.subplots(2, 2, figsize=(15, 12))
action_names = ['↑', '→', '↓', '←']
for action in range(4):
ax = axs[action // 2, action % 2]
q_value_grid = np.full((grid_size, grid_size), -np.inf)
for state in Q:
q_value_grid[state[1], state[0]] = Q[state][actions[action]]
cax = ax.matshow(q_value_grid, cmap='coolwarm')
fig.colorbar(cax, ax=ax)
ax.set_title(f"Action: {action_names[action]}", fontsize=16)
ax.set_xticks(np.arange(grid_size))
ax.set_yticks(np.arange(grid_size))
ax.invert_yaxis()
plt.show()
# 可视化结果
# visualize_path(Q)
plot_policy_table(Q)
plot_q_values(Q)