Q_learning简介与实例

本文深入解析了Q-Learning算法,一种基于价值的强化学习方法。通过构建Q-table存储Q值,智能体能学习并选择最优行动策略以最大化累积奖励。文章以迷宫寻路和FlappyBird游戏为例,详细阐述了算法原理、核心公式及其实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、算法思想

QLearning是强化学习算法中value-based的算法,Q即为在某一环境下,Q(state,action)在某一时刻的 s 状态下(s∈S),采取 动作a (a∈A)动作能够获得收益的期望,环境会根据agent的动作反馈相应的回报reward r(分数)。

所以算法的主要思想就是将State与Action构建成一张Q-table来存储Q值,然后根据Q值来选取能够获得最大的收益的动作。

在这里插入图片描述

2、实例与核心公式

在这里插入图片描述
实例:从起点出发到达终点圆圈为胜利——加分,碰到三角为失败——扣分。第一轮是随机走,直到有了得分就会高概率按照高分走。

  • 智能体(Agent)——正方体
  • 环境状态(environment)——这里以tk窗体模拟
  • 奖励(reward)——对动作的奖惩分数
  • 动作(action)——上下左右

可以将问题抽象成一个马尔科夫决策过程。

在每个格子都算是一个状态s
q(a | s)是在s状态下采取动作a策略
p(s’ | s,a)为在s状态下选择a动作转换到下一个状态s’的概率
R(s’ | s,a)表示在s状态下采取a动作转移到s’的奖励reward

目标就是找到一条能够到达终点获得最大奖赏的策略,获取最大奖赏公式:
在这里插入图片描述

Qlearning的主要优势就是使用了时间差分法TD(融合了蒙特卡洛和动态规划)能够进行离线学习, 使用贝尔曼(bellman)方程可以对马尔科夫过程求解最优策略。
详见:时间差分法

核心公式
在这里插入图片描述

更新公式
在这里插入图片描述

核心代码:

import numpy as np
import random
from environment import Env
from collections import defaultdict


class QLearningAgent:
    def __init__(self, actions):
        # actions = [0, 1, 2, 3]
        self.actions = actions      # 动作
        self.learning_rate = 0.01   # 学习率
        self.discount_factor = 0.9  # 折扣因子
        self.epsilon = 0.1          # [ˈepsɪlɒn]
        self.q_table = defaultdict(lambda: [0.0, 0.0, 0.0, 0.0])

    # 采样 <s, a, r, s'>
    def learn(self, state, action, reward, next_state):
        current_q = self.q_table[state][action]
        # 贝尔曼方程更新
        new_q = reward + self.discount_factor * max(self.q_table[next_state])
        self.q_table[state][action] += self.learning_rate * (new_q - current_q)

    # 从Q-table中选取动作
    def get_action(self, state):
        if np.random.rand() < self.epsilon:
            # 贪婪策略随机探索动作
            action = np.random.choice(self.actions)
        else:
            # 从q表中选择
            state_action = self.q_table[state]
            action = self.arg_max(state_action)  # 选组最大效益动作
        return action
        
 	# 选取最大分数
    @staticmethod
    def arg_max(state_action):
        max_index_list = []
        max_value = state_action[0]
        for index, value in enumerate(state_action):
            if value > max_value:
                max_index_list.clear()
                max_value = value
                max_index_list.append(index)
            elif value == max_value:
                max_index_list.append(index)
        return random.choice(max_index_list)


if __name__ == "__main__":
    env = Env()     # 初始化tk窗口
    agent = QLearningAgent(actions=list(range(env.n_actions)))  # 初始化物体实例
    for episode in range(1000):
        state = env.reset()
        while True:
            env.render()
            # agent产生动作
            action = agent.get_action(str(state))
            next_state, reward, done = env.step(action)
            # 更新Q表 -- 核心更新公式
            agent.learn(str(state), action, reward, str(next_state))
            state = next_state
            env.print_value_all(agent.q_table)
            # 当到达终点就终止游戏开始新一轮训练
            if done:
                break


另一Q learning 实例:Flappy Bird(飞扬的小鸟 )
Q learning实例:Flappy Bird
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值