视频网站开发费用,常德网站制作建设,html美食网页设计源码,wordpress 点击排行一、价值迭代的问题在FrozenLake环境中#xff0c;交叉熵方法改为价值迭代后#xff0c;模型收敛速度加快。价值迭代时对所有状态进行循环#xff0c;并对每个状态用Bellman方程更新价值。该过程中#xff0c;对于同一方法中Q值#xff08;动作价值#xff09;变化似乎相…一、价值迭代的问题在FrozenLake环境中交叉熵方法改为价值迭代后模型收敛速度加快。价值迭代时对所有状态进行循环并对每个状态用Bellman方程更新价值。该过程中对于同一方法中Q值动作价值变化似乎相同但要估算并存储每个状态和动作的价值所以这个过程的问题如下1、环境状态的数量及迭代能力1)状态和动作迭代加耗CPU(2)真正优质的状态转移动态的估计所需要的样本数量。假设一个环境有十亿个状态约为31600*31600的FrozenLake每个状态计算近似价值需要在状态之间均匀分布数千亿转移。3)枚举所有可能状态但其中99.9%的状态为无用状态。例如Atari平台的状态空间屏幕分辨率210*160像素每个像素128种颜色每一帧210*16033600个像素总状态数128^33600,比10^70802略多。如果枚举Atari的所有可能状态那么即使是超级计算机也要数十亿亿年。99.9%的时间在做无用功因为大多数组合即使在很长的游戏过程中都不会出现因此永远不会有这些状态的样本。2、限制为离散动作空间Q(s,a)和V(s)的近似指都假设动作是互斥的离散集对于动作可以是连续变量例如方向盘的角度、执行器上的力或者加热器的温度的连续控制问题并不一定正确。二、表格Q-learning不需要遍历状态空间中的所有状态只关心从环境中获得的状态更新状态价值。对于有明确状态价值映射的情况具体步骤如下1从空表开始将状态映射到动作价值。2通过与环境交互获得s,a,r,)(状态、动作、奖励和新状态。在此步骤中要确定所需采取的动作并且没有单一的正确方法来做出此决定需要应用探索与利用的方法。3使用Bellman近似更新Q(s,a)值4从步骤2开始重复。终止条件是更新的某个阈值或可以执行测试片段以估计策略的预期奖励。更新Q值采用学习率平衡新、旧Q值三、代码与分析1、代码Agent类包含四个方法sample_env在动作空间中随机选取动作best_value_and_action接收环境中的状态并通过表格查找在当前状态下可以获得的最大价值和最大价值对应的动作value_update函数进行价值更新play_episode使用提供的测试表运行一个片段每个动作由Q值决定#!/usr/bin/env python3 import gym import collections from tensorboardX import SummaryWriter ENV_NAME FrozenLake-v0 GAMMA 0.9 ALPHA 0.2 TEST_EPISODES 20 class Agent: def __init__(self): 初始化环境、状态、价值表 self.env gym.make(ENV_NAME) self.state self.env.reset() self.values collections.defaultdict(float) def sample_env(self): 在动作空间中随机选取动作 :return:旧状态所采取动作、所获得奖励、新状态组成的元组 action self.env.action_space.sample() old_state self.state new_state, reward, is_done, _ self.env.step(action) self.state self.env.reset() if is_done else new_state return old_state, action, reward, new_state def best_value_and_action(self, state): 接收环境中的状态并通过表格查找在当前状态下可以获得 最大价值和最大价值对应的动作 :param state: 环境中状态 :return: 表格查找获取当前状态下可以获得的 最大价值和最大价值对应的动作 best_value, best_action None, None for action in range(self.env.action_space.n): action_value self.values[(state, action)] if best_value is None or best_value action_value: best_value action_value best_action action return best_value, best_action def value_update(self, s, a, r, next_s): 计算状态s和动作a的价值的新近似值 :param s: 当前状态 :param a: 当前动作 :param r: 当前奖励 :param next_s: 下一个状态 :return: 前进一步更新价值表 best_v, _ self.best_value_and_action(next_s) new_v r GAMMA * best_v # Bellman近似 old_v self.values[(s, a)] self.values[(s, a)] old_v * (1-ALPHA) new_v * ALPHA #使用学习率的值混合平均 def play_episode(self, env): 使用提供的测试表运行一个片段每个动作由Q值决定 该方法用于评估当前策略以检查学习进度 注意此方法不会改变价值表只是用它查找要采取的最佳动作 :param env:测试环境 :return:总奖励 total_reward 0.0 state env.reset() while True: _, action self.best_value_and_action(state) new_state, reward, is_done, _ env.step(action) total_reward reward if is_done: break state new_state return total_reward if __name__ __main__: test_env gym.make(ENV_NAME) agent Agent() writer SummaryWriter(comment-q-learning) iter_no 0 best_reward 0.0 while True: iter_no 1 s, a, r, next_s agent.sample_env() agent.value_update(s, a, r, next_s) reward 0.0 for _ in range(TEST_EPISODES): reward agent.play_episode(test_env) reward / TEST_EPISODES writer.add_scalar(reward, reward, iter_no) if reward best_reward: print(Best reward updated %.3f - %.3f % ( best_reward, 9)) best_reward reward if reward 0.80: print(Solved in %d iterations! % iter_no) break writer.close()2、结果显示四、总结与价值迭代方法相比此版本迭代次数更多原因是不再使用测试中获得的经验数据在测试过程中不触及Q值表更新。