reward= -1else: reward= 1else: reward=0 current_q= q_table[digital_state][action]#根据公式更新qtableq_table[digital_state][action] += rate * (reward + factor * max(q_table[next_digital_state]) -current_q) digital_state=next_digital_stateifdone:print(step)break...
done=True的时候,说明在此状态转移元组中,next_state是终止状态,终止状态价值为0,计算q_true的时候不需要计算下一状态的价值,为了在计算中考虑这个因素,将下一状态价值乘dones和ts的反。
action_space_dim=env.action_space.n q_net= Net(state_space_num, 256, action_space_dim) target_q_net= Net(state_space_num, 256, action_space_dim) optimizer= optim.Adam(q_net.parameters(), lr=5e-4)foriinrange(3000): state=env.reset() step=0whileTrue:#env.render()step +=1epsi=...
env = gym.make("CartPole-v1",render_mode="human").unwrapped # 使用gym库中的环境:CartPole,且打开封装(若想了解该环境,请自行百度) N_state = env.observation_space.shape[0] #特征数N_action = env.action_space.n class Net(nn.Module): def __init__(self): super(Net,self).__init__()...
State由杆的角速度,小车的速度,小车位置和杆和小车的夹角角度组成。Action是对小车向左\右施加1N的力。在本episode结束之前,做出的每一步动作都得到1的reward。玩家在游戏中要对小车施加力,使得杆不会倒下。显然行动的step越多,杆不倒的时间越长,玩家获得的奖励就越高。
如上图所示,我们每次选择下一状态st+1最大的Q值,假设绿色部分是高估的值,那当我们选择该Q值时,高估的值也就被加了进去。每个状态的Q值都依赖于其下一个状态的Q值,所以容易出现过高的情况。 所以在Double DQN中,选动作的Q-function和计算值的Q-function不是同一个。