我正在尝试理解Q-Learning,
我当前的算法运行如下:
1. 维护一个查找表,将状态映射到关于其即时奖励和每个可用动作的效用信息。
2. 在每个状态下,检查该状态是否包含在查找表中,如果没有则进行初始化(默认效用值为0)。
3. 选择执行一个动作的概率如下:
(*ϵ* = 0>ϵ>1 - 执行随机动作的概率) 1-ϵ = 选择效用最高的状态-动作对。 ϵ = 选择一个随机移动。 ϵ 随时间减少。
4. 根据以下公式更新当前状态的效用:
Q(st, at) += a[rt+1, + d.max(Q(st+1, a)) - Q(st,at)]
我目前让我的智能体与一个简单的启发式玩家对战,后者总是选择能带来最佳即时奖励的移动。
结果 – 结果非常差,即使在几百场比赛之后,Q-Learning智能体输的次数远多于赢的次数。此外,胜率的变化几乎不存在,尤其是在达到几百场比赛之后。
我是不是遗漏了什么?我已经实现了几个智能体:
(机械学习,TD(0),TD(Lambda),Q-Learning)
但它们似乎都产生了相似的,令人失望的结果。
回答:
跳棋游戏中有大约10²⁰种不同的状态,你需要为每次更新玩完整场游戏,因此通过这种方式获得有意义的动作值将需要非常非常长的时间。通常,你会想要一个简化的状态表示,比如神经网络,来使用强化学习解决这类问题。
此外,还有一些需要注意的地方:
- 理想情况下,你应该每场游戏更新一个值,因为单场游戏中的移动高度相关。
- 你应该将动作值初始化为小的随机值,以避免小的Q值更新导致大的策略变化。