我们是两名对强化学习感兴趣的法国机械工程专业学生,试图将Q-learning应用于旋转倒立摆的项目。我们看过David Silver" youtube course"并阅读Sutton& Sons的章节。巴托,基本理论很容易......但我们还没有看到任何积极的结果。
Here是我们制作的旋转倒立摆的图片,以及我们最新测试的a graph,显示每集的平均奖励(绿色)。运行python代码的计算机与Arduino进行换向,Arduino又控制步进电机。我们有一个旋转编码器,它给我们摆锤的角度(我们也从中计算角速度)。
作为第一步,我们选择在离散的二维状态空间(角度位置和速度)中使用Q学习。我们让我们的系统运行了几个小时而没有任何改进的迹象。我们尝试改变算法的参数,可能的动作,状态的数量和它们的分区等。 此外,我们的系统往往会升温很多,因此我们将学习分为大约200个步骤,然后是短暂的休息时间。为了提高速度和精度,我们在每集结束时批量更新Q值。
这是我们的更新功能:
# Get Q values from database
Q_dict = agent.getAllQ()
E_dict = {}
# Set E_dict to 0 for all state-action pairs
for s,a in a_StateActionPairs:
E_dict[s + a] = 0
# Q Algorithm
# For every step
for i_r in episode_record:
state, action, new_state, new_action, greedy_action, R = i_r
# Get Q for current step and calculate target
Q = Q_dict[(state, action)]
target = R + GAMMA*Q_dict[(new_state,greedy_action)]
# Update E for visited state
E_dict[(state, action)] += 1
# Update Q for every state-action pair
for s,a in a_StateActionPairs:
updatedQ = Q_dict[(s,a)]+ALPHA*E_dict[(s,a)]*(target-Q)
Q_dict[(s,a)] = updatedQ
# Set E to 0 if new_action was chosen at random (epsilon-greedy)
if greedy_action == new_action:
E_dict[(s,a)] *= GAMMA*LAMBDA
else:
E_dict[(s,a)] = 0
# Update database
agent.setAllQ(Q_dict)
log.info('Qvalues updated')
这是"主要"部分代码:Github(https://github.com/Blabby/inverted-pendulum/blob/master/QAlgo.py)
这里我们的一些假设是为什么测试不成功: - 系统运行时间不够长 - 我们的探索(e-greedy)不适应问题 - 超参数未优化 - 我们的物理系统太难以预测了
有没有人有任何将强化学习应用于物理系统的经验?我们遇到了障碍,正在寻求帮助和/或想法。