引入外部变量 ============ 外部变量是指会对当前系统产生影响,但是不会被当前系统影响的变量。例如在机器人控制任务中,室内的灯光状况通常会影响机器人传感器读数, 并且传感器数据也会影响机器人在室内的运动策略。灯光状况并不受机器人运动策略的影响,因此可以将其视为一个外部变量。在自动驾驶任务中, 交通标志和红绿灯等交通规则是一个外部变量,因为它们通常是由道路管理机构制定,而不受自动驾驶车辆的影响。 外部变量通常是由外部因素引起的,并且不能被当前的系统所操纵或控制。在建模过程中,引入外部变量可以使模型更加准确。 REVIVE SDK 支持引入外部变量作为决策流图的输入,外部变量在决策流图中只作为输入使用,并不配置节点进行输出。 例如在::doc:`冰箱案例` 中, 冰箱内部温度会受冰箱门开关状态的影响,而冰箱门开关状态完全是人为决定的,不会被冰箱自身影响,因此冰箱门开关状态被作为外部变量引入。 .. note:: 外部变量不是使用REVIVE的必须条件。只有某个变量会影响决策流图的其余节点,而不会被其余节点影响时才应该将该节点设置为外部变量。 我们通过下面的 ``.yaml`` 来展示在冰箱案例中外部变量的使用: .. code:: yaml metadata: graph: action: - temperature next_temperature: - action - temperature - door_open columns: - obs_temp: dim: temperature type: continuous max: 20 min: -20 - power_action: dim: action type: continuous max: 10 min: 0 - factor_door_state: dim: door_open type: continuous 在上述 ``.yaml`` 中, ``door_open`` 与 ``action`` 和 ``temperature`` 一起作为 ``next_temperature`` 节点的输入。 但是 ``door_open`` 既不是转移节点,也不是输出节点,它作为静态变量节点。因此 ``door_open`` 不能被决策流图中的其它节点影响。 如果假设 ``door_open`` 会受到温度的影响,当温度达到一定条件时,冰箱门会自动打开, 那么就需要在上述的 ``.yaml`` 文件中增加指向 ``door_open`` 的边。如下所示 : .. code:: yaml metadata: graph: action: - temperature next_temperature: - action - temperature - door_open next_door_open: - next_temperature columns: - obs_temp: dim: temperature type: continuous max: 20 min: -20 - power_action: dim: action type: continuous max: 10 min: 0 - factor_door_state: dim: door_open type: continuous 在使用REVIVE SDK时,我们应根据业务逻辑在决策流图中定义或构建外部因素,这将使REVIVE学习环境模型更准确、更接近真实。