2

我正在尝试在 R(奖励)是随机时间相关变量的环境中实现 Q 学习,并且它们在 const 时间间隔 deltaT 之后实时到达。状态 S(标量)也在 const 时间间隔 deltaT 之后到达。代理的任务是在获得 (S(n deltaT),R(n deltaT)) 后给出最优动作。

我的问题是我对 RL 很陌生,我不明白应该如何实现这个算法,大多数描述 Q-learning 算法的论文都是用“科学英语”写的,这对我没有帮助。

OnTimer() 在固定间隔后执行:

double a = 0.95;
double g = 0.95;

double old_state = 0;
action new_action = null;
action old_action = random_action;

void OnTimer()
{
   double new_state = environment.GetNewState();
   double Qmax = 0;

   foreach(action a in Actions)
   {
      if(Q(new_state, a) > Qmax)
      Qmax = Q(new_state, a);
      new_action = a;
   }

   double reward = environment.Reward(old_state, old_action);

   Q(old_state, old_action) = Q(old_state, old_action) + a*(reward + g*Qmax - Q(old_state, old_action));

   old_state = new_state;
   old_action = new_action;

   agent.ExecuteInEnvironment(new_action);
}

问题:

这是在线 Q 学习的正确实施吗,因为它似乎不起作用?为什么当 n*deltaT -> inf 时这不是最佳工作,请帮助它非常重要。

4

1 回答 1

0

如果没有更多信息,很难准确地说出哪里出了问题,但看起来您并没有正确实现算法。一般来说,算法是:

  1. 从作为当前状态的初始状态开始。
  2. 使用学习策略(例如 epsilon greedy)从当前状态中选择下一个动作。学习算法将选择导致从当前状态转换到下一个状态的动作。
  3. (current state, action) 对会告诉你下一个状态是什么。
  4. 找到 Qmax (我认为你做对了)。一个例外可能是,如果下一个状态是终端状态,则 Qmax 应该为 0,但您可能没有。
  5. 获得(当前状态、动作、下一个状态)元组的奖励。您似乎忽略了计算中到下一个状态的转换。
  6. 更新(旧状态,旧动作)的 Q 值。我认为你这样做是正确的。
  7. 将当前状态设置为下一个状态
  8. 返回步骤 2,除非当前状态是终端。

您是否知道您选择的动作实际上导致您的代理移动到预期状态的概率,或者您必须通过观察来估计?如果状态只是任意到达并且您无法控制发生的事情,那么这可能不是应用强化学习的合适环境。

于 2015-04-10T20:19:54.203 回答