蒙特卡洛方法(MC Exploring Starts算法例子)

 本文章中使用的算法和例子来源于bilibili中西湖大学赵世钰老师的【强化学习的数学原理】课程。网址:第5课-蒙特卡洛方法(MC Exploring Starts算法)_哔哩哔哩_bilibili

目录

一、算法简介

二、相关定义

1、策略评估

2、visit定义

3、episode定义

三、算法流程

四、代码演示


一、算法简介

        "Monte Carlo Exploring Starts"(MC Exploring Starts)是一种强化学习算法,用于估计策略下的状态-动作值函数 Q(s,a)。该方法适用于有限状态和动作空间的问题,主要用于确定性策略的优化。它属于蒙特卡洛(Monte Carlo)方法的一类,使用从起始状态到终止状态的完整回合(episode)进行学习。

二、相关定义

1、策略评估

①每次访问(Every-Visit)蒙特卡洛策略评估:每次一个 (状态动作)对出现在一个 episode 中时,都会对其进行一次回报更新。

②首次访问(First-Visit)蒙特卡洛策略评估:在一个 episode 中,只对某个 (状态,动作) 对的首次访问进行回报更新。即在一个 episode 中,如果某个 (状态,动作) 对已经更新过,就不再更新。

Every-Visit 和 First-Visit 的对比

策略评估方法是否更新重复访问的状态数据量收敛速度适用场景
每次访问较快适用于频繁访问的状态,数据充分时
首次访问较慢适用于减少计算量和数据冗余的情况

2、visit定义

        对于从棋盘格中的一个位置出发,每一个状态-动作组成的一个元组称为一个visit,如(s1,a2),(s2,a4),(s1,a2)……,如此定义。

3、episode定义

        从一个位置出发,所有的visit组成一个episode,至于步数可以自己自行设置。

三、算法流程

四、代码演示

import numpy as np
import random
from collections import defaultdictclass BehrmanMC_EGreedy:# Attributesn, m = None, None  # Chessboard dimensionsxx, yy = [-1, 0, 1, 0, 0], [0, 1, 0, -1, 0]  # 动作(上、右、下、左、停留)s = "↑→↓←O"  # 动作符号_lambda = 0.9  # 折扣因子# 初始化棋盘格和策略chessboard = [["***"],["**#"],["#*x"]]policy = [[1, 3, 2],[2, 3, 3],[2, 2, 0]]states = NonePunishment = Nonedef __init__(self):self.n, self.m = len(self.chessboard), len(self.chessboard[0][0])self.init_matrix()self.returns = defaultdict(list)  # 用于记录每个 (状态, 动作) 对的累积回报self.Q = defaultdict(lambda: [0] * 5)  # 用来存储每个 (状态, 动作) 对的 Q 值def init_matrix(self):"""Initialize chessboard matrix, rewards, states, and policy."""self.chessboard = [list(row[0]) for row in self.chessboard]self.states = [[0] * self.m for _ in range(self.n)]self.Punishment = [[0 if cell == "*" else (-10 if cell == "#" else 1)for cell in row] for row in self.chessboard]def next_point(self, x, y, i):"""Calculate the next position coordinates, returns current position if out of bounds."""wall = 0nx, ny = x + self.xx[i], y + self.yy[i]if 0 <= nx < self.n and 0 <= ny < self.m:return nx, ny, wallelse:wall = 1return x, y, walldef action(self, x, y, i):"""Return reward for the given action."""next_pos = self.next_point(x, y, i)if next_pos[2] == 1:return -1  # 撞墙else:return self.Punishment[next_pos[0]][next_pos[1]]def generate_episode(self,x,y,action):"""Generate an episode using Exploring Starts."""episode = []for t in range(10):  # episode中visit的数量reward = self.action(x, y, action)episode.append(((x, y), action, reward))x, y, _ = self.next_point(x, y, action)return episodedef update_policy(self):"""Update Q values and policy based on episode results."""for x in range(self.n):for y in range(self.m):for z in range(5):episode_data = self.generate_episode(x,y,z)G = 0visited = set()# 使用首次访问for (x, y), action, reward in reversed(episode_data):G = self._lambda * G + rewardif (x, y, action) not in visited:  # Every-visit MC updateself.returns[(x, y, action)].append(G)self.Q[(x, y)][action] = np.mean(self.returns[(x, y, action)])visited.add((x, y, action))for (x, y) in self.Q.keys():best_action = np.argmax(self.Q[(x, y)])self.policy[x][y] = best_action  # 将策略更新为最佳动作def show_policy(self):"""Display the final policy matrix."""policy_display = "\n".join("\t".join(self.s[self.policy[x][y]] for y in range(self.m)) for x in range(self.n))print(policy_display)if __name__ == '__main__':behrman_mc = BehrmanMC_EGreedy()behrman_mc.update_policy()  # 实施MC Exploring Starts算法behrman_mc.show_policy()  # 输出最终策略

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/8060.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】解锁操作系统潜能,高效线程管理的实战技巧

