【强化学习】Q-Learning 迷宫算法案例

问题描述与项目流程

完整代码:https://github.com/StephenLouis/Reinforcement_Learning
如果觉得不错,麻烦点颗星哦!

1.问题描述

在这里插入图片描述
在该项目中,你将使用强化学习算法(本文使用的Q-Learning),实现一个自动走迷宫的机器人。

  1. 如上图所示,机器人初始位置在地图左上角。在我们的迷宫中,有墙壁(黑色方块)炸弹(黄色圆块)终点(绿色方块)。机器人要尽可能避开陷阱,并且拿到黄金后,以最少的步子到达终点。
  2. 机器人可执行的动作包括:向左走 L 、向右走 R 、向上走 U 、向下走 D
  3. 执行不同动作后,根据不同的情况会活动不同的奖励,具体而言,有以下几种情况:
    • 走到墙壁: -10
    • 走到陷阱:- 30
    • 走到终点:+50

2.强化学习:算法理解

2.1强化学习总览

强化学习作为机器学习算法的一种,其模式也是让智能体在“训练”中学到“经验”,以实现给定的任务。但不同于监督学习与非监督学习,在强化学习的框架中,我们更侧重通过智能体与环境的交互来学习。通常在监督学习和非监督学习任务中,智能体往往需要通过给定的训练集,辅之以既定的训练目标(如最小化损失函数),通过给定的学习算法来实现这一目标。然而在强化学习中,智能体则是通过其与环境交互得到的奖励进行学习。这个环境可以是虚拟的(如虚拟的迷宫),也可以是真实的(自动驾驶汽车在真实道路上收集数据)。

在强化学习中有五个核心组成部分,它们分别是:环境(Environment)、智能体(Agent)、状态(State)、动作(Action)和奖励(Reward)。在某一时间节点 t t t

  • 智能体在从环境中感知其所处的状态 s t s_t st
  • 智能体根据某些准则选择动作 a t a_t at
  • 环境根据智能体选择的动作,向智能体反馈奖励 r t + 1 r_{t+1} rt+1

通过合理的学习算法,智能体将在这样的问题设置下,成功学到一个在状态 s t s_t st 选择动作 a t a_t at 的策略 π ( s t ) = a t \pi (s_t) = a_t π(st)=at

2.2代码实现

2.2.1 生成环境

首先,我们需要创造环境,一个让机器人能学习的环境。本文中也就是我们的迷宫。
详细代码就不展示了,有兴趣的欢迎去我的Github查看完整代码。

from maze_env import Maze

env = Maze()	#迷宫可以自定义,这里我们生成的是 5*5 的迷宫
env.mainloop()

在这里插入图片描述

2.2.2 定义动作

  接下来,定义机器人是如何选择行动的。这里需要引入增强学习中epsilon greedy的概念。因为在初始阶段, 随机的探索环境, 往往比固定的行为模式要好, 所以这也是累积经验的阶段, 我们希望探索者不会那么贪婪(greedy)。说说我的理解,上图迷宫中,当机器人第一次找到黄金后,如果不控制他的贪婪程度,那么很可能他每次都会直奔去,加入地图中还有第二个黄金,则很有可能被忽略(即缺少对地图的完全搜索)。
  所以epsilon就是用来控制贪婪程度的值。epsilon可以随着探索时间不断提升(越来越贪婪), 不过在这个例子中, 我们就固定成 epsilon = 0.9, 90% 的时间是选择最优策略, 10% 的时间来探索。

   def choose_action(self, observation):
        self.check_state_exist(observation)	# 检查这个state(状态)下的所有action值
        # action selection
        if np.random.uniform() < self.epsilon:	# 非贪婪模式
            # choose best action
            state_action = self.q_table.loc[observation, :]
            # some actions may have the same value, randomly choose on in these actions
            action = np.random.choice(state_action[state_action == np.max(state_action)].index)
        else:
            # choose random action
            action = np.random.choice(self.actions)	# 贪婪模式
        return action
2.2.3 环境反馈

