# discount_factor为折扣因子,theta为变化阈值,如果状态值函数的变化不大于阈值,则迭代停止
def policy_evaluation(policy, environment, discount_factor=1.0, theta=1.0):
env = environment
V = np.zeors(env.ns) # 初始化全0的值函数向量用于记录状态值
for _ in range(10000): # 迭代开始
delta = 0
for s in range(env.ns): # 对每个状态都进行全备份
v = 0
for a, action_prob in enumerate(policy[s]): # 检查下一个有可能进行的动作,及相应概率,对应于Π(a|s)
for prob, next_state, reward, done in env.P[s][a]: # 提取转移概率,下一状态和奖励值
v += action_prob * prob * (reward + discount_factor * V[next_state]) # 按公式计算状态值
delta = max(delta, np.abs(v - V[s])) # 计算状态值的变化量
V[s] = v
if delta <= theta:
break
return np.array(V)
2021-10-17 3.2
最新推荐文章于 2024-07-22 22:58:19 发布