使用 Q 学习寻找最短路径

news/2024/12/29 19:40:04/

使用 Q 学习寻找最短路径

Q 学习是一种无模型的强化学习算法,可以用于在马尔可夫决策过程(MDP)建模的环境中找到最优策略和最短路径。在这篇博客文章中,我将解释 Q 学习的工作原理,并展示在网格世界环境中寻找最短路径的实现。

理解 Q 学习算法

Q 学习的目标是学习一个最大化总体奖励的策略。它通过学习一个称为 Q 函数的动作值函数来实现这一目标,Q 函数给出了在给定状态下采取给定动作的预期效用。

更正式地说,Q 函数定义为:

   

Copy code

Q(s, a) = 从状态 s 开始采取动作 a 并遵循策略 π 的预期回报

该算法通过在探索环境的同时迭代地更新每个状态和动作的这个 Q 函数来工作。它遵循以下更新规则:

   

Copy code

Q(s, a) := Q(s, a) + α [R(s,a) + γ max Q(s', a') - Q(s, a)] a'

其中:

  • α 是学习率
  • γ 是折扣因子
  • R(s,a) 是在状态 s 下采取动作 a 的即时奖励
  • s' 是下一个状态
  • max Q(s', a') 表示预期未来奖励

通过重复应用此更新规则,Q 学习能够在环境转移动态未知的情况下找到最优策略。

在网格世界上实现 Q 学习

为了演示 Q 学习的工作原理,我们在一个简单的网格世界上实现它:

Show Image

这个环境中的状态是网格单元,动作是向上、向下、向左或向右移动,奖励设置成鼓励智能体到达右上角的目标状态。

首先,我们定义环境:

   

python

Copy code

import numpy as np import matplotlib.pyplot as pltWORLD_HEIGHT = 5 WORLD_WIDTH = 5START = [0, 0] GOAL = [WORLD_HEIGHT-1, WORLD_WIDTH-1] actions = [0, 1, 2, 3] # 上,下,左,右

接下来,我们初始化 Q 表来保存每个状态和动作对的 Q 值:

   

python

Copy code

q_table = np.random.uniform(size=(WORLD_HEIGHT, WORLD_WIDTH, 4))

在主 Q 学习循环中,我们采取以下步骤:

  1. 初始化状态
  2. 选择一个动作(ε-贪婪策略)
  3. 执行动作,观察 R(s,a) 和下一个状态 s'
  4. 用上述公式更新 Q 值
  5. 将状态设置为下一个状态
  6. 检查是否达到目标

完整的算法如下:

   

python

Copy code

# Q 学习算法for episode in range(NUM_EPISODES): state = START while state != GOAL: # ε-贪婪动作选择 if random.uniform(0, 1) < eps:action = random.choice(actions) else:action = np.argmax(q_table[state])# 执行动作,观察 R(s,a) 和 s'next_state, reward = takeAction(state, action) # 更新 Q 值q_table[state + [action]] += lr*(reward + gamma*np.max(q_table[next_state]) - q_table[state + [action]]) state = next_stateeps *= eps_decayprint("Q 表:") print(q_table)

在训练足够多的回合后,我们可以打印出最终的 Q 表,看到它已经学会了最优路径:右->右->上->上->上。

这就是如何使用 Q 学习高效地寻找最短路径的方法! 通过一些超参数调优和更复杂的环境,这个简单的算法能够解决非常有挑战性的顺序决策问题。


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

相关文章

C#关键字、特性基础及扩展合集(持续更新)

一、基础 Ⅰ 关键字 1、record record&#xff08;记录&#xff09;&#xff0c;编译器会在后台创建一个类。支持类似于结构的值定义&#xff0c;但被实现为一个类&#xff0c;方便创建不可变类型&#xff0c;成员在初始化后不能再被改变 &#xff08;C#9新增&#xff09; …

排序算法--插入排序

实现逻辑 ① 从第一个元素开始&#xff0c;该元素可以认为已经被排序 ② 取出下一个元素&#xff0c;在已经排序的元素序列中从后向前扫描 ③如果该元素&#xff08;已排序&#xff09;大于新元素&#xff0c;将该元素移到下一位置 ④ 重复步骤③&#xff0c;直到找到已排序的元…

【现场问题】现场的zk出现问题,ES也出现问题,一个一个排查出来,服务器重启了

湖南现场 zk出现问题ES出现问题了罪魁祸首&#xff0c;服务器重启 zk出现问题 发现集群出现问题了&#xff0c;想都没想就直接去重启了&#xff0c;把三台服务器都重启 ES出现问题了 三台机器只有一台机器是有ES的&#xff0c;但是看了配置文件&#xff0c;发现这个ES是三台…

kafka精准一次、事务、幂等性

Kafka事务 消息中间件的消息保障的3个级别 At most once 至多一次。数据丢失。At last once 至少一次。数据冗余Exactly one 精准一次。好&#xff01;&#xff01;&#xff01; 如何区分只要盯准提交位移、消费消息这两个动作的时机就可以了。 当&#xff1a;先消费消息、…

商企做VR漫游,让你的全景作品更加与众不同

当下&#xff0c;VR漫游技术备受关注&#xff0c;与普通的宣传图片不一样&#xff0c;用户体验VR漫游时&#xff0c;可以自主改变位置以及调整观看角度&#xff0c;仿佛置身于真实的场景中一般&#xff0c;带来沉浸式的漫游体验。 VR漫游除了让用户身临其境的观看VR场景&#x…

vue3 终端实现 (vue3+xterm+websocket)

目录 一、xterm介绍 二、效果展示 三、vue文件实现代码 一、xterm介绍 xterm是一个使用 TypeScript 编写的前端终端组件&#xff0c;可以直接在浏览器中实现一个命令行终端应用&#xff0c;通常与websocket一起使用。 二、效果展示 三、vue文件实现代码 <template>…

post请求参数全大写后台接不到参数

post请求参数全大写后台接不到参数 开发过程中&#xff0c;我们一般都习惯用驼峰命名法&#xff0c;但是特殊情况要求请求参数全大写&#xff08;或者首字母大写&#xff09;&#xff0c;测试验证的时候发现&#xff0c;接收不到请求参数。 前端请求传递&#xff1a; 服务端接…