当机器人做出行为后,环境也需要给行为一个反馈,也就是我们说的惩罚奖励。环境需要反馈出下个 state(S_ ) 和上个 **state(S)**已经做出 action(A) 所获得的 reward(R) 当机器人撞到则惩罚 ,踩到陷阱则惩罚,进入终点则奖励。

    def step(self, action):
        s = self.canvas.coords(self.rect)
        base_action = np.array([0, 0])
        if action == 0:   # up
            if s[1] > UNIT:
                base_action[1] -= UNIT
        elif action == 1:   # down
            if s[1] < (MAZE_H - 1) * UNIT:
                base_action[1] += UNIT
        elif action == 2:   # right
            if s[0] < (MAZE_W - 1) * UNIT:
                base_action[0] += UNIT
        elif action == 3:   # left
            if s[0] > UNIT:
                base_action[0] -= UNIT

        self.canvas.move(self.rect, base_action[0], base_action[1])  # move agent

        s_ = self.canvas.coords(self.rect)  # next state

        # reward function
        if s_ == self.canvas.coords(self.oval):
            reward = 1
            done = True
            s_ = 'terminal'
        elif s_ in [self.canvas.coords(self.barrier1),
                    self.canvas.coords(self.barrier2),
                    self.canvas.coords(self.barrier3),
                    self.canvas.coords(self.barrier4),
                    self.canvas.coords(self.barrier5),
                    self.canvas.coords(self.barrier6)]:
            reward = -1
            done = True
            s_ = 'terminal'
        else:
            reward = 0
            done = False

        return s_, reward, done
2.2.4 环境更新

接下来是更新环境,代码较简单。

    def learn(self, s, a, r, s_):
        self.check_state_exist(s_)
        q_predict = self.q_table.loc[s, a]
        if s_ != 'terminal':
            q_target = r + self.gamma * self.q_table.loc[s_, :].max()  # next state is not terminal
        else:
            q_target = r  # next state is terminal
        self.q_table.loc[s, a] += self.lr * (q_target - q_predict)  # update
2.2.5 强化学习主循环

最重要的地方就在这里. 你定义的 RL 方法都在这里体现.。(最后大约200个episode能找到两条最短路径)
Q—Learing 算法

def update():
    for episode in range(100):
        # initial observation
        observation = env.reset()

        while True:
            # fresh env
            env.render()

            # RL choose action based on observation
            action = RL.choose_action(str(observation))

            # RL take action and get next observation and reward
            observation_, reward, done = env.step(action)

            # RL learn from this transition
            RL.learn(str(observation), action, reward, str(observation_))

            # swap observation
            observation = observation_

            # break while loop when end of this episode
            if done:
                break

    # end of game
    print('game over')
    env.destroy()
### 回答1: Q-learning 是一种强化学习算法,常用于解决迷宫问题。在迷宫中,智能体需要通过不断地尝试与环境交互,来获得与其行为相对应的奖励。通过感知这些奖励,智能体不断调整自己的行为,使其能够在迷宫中找到出路。Q-learning 算法的核心是一个 Q 表,该表记录了所有在给定状态下采取不同行为的价值。通过不断地对 Q 表进行更新,智能体能够逐渐学会在特定状态下应该采取哪种行为。 在 MATLAB 中实现 Q-learning 迷宫问题通常需要以下几步:首先,需要定义迷宫问题的各种参数,比如迷宫的大小、智能体的初始位置、奖励等。然后,需要针对这些参数设计 Q 表,并设置初始值。接着,智能体可以开始在迷宫中漫游,通过感知奖励值来更新 Q 表,并调整自己的行为。在 Q-learning 中,为了保证算法的稳定性,通常会使用一些典型的值函数,如 $\epsilon$-greedy 或 softmax 策略。 在 MATLAB 中实现 Q-learning 迷宫问题可以更好地理解 Q-learning 算法的基本思想和实现方法。同时,通过实际编程,可以更直观地感受到 Q-learning 算法的强大表现力,以及强化学习在解决实际问题中的巨大潜力。 ### 回答2: Q-learning是一种常用的强化学习方法,可以用于解决迷宫问题。在迷宫中,智能体需要通过移动来找到终点,Q-learning算法可以通过不断尝试、学习从而找到一条最优路径。 Matlab是一种功能强大的数值计算软件,可以用于实现Q-learning算法。在Matlab中,可以通过设置不同的迷宫大小、智能体的起始位置和终点位置等参数,来完成迷宫问题的求解。可以利用Matlab中的矩阵运算、数据显示等功能,对算法的实现和结果进行可视化处理,便于深入了解算法的性质和效果。 Q-learning的基本思想是通过更新状态-动作值函数Q,来实现对最优策略的学习。在每次探索中,智能体会根据当前状态和当前状态下的所有可行动作,选择一个动作并执行。根据执行结果,智能体会获得一个奖励,用于更新Q函数。从不断更新的Q函数中,智能体可以得到一些策略,用于优化路径选择。 综上,借助Q-learning算法和Matlab工具,我们可以很好地解决迷宫问题,并以实验结果验证算法的优越性。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值