第10篇:强化学习Q-learning求解迷宫问题 代码实现

你好,我是郭震(zhenguo)

今天重新发布强化学习第10篇:强化学习Q-learning求解迷宫问题 代码实现

我想对此篇做一些更加详细的解释。

1 创建地图

创建迷宫地图,包括墙网格,走到墙网格就是负奖励。

注意:空白可行走网格奖励值设置为负数,比如-1, 是为减少路径中所经点数;如果设置为大于0的奖励值,路线中会出现冗余点。

import numpy as np

# 创建迷宫地图
exit_coord = (3, 3)
row_n, col_n = 4, 4

maze = np.zeros((row_n, col_n)) - 1

# 走出迷宫奖励10个积分
maze[exit_coord] = 10

# 走到墙网格,扣除10个积分
maze[(0, 3)] = -10
maze[(1, 0)] = -10
maze[(1, 2)] = -10
maze[(2, 2)] = -10
maze[(3, 0)] = -10
888105d5875b3741f2044f4ec4ef842b.png

2 定义动作

定义动作集合

# 定义动作集合
action_n = 4
actions = [0, 1, 2, 3]  # 上、下、左、右

3 算法参数

定义参数

# 定义参数
alpha = 0.1  # 学习率
gamma = 0.9  # 折扣因子
epsilon = 0.1  # ε-greedy策略的ε值

4 初始化Q表

初始化Q表,三维数组。

# 初始化Q表
Q = np.zeros((row_n, col_n, action_n))

5 算法迭代

进行Q-learning算法迭代更新,包括步骤:

  • 选择动作

  • 执行动作,更新状态

  • 更新Q值

算法实现中一些细节处理包括:

  1. 智能体走到边界时,排除一些action

  2. 每次episode后,根据路线所经点的reward求和,判断是否找到更优路线。

# 进行Q-learning算法迭代更新
begin_cord = (0, 0)
max_reward_route = float("-inf")
for episode in range(200):
    # 初始化起始位置
    state = begin_cord
    route = [state]
    while state != exit_coord:  # 终止条件:到达终点位置
        tmp = actions.copy()
        # 排除一些可能
        if state[0] == 0:  # 不能向上
            tmp.remove(0)
        if state[1] == 0:  # 不能向左
            tmp.remove(2)
        if state[0] == row_n - 1:  # 不能向下
            tmp.remove(1)
        if state[1] == col_n - 1:  # 不能向右
            tmp.remove(3)

        # 选择动作
        if np.random.uniform() < epsilon:
            action = np.random.choice(tmp)  # ε-greedy策略,以一定概率随机选择动作
        else:
            action = np.argmax(Q[state[0], state[1], tmp])  # 选择Q值最大的动作
            action = tmp[action]

        # 执行动作,更新状态
        next_state = state
        if action == 0:  # 上
            next_state = (state[0] - 1, state[1])
        elif action == 1:  # 下
            next_state = (state[0] + 1, state[1])
        elif action == 2:  # 左
            next_state = (state[0], state[1] - 1)
        elif action == 3:  # 右
            next_state = (state[0], state[1] + 1)

        # 获取即时奖励
        reward = maze[next_state]

        # 更新Q值
        Q[state][action] = (1 - alpha) * Q[state][action] + alpha * (reward + gamma * np.max(Q[next_state]))

        # 更新状态
        state = next_state
        route.append(state)

    route_reward = sum(maze[state] for state in route)
    if max_reward_route < route_reward:
        max_reward_route = route_reward
        best_route = route.copy()
        print(f"episode: {episode}, 新发现最优路线:{best_route}")

    route.clear()
    cur_reward_route = 0

迭代完成,得到最佳路线,就如上图所示环境,最佳路线如下所示。大概在第50-80迭代步便可搜索到:

[(0, 0), (0, 1), (1, 1), (2, 1), (3, 1), (3, 2), (3, 3)]
3a942c8dbccea7e643f79b1d6e885091.png

Q表如下所示,可以看到红框所示为下面粉丝网格的Q值,第三个元素就是向左的奖励值,看到是最低的,因为是墙体。

ef759c31d455f2a464bc75ab6da5495f.png f2034d9c3a322b15fd03b666f6c1d6b7.png

根据此Q表,我们可预测出从任意位置出发的最佳路线,大家自行尝试。

最后分析训练时步与路线奖励值关系图,看到逐渐收敛。

6a331c1b4d6589b8b01a4f9464cb9c5b.png

以上,Q-learning算法求迷宫问题,代码实现。