目录 1. 线程的概念2. 线程的理解3. 地址空间和页表4. 线程的控制4.1. POSIX线程库4.2 线程创建 — pthread_create4.3. 获取线程ID — pthread_self4.4. 线程终止4.5. 线程等待 — pthread_join4.6. 线程分离 — pthread_detach 5. 线程的特点5.1. 优点5.2. 缺点5.3. 线程异常…

166页PDF | 埃森哲-XX集团企业架构数字化整体规划设计方案(限免下载)

一、前言 这份报告是埃森哲为XX集团制定的企业架构数字化整体规划设计方案&#xff0c;涵盖了业务、应用、数据、技术架构设计以及信息化管控体系的构建。报告详细分析了集团的信息化现状、面临的挑战&#xff0c;并提出了相应的战略目标和管理要求。同时&#xff0c;报告还规…

Linux -- 操作系统(软件)

目录 什么是操作系统&#xff1f; 计算机的层状结构 为什么要有操作系统 操作系统到底层硬件 驱动程序 操作系统如何管理硬件&#xff1f; 操作系统到用户 系统调用接口 库函数 回到问题 什么是操作系统&#xff1f; 操作系统&#xff08;Operating System&#xf…

python爬虫之JS逆向入门,了解JS逆向的原理及用法(18)

文章目录 1. JS逆向是什么?2、如何分析加密参数并还原其加密方式?2.1 分析JS加密的网页2.2 编写python代码还原JS加密代码3、案例测试4、操作进阶(通过执行第三方js文件实现逆向)4.1 python第三方模块(execjs)4.2 调用第三方js文件完成逆向操作4.3 总结1. JS逆向是什么?…

Spring Boot2(Spring Boot 的Web开发 springMVC 请求处理 参数绑定 常用注解 数据传递 文件上传)

SpringBoot的web开发 静态资源映射规则 总结&#xff1a;只要静态资源放在类路径下&#xff1a; called /static (or /public or /resources or //METAINF/resources 一启动服务器就能访问到静态资源文件 springboot只需要将图片放在 static 下 就可以被访问到了 总结&…

1、Qt6 Quick 简介

一、Qt6 Quick 简介 1、Qt Quick简介 Qt Quick 是 Qt 6 中使用的用户界面技术的总称。它是在 Qt 4 中引入的&#xff0c;现在在 Qt 6 中进行了扩展。Qt Quick 本身是几种技术的集合&#xff1a; QML——用户界面标记语言JavaScript - 动态脚本语言Qt C - 高度可移植的增强型…

element-plus按需引入报错Components is not a function

官网文档&#xff1a;快速开始 | Element Plus webpack配置 // webpack.config.js const AutoImport require(unplugin-auto-import/webpack) const Components require(unplugin-vue-components/webpack) const { ElementPlusResolver } require(unplugin-vue-components…

【AIGC】如何通过ChatGPT轻松制作个性化GPTs应用

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 &#x1f4af;前言&#x1f4af;什么是GPTsGPTs的工作原理GPTs的优势GPTs的应用前景总结 &#x1f4af;创建GPTS应用的基本流程进入GPTs创建界面方式一&#xff1a;按照引导完成生成创建GPTs方式二…

