请注意,您的价值迭代代理实际上并没有从经验中学习。相反,在与真实环境交互之前,它会考虑其MDP模型以获得完整的策略。当它确实与环境交互时,它只遵循预先计算的策略(例如,它成为反射代理)。这种区别在网格世界的模拟环境中可能很微妙,但在现实世界中非常重要,因为现实中没有真正的MDP。
现在,您将编写一个Q-Learning代理,它在构造上几乎不起作用,而是通过它的更新(状态、动作、下一个状态、奖励)方法,从与环境的交互中试验和错误学习。Q-Learning的存根在qlearningAgents.py的QLearningAgent中指定,您可以使用选项“-a q”选择它。对于这个问题,您必须实现update、computeValueFromQValues、getQValue和computeTeactionFromQValues方法。
注意:对于ComputeActionFromQValues,您应该随机中断关系以获得更好的行为。random.choice()函数将有所帮助。在特定状态下,代理之前未看到的动作仍然具有Q值,特别是Q值为零,如果代理之前看到的所有动作都具有负Q值,则未看到的动作可能是最佳的。
重要提示:确保在ComputeValueFromQValues和computeActionFromQValues 函数中,只通过调用GetQValue访问Q值。当您重写getQValue 以使用状态-动作对的特征而不是直接使用状态-动作对的特征时,这个抽象对于问题10很有用。
实现了Q-learning更新,您可以使用键盘在人工控制下观看Q-learner学习:
python gridworl