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

news/2024/11/30 18:37:46/

你好,我是郭震(zhenguo)

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

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

1 创建地图

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

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

import numpy as np# 创建迷宫地图
exit_coord = (3, 3)
row_n, col_n = 4, 4maze = 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
e1f60068b0ddecbb49ca3c4224d108fa.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_cordroute = [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 = stateif 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_stateroute.append(state)route_reward = sum(maze[state] for state in route)if max_reward_route < route_reward:max_reward_route = route_rewardbest_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)]
4300dc2795140bb557f4710225e06409.png

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

44e861099d03480eee56dd0cfd758b94.png 851cfd4332f85c4c36551d499b80f3d2.png

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

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

ea500eab4a10a19550231d675b4a640f.png

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

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


http://www.ppmy.cn/news/413958.html

相关文章

总结712

今天看了高数换元法&#xff0c;分部积分&#xff0c;有理函数的积分的内容。之后写了一篇长篇阅读作文。之后就听到能回家的消息了。也不是很清楚到底是什么状况&#xff0c;但这学期过得确实快。走的时候先去图书馆借一波书先&#xff0c;暑假就是遗憾没能借些计算机类的书籍…

712. 两个字符串的最小ASCII删除和(c++)

712. 两个字符串的最小ASCII删除和(c) 中等 相关算法标签&#xff1a;LCS、动态规划 代码描述&#xff1a;使用迭代法&#xff08;从前到后&#xff0c;与从后到前&#xff09;、递归方法实现 /* 问题&#xff1a; 1.边界条件选取2.memo[i][j] min(memo[i-1][j]s1[i-1] , memo…

台积电发年终奖,总额712亿新台币

2021年台积电虽然损失了华为这个第二大客户&#xff0c;但由于半导体行业涨价及苹果、AMD等客户业绩增长&#xff0c;台积电依然取得了历史最好业绩&#xff0c;全年营收增长25%&#xff0c;现在台积电的年终奖也来了&#xff0c;总额712亿新台币&#xff0c;人均超过120万新台…

712. 正数

712. 正数 输入 6 个数字&#xff0c;它们要么是正数&#xff0c;要么是负数。 请你统计并输出正数的个数。 输入格式 六个数字&#xff0c;每个占一行。 输出格式 输出格式为 x positive numbers&#xff0c;其中 x 为正数的个数。 数据范围 输入数字的绝对值不超过 1…

LeetCode 712. 两个字符串的最小ASCII删除和

LeetCode 712. 两个字符串的最小ASCII删除和 文章目录 LeetCode 712. 两个字符串的最小ASCII删除和题目描述一、解题关键词二、解题报告1.思路分析2.时间复杂度3.代码示例2.知识点 总结相同题目 题目描述 给定两个字符串s1 和 s2&#xff0c;返回 使两个字符串相等所需删除字符…

AcWing 712. 正数

文章目录 AcWing 712. 正数AC代码 AcWing 712. 正数 本题链接&#xff1a;AcWing 712. 正数 本博客给出本题截图&#xff1a; AC代码 代码&#xff1a; #include <iostream>using namespace std;int main() {int count 0;double a[6];for (int i 0; i < 6; i …

Codeforces Round #712 (Div. 2)C. Balance the Bits

原题传送门 题目大意 给你一个01串&#xff0c;询问是否存在满足下列条件的两个合法括号串&#xff1a; 对与两个串在同一位置上&#xff0c;如果在该位置上01串是0&#xff0c;则代表这两个串在该位置上不同&#xff0c;而1则代表相同。 如果有&#xff0c;输出"YES&qu…

Codeforces Round #712 (Div. 2)(A-E题解)

场次链接 后悔啊后悔&#xff0c;当天晚上打的时候工作室网炸了&#xff0c;开场五分钟镜像页面才看到题目&#xff0c;A题读完就想到判断最前面和最后面能不能加就行了&#xff08;字符串渣第一时间没想到直接在原字符串上加&#xff0c;反而去判断s[0]和s[n-1]等不等于’a’…