如何将Q-learning应用于物理系统?

时间:2016-03-16 16:32:10

标签: machine-learning reinforcement-learning q-learning

我们是两名对强化学习感兴趣的法国机械工程专业学生,试图将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)不适应问题   - 超参数未优化   - 我们的物理系统太难以预测了

有没有人有任何将强化学习应用于物理系统的经验?我们遇到了障碍,正在寻求帮助和/或想法。

0 个答案:

没有答案