uniapp配置消息推送unipush 厂商推送设置配置 FCM 教程

说真的&#xff0c;这个 密钥文件 和 google-services.json 太难找了 现在 Firebase 已经不允许注册Cloud Messaging API (旧版)的密钥&#xff0c;所以下面这个官方的文档教程并不适用,但是大致位置可以参考 UniPush支持谷歌推送FCM配置指南 - DCloud问答 密钥文件 通过这里…

51单片机数字电子钟proteus仿真(数电课设,含时间显示、校准、整点报时、闹钟功能)

51单片机数字电子钟proteus仿真 由于学校实验课要求完成51单片机数字电子钟proteus仿真的实验&#xff0c;下面是经过一段时间的努力完成的学习成果。希望分享给有需要的人。 功能描述&#xff1a; 显示功能&#xff1a;可以显示时、分、秒&#xff08;基于1602液晶显示屏&…

Java8 新特性 —— Optional API 详解

本文涉及到的知识点有Lambda表达式&#xff0c;函数式接口以及Stream API&#xff0c;有不了解的小伙伴可以先学习前两篇文章&#xff1a; Java8 新特性 —— Lambda 表达式、函数接口以及方法引用详解 Java8 新特性 —— Stream API 详解 前言 Optional类是Java8新引进的一个…

深入理解Python设计模式:工厂模式实践与应用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

Windows系统安装部署C++基础开发环境

目录 前言安装MinGW-w64安装VSCode安装CMake完成 前言 这篇文章讨论一下Windows系统怎么安装部署C基础开发环境&#xff0c;你或许在想这还不简单吗&#xff0c;安装vs不就可以了吗&#xff0c;很对&#xff0c;可以在官网下载vs集成开发环境然后进行安装&#xff0c;这也是非…

Cisco ACI Leaf交换机导出show tech

cisco.com 文档描述操作如下&#xff1a; https://www.cisco.com/c/en/us/support/docs/cloud-systems-management/application-policy-infrastructure-controller-apic/214520-guide-to-collect-tech-support-and-tac-re.html#toc-hId–2125674131 Trigger via Switch CLI O…

基于matlab的人眼开度识别

我国已经成为世界汽车生产和制造大国&#xff0c;道路车辆的不断增加道路基础设施不断增强&#xff0c;但是随之而来的问题也日益严重&#xff0c;比如交通事故&#xff0c;噪声大气污染等。汽车行驶的安全性由于关乎人民生命安全&#xff0c;所以日益受到各国政府以及研究机构…

使用 Spring Boot 搭建 WebSocket 服务器实现多客户端连接

在 Web 开发中&#xff0c;WebSocket 为客户端和服务端之间提供了实时双向通信的能力。本篇博客介绍如何使用 Spring Boot 快速搭建一个 WebSocket 服务器&#xff0c;并支持多客户端的连接和消息广播。 1. WebSocket 简介 WebSocket 是 HTML5 的一种协议&#xff0c;提供了客…

详细分析Java8中的Duration时间类基本知识(附Demo)

目录 前言1. 基本知识2. Demo3. 拓展Demo 前言 基本的Java知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 1. 基本知识 Duration 类是 Ja…

Day14买卖股票的最佳时机

给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如…

【星闪EBM-H63开发板】小熊派的开发板实物

前几天介绍了&#xff0c;我参加了小熊派的星闪EBM-H63开发板内测活动。今天去快递站取回来开发板&#xff0c;让我们看看实物照片。 下面是开发板的正面照片&#xff0c;绿色的部分是核心板&#xff0c;蓝色的部分实际上是个底板&#xff0c;引出了串口的管脚&#xff0c;再加…

zookeeper的选举机制

zk中有两种角色&#xff1a;Leader 和 Fllower Leader是自己的集群各台电脑投票选举出来的。 事务&#xff1a;一通操作&#xff0c;要么同时成立&#xff0c;要么都不成立。 举例&#xff1a;Jack 和 Rose Rose 给 Jack&#xff08;小李子&#xff09; 转钱 Rose -100 J…