# 对于给定状态计算各个动作a的期望
def clac_action_value(state, V, discount_factor=1.0):
A = np.zeros(env.nA) # 初始化动作期望向量
for a in range(env.nA): # 遍历当前状态下所有动作
for prob, next_state, reward, done in env.P[state][a]:
A[a] += prob * (reward + discount_factor * V[next_state])
return A
def value_iteration(env, theta=1.0, discount_factor=1.0):
V = np.zeros(env.nS) # 初始化状态值
for _ in range(50): # 迭代计算找到最优状态值函数
delta = 0 # 停止标志位
for s in range(env.nS): # 计算每个状态的状态值
A = clac_action_value(s, V) # 找到当前状态的动作期望
best_action_value = np.max(A) # 选择最好的动作期望作为新状态值
delta = max(delta, np.abs(best_action_value - V[s])) # 计算停止标志位
V[s] = best_action_value # 更新状态值函数
if delta < theta:
break
policy = np.zeros([env.nS, env.nA]) # 输出最优策略,通过最优状态值函数找到确定性策略,并初始化策略
for s in range(env.nS):
A = clac_action_value(s, V) # 执行一次找到当前状态的动作期望
best_action = np.argmax(A) # 选出最大的状态值作为最优动作
policy[s, best_action] = 1.0
return policy, V
2021-10-17 3.9
最新推荐文章于 2024-07-20 17:12:48 发布