简单的Q-Learning示例

        强化学习是一种机器学习方法,其中智能体(agent)通过与环境(environment)进行交互来学习如何实现目标。在每个时间步骤(time step)上,智能体都会从环境中获得当前状态(state),然后根据该状态选择一个动作(action)。执行动作后,智能体会收到一个奖励(reward)信号,并进入新状态。智能体的目标是学习一个策略(policy),用以在每个状态下选择最优动作以最大化累积奖励。

        在Q-Learning中,智能体学习一个称为Q-function的价值函数,用于估计每个状态-动作对的期望累积奖励。Q-function定义为:

        Q(s, a) = 当前状态为s且采取动作a时,预期的累积奖励。

        Q-Learning算法试图学习Q-function的近似值,从而找到最优策略。以下是该算法的详细解释:

  1. 初始化Q-table:创建一个二维表(矩阵),其中行对应状态,列对应动作。将所有值初始化为0(或其他任意值)。
  2. 设置参数:
    • 学习率(α):决定了Q-table更新的速度。较大的学习率使得新信息对Q-table的影响更大,但可能导致波动。较小的学习率使得学习过程更稳定,但可能需要更多时间来收敛。
    • 折扣因子(γ):衡量未来奖励在计算累积奖励时的重要性。较大的折扣因子使得智能体更关注长期收益,而较小的折扣因子使其更关注短期收益。
    • 探索率(ϵ):用于平衡探索和利用。较大的探索率使智能体更倾向于随机选择动作(探索),而较小的探索率使其更倾向于选择当前已知的最优动作(利用)。
  1. 重复以下过程: a. 观察当前状态(s)。 b. 以ϵ的概率随机选择一个动作,或者以1-ϵ的概率选择Q-table中当前状态的最优动作。 c. 执行所选动作(a),观察新状态(s')和奖励(r)。 d. 更新Q-table,使用以下公式: Q(s, a) <- Q(s, a) + α * [r + γ * max_a'(Q(s', a')) - Q(s, a)]

其中:

  • Q(s, a):Q-table中当前状态s和动作a对应的值。
  • α:学习率。
  • r:当前状态s执行动作a后得到的奖励。
  • γ:折扣因子。
  • max_a'(Q(s', a')):在新状态s'下,对所有可能动作a'的Q值中的最大值。

        公式的含义是,将Q(s, a)更新为原值加上学习率乘以括号内的部分。括号内的部分包含当前奖励r与折扣后的未来最大奖励γ * max_a'(Q(s', a'))之和,减去当前Q值Q(s, a)。这个更新过程使Q值逐渐逼近实际的累积奖励。

        e. 如果新状态是终止状态,回到步骤3a;否则,令s=s',继续步骤3b。

        整个过程会持续进行多轮(episodes),直到Q-table收敛或达到预定的训练轮数。在训练过程中,智能体会通过不断更新Q-table来学习各个状态-动作对的价值,并根据这些价值选择最优动作。在实际应用中,可以根据实际情况调整参数和迭代次数以获得最佳性能。

import numpy as np

def q_learning(env, num_episodes, alpha=0.1, gamma=0.99, epsilon=0.1):
    # 初始化Q-table
    # env.observation_space.n:状态空间的大小
    # env.action_space.n:动作空间的大小
    q_table = np.zeros((env.observation_space.n, env.action_space.n))

    # 遍历每个训练回合(episode)
    for episode in range(num_episodes):
        # 重置环境,获取初始状态
        state = env.reset()
        done = False

        # 当前回合未结束时,持续进行
        while not done:
            # 以epsilon概率随机选择动作(探索),或以1-epsilon概率选择当前状态下的最优动作(利用)
            if np.random.uniform(0, 1) < epsilon:
                action = env.action_space.sample()
            else:
                action = np.argmax(q_table[state])

            # 执行动作,获取新状态、奖励和是否结束(done)等信息
            next_state, reward, done, _ = env.step(action)

            # 更新Q-table
            # Q(s, a) <- Q(s, a) + α * [r + γ * max_a'(Q(s', a')) - Q(s, a)]
            q_table[state, action] += alpha * (reward + gamma * np.max(q_table[next_state]) - q_table[state, action])

            # 更新状态
            state = next_state

    # 返回训练好的Q-table
    return q_table

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郑剑1996

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值