第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
第10篇:强化学习Q-learning求解迷宫问题 代码实现_第1张图片

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)]
第10篇:强化学习Q-learning求解迷宫问题 代码实现_第2张图片

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

第10篇:强化学习Q-learning求解迷宫问题 代码实现_第3张图片 第10篇:强化学习Q-learning求解迷宫问题 代码实现_第4张图片

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

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

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

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

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

你可能感兴趣的:(python,numpy,机器学习,开发语言,人工智能)