感谢你的点赞和转发,让我更新更有动

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
众所周知,人工智能是当前最热门的话题之一, 计算机技术与互联网技术的快速发展更是将对人工智能的研究推向一个新的高潮。 人工智能是研究模拟和扩展人类智能的理论与方法及其应用的一门新兴技术科学。 作为人工智能核心研究领域之一的机器学习, 其研究动机是为了使计算机系统具有人的学习能力以实现人工智能。 那么, 什么是机器学习呢? 机器学习 (Machine Learning) 是对研究问题进行模型假设,利用计算机从训练数据中学习得到模型参数,并最终对数据进行预测和分析的一门学科。 机器学习的用途 机器学习是一种通用的数据处理技术,其包含了大量的学习算法。不同的学习算法在不同的行业及应用中能够表现出不同的性能和优势。目前,机器学习已成功地应用于下列领域: 互联网领域----语音识别、搜索引擎、语言翻译、垃圾邮件过滤、自然语言处理等 生物领域----基因序列分析、DNA 序列预测、蛋白质结构预测等 自动化领域----人脸识别、无人驾驶技术、图像处理、信号处理等 金融领域----证券市场分析、信用卡欺诈检测等 医学领域----疾病鉴别/诊断、流行病爆发预测等 刑侦领域----潜在犯罪识别与预测、模拟人工智能侦探等 新闻领域----新闻推荐系统等 游戏领域----游戏战略规划等 从上述所列举的应用可知,机器学习正在成为各行各业都会经常使用到的分析工具,尤其是在各领域数据量爆炸的今天,各行业都希望通过数据处理与分析手段,得到数据中有价值的信息,以便明确客户的需求和指引企业的发展。
人工智能大作业-基于强化学习求解迷宫问题python实现源码+项目说明+实验报告+可执行文件 【项目介绍】 该资源内项目代码都是经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶, 或者实际项目借鉴参考! 当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。如果基础还行,也可在此代码基础上进行修改,以实现其他功能。 强化学习求解迷宫问题 核心代码 - maze.py: 迷宫类的实现迷宫信息用一个二维数组表示,数组中的每个数代表一个方格,数字值代表方格类型(如0表示墙, 2表示陷阱, 3表示火)。 - train_qtable.py: Q表类的实现,Q表类有Q值的存储,决策的进行,Q表的学习等功能函数,进行预测和学习时会与迷宫(“环境”)进行交互,对其输入动作,得到反馈。 - train_network.py: 监督学习模型的学习,预测等实现。 - git.py: 监督学习用到的批量式学习仓库。 - maze_map.py: 存储6个事先定义好的迷宫 - draw.py: Q表的可视化以及完整走迷宫过程的呈现。 UI代码 - ui.py: 顶层窗口,有两个标签页 - ui_basic.py: “已有迷宫”标签页的实现,用户可以从我们定义好的几个迷宫中选择一个,进行训练并查看完整的走迷宫过程。 - ui_userDefine.py:“用户自定义”标签页的实现,用户可以输入任意大小的迷宫,自定义火焰周期,训练次数上限。之后进行训练,并以三种不同的速度查看完整的走迷宫结果。 - draw_ui.py: 在ui界面绘制Q表和走迷宫过程。 运行方法 - 打开“可执行文件/ui.exe” - 运行“代码/ui.py” - 运行“代码/train_qtable.py”,对maze_map中定义的迷宫进行训练,训练结束后显示Q表和完整走迷宫过程。 编译运行环境 python 3.6, pyqt 5.13.1, matplotlib 3.0.2, numpy 1.15.2, Pyinstaller 3.5
以下是使用 Python 和 SUMO(Simulation of Urban MObility)与强化学习 Q-learning 结合的代码示例: ```python import traci import numpy as np # 定义 Q-learning 算法的相关参数 Q = np.zeros((num_states, num_actions)) alpha = 0.1 gamma = 0.6 epsilon = 0.1 # 定义状态和动作数量 num_states = ... num_actions = ... # 初始化 SUMO 环境 sumoCmd = ["sumo", "-c", "path/to/sumo/config/file"] traci.start(sumoCmd) # 开始执行 Q-learning 算法 for episode in range(num_episodes): # 重置环境并获取初始状态 traci.load(["-c", "path/to/sumo/config/file"]) state = ... # 执行 Q-learning 算法 while not done: # 使用 epsilon-greedy 策略选择动作 if np.random.uniform(0, 1) < epsilon: action = np.random.randint(0, num_actions) else: action = np.argmax(Q[state, :]) # 执行动作并获取下一个状态和奖励 reward = ... next_state = ... # 更新 Q 值 Q[state, action] = (1 - alpha) * Q[state, action] + alpha * (reward + gamma * np.max(Q[next_state, :])) # 进入下一个状态 state = next_state # 保存本次训练结果 ... # 结束 SUMO 环境 traci.close() ``` 在此示例代码中,我们使用了 Q-learning 算法来控制 SUMO 的交通流,其中 Q 表示状态-动作对的价值,alpha 表示学习率,gamma 表示折扣因子,epsilon 表示 epsilon-greedy 策略中的 epsilon。我们首先初始化了 Q 值表,然后使用 epsilon-greedy 策略选择动作,执行动作并获取下一个状态和奖励,然后更新 Q 值。在每个 episode 结束后,我们保存了本次训练结果。最后,我们结束了 SUMO 环境。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值