2021-10-17 3.9

# 对于给定状态计算各个动作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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值