当前位置: 首页 > article >正文

小琳AI课堂 探索强化学习:通过Python迷宫示例掌握Q-learning算法

大家好,这里是小琳AI课堂。今天我们通过一个Python示例来进一步理解强化学习中的Q-learning算法。这个示例将带我们穿越一个迷宫,用代码的形式展示智能体是如何通过试错来找到出口的。🔍
首先,我们需要安装两个Python库:numpypandas。如果你还没有安装它们,可以通过以下命令来安装:

pip install numpy
pip install pandas

接下来,我们定义一个迷宫环境MazeEnv类。这个类包含了迷宫的地图、起始点和终点。我们的智能体需要在迷宫中找到通往终点的路径。
MazeEnv类中,我们有两个关键方法:

  • reset:将智能体放回起始点,为新的回合做准备。
  • step:智能体在这个方法中执行动作,环境根据动作给出新的状态、奖励和是否完成标志。
import numpy as np
import pandas as pd

# 定义环境
class MazeEnv:
    def __init__(self):
        self.maze = np.array([
            [0, 0, 0, 0, 0],
            [0, -1, 0, 0, 0],
            [0, 0, 0, 0, 0],
            [0, 0, 0, 0, 1]
        ])
        self.start = (0, 0)
        self.end = (3, 4)

    def reset(self):
        self.position = self.start
        return self.position

    def step(self, action):
        if action == 'up':
            new_position = (self.position[0] - 1, self.position[1])
        elif action == 'down':
            new_position = (self.position[0] + 1, self.position[1])
        elif action == 'left':
            new_position = (self.position[0], self.position[1] - 1)
        elif action == 'right':
            new_position = (self.position[0], self.position[1] + 1)

        # 检查是否超出边界
        if (new_position[0] < 0 or new_position[0] >= self.maze.shape[0]) or \
           (new_position[1] < 0 or new_position[1] >= self.maze.shape[1]):
            reward = -1
            done = False
        else:
            # 更新位置
            self.position = new_position
            # 如果到达终点,给予奖励并结束回合
            if self.position == self.end:
                reward = 10
                done = True
            # 如果碰到障碍物,给予惩罚
            elif self.maze[new_position] == -1:
                reward = -10
                done = True
            else:
                reward = -0.04
                done = False

        return self.position, reward, done

# Q-learning算法
def q_learning(env, episodes=1000, learning_rate=0.1, discount_factor=0.99, epsilon=0.1):
    actions = ['up', 'down', 'left', 'right']
    q_table = pd.DataFrame(0, index=[str(i) for i in range(env.maze.size)], columns=actions)

    for episode in range(episodes):
        state = str(env.reset())
        done = False
        while not done:
            if np.random.uniform(0, 1) < epsilon:
                action = np.random.choice(actions)
            else:
                action = q_table.loc[state].idxmax()

            next_state, reward, done = env.step(action)
            next_state = str(next_state)
            max_future_q = q_table.loc[next_state].max()
            current_q = q_table.loc[state, action]
            new_q = (1 - learning_rate) * current_q + learning_rate * (reward + discount_factor * max_future_q)
            q_table.loc[state, action] = new_q

            state = next_state

    return q_table

env = MazeEnv()
q_table = q_learning(env)
print(q_table)

MazeEnv 类:定义了一个简单的迷宫环境,其中包括迷宫地图、起始点和终点。 reset 方法:将智能体重置到起始位置,并返回当前位置。
step 方法:接收一个动作作为输入,并返回新的状态、奖励和是否完成标志。 q_learning
函数:实现了Q-learning算法,它通过不断尝试动作并更新Q-table来学习最优策略。

这个算法通过不断尝试和更新一个叫做Q-table的数据结构来学习最优策略。Q-table记录了在不同状态下,执行不同动作的预期奖励。
在Q-learning算法中,我们遍历多个回合(episodes),在每个回合中,智能体都会尝试不同的动作,并根据动作的结果更新Q-table。智能体有时会随机选择动作(探索),有时则会选择当前看起来最优的动作(利用)。
最后,我们打印出Q-table,它展示了在不同状态下,智能体应该选择哪个动作来最大化长期奖励。
这个示例虽然简单,但它展示了强化学习的基本原理:智能体通过与环境交互,不断学习如何在给定的环境中做出最优决策。这就是强化学习的魅力所在,它让机器能够通过经验来学习和适应复杂的环境。
希望这个示例能帮助你更好地理解强化学习。如果你有任何问题或想法,欢迎在评论区留言分享!👇
本期的小琳AI课堂就到这里,希望你喜欢今天的内容!下期见!👋


http://www.kler.cn/news/311596.html

相关文章:

  • 安卓玩机工具-----多设备同时投屏操控的安卓手机设备投屏工具 工作室推荐
  • 记忆化搜索
  • 【乐企-工具篇】ofd转pdf(解决字体问题)
  • Exchange Online 计划 2 部署方案
  • 基于SSM的宿舍管理系统的设计与实现 (含源码+sql+视频导入教程+文档+PPT)
  • 代码随想录算法训练营第51天 | 岛屿数量、岛屿的最大面积
  • 简单说说MySQL中 SELECT 语句执行流程
  • 最新动态一致的文生视频大模型FancyVideo部署
  • 【MySQL】MySQL 在 Centos 7环境安装
  • Hive自定义函数——简单使用
  • C#广泛应用的简洁匿名函数Lambda 表达式
  • 基于Python的自然语言处理系列(12):使用TorchText和LSTM进行序列到序列(seq2seq)翻译
  • LVGL 控件之仪表盘(lv_meter)
  • Learn ComputeShader 15 Grass
  • 【JVM】垃圾回收
  • 派遣函数 - 缓冲区设备模拟文件读写
  • 服务器数据恢复—raid5阵列热备盘上线失败导致阵列崩溃的数据恢复案例
  • redis为什么不使用一致性hash
  • 向日葵好用吗?4款稳定的远程控制软件推荐。
  • 关于交叉编译移植到Debian开发板的一些随笔
  • gbase8s存储过程一些隐藏的错误写法
  • docker镜像源
  • info 命令:查看命令手册
  • 案例分析-Stream List 中取出值最大的前 5 个和最小的 5 个值
  • 动态内存
  • 7.Java高级编程 多线程
  • flutter Dio发送post请求
  • Linux: debug:内核log有乱码^@^@
  • Redis——分布式锁
  • JVM 虚拟机的编译器、类加载过程、类加载器有哪些?