现在您将实现PrioritedSweepingValueIterationAgent,它已在ValueIterationAgents.py中为您部分指定。注意,这个类是从AsynchronousValueIterationAgent派生的,所以唯一需要更改的方法是RunValueIteration,它实际上运行值迭代。优先以可能改变策略的方式集中更新状态值。
对于这个项目,您将实现标准优先级扫描算法的简化版本,本文对此进行了描述。我们已经为我们的设置调整了这个算法。首先,将状态s的前一个状态定义为所有通过采取某种行动a达到s的概率为非零的状态。另外,作为参数传入的theta,在决定是否更新状态值时,将表示对错误的容忍度。这是在实现中应该遵循的算法。
- 计算所有状态的前一个状态。
- 初始化空优先级队列。
- 对于每个非终端状态s,(注意:为了使autograder程序能够处理这个问题,必须按照self.mdp.getStates()返回的顺序迭代状态)。在self.value s中的s的当前值与s的所有可能操作中的最高Q值之间的差的绝对值(表示该值应该是什么),可调用数字diff,在此步骤中不要更新self.value s[s];使用priority-diff将s推入优先级队列(请注意,这是负数)。我们使用负数,因为优先级队列是最小堆,但我们希望对错误更大的更新状态进行优先级排序。
- 对于0,1,2,…,self.iterations-1中的迭代,请执行以下操作:
-
如果优先级队列为空,则终止;
-