用蒙特卡罗方法来实现策略评估,即给定一个策略,找出价值函数。
重点是:
for _ in range(100):
# generate an episode using pi
states, rewards = play_game(grid, policy)
G = 0
T = len(states)
for t in range(T - 2, -1, -1):
s = states[t]
r = rewards[t + 1]
G = r + GAMMA * G # update return
# we'll use first-visit Monte Carlo
if s not in states[:t]:
returns[s].append(G)
V[s] = np.mean(returns[s])
描述:蒙特卡罗解决的是,不知道环境的状态转移概率分布的问题。
实际上从过去的经验里学习。更符合强化学习实际上的定义。
play_game函数相当于玩游戏玩一次。返回整个游戏过程的状态序列和奖励序列。
接下来通过收获的期望公式来更新收获。
为了避免重复进入相同的状态,可以设置重复的状态不再添加到收获字典里。
总的来说,每玩一次游戏,得到一个完整的回合,接着评估这个回合所有状态的收获,然后存入字典的值列表里最后用np.mean()计算均值。
重复玩游戏的次数越多,得到的价值函数越准确。
那这是怎么起作用的?
不断的迭代,准确的值不断变多
G = r + GAMMA * G # update return
因为我们知道终止状态的奖励为0,收获也为0,那么在一次回合结束后得到的状态序列中,终止状态之前的状态的价值通过一次迭代后一定是准确的,于是知道了这个新的价值,然后再迭代,越来越准确。最后收敛。