当前位置: 首页 > news >正文

【URL】一个简单基于Gym的2D随机游走环境,用于无监督强化学习(URL)

import gym
from gym import spaces
import numpy as np
import pygameclass RandomWalk2DEnv(gym.Env):def __init__(self):super(RandomWalk2DEnv, self).__init__()# 定义状态空间为2D坐标(x, y)self.x_min, self.x_max = -10, 10  # 更新尺寸为 (-10, 10)self.y_min, self.y_max = -10, 10  # 更新尺寸为 (-10, 10)self.observation_space = spaces.Box(np.array([self.x_min, self.y_min]),np.array([self.x_max, self.y_max]),dtype=np.float32)# 动作空间定义为2D向量,x和y分量的范围为(-1, 1)self.action_space = spaces.Box(np.array([-1.0, -1.0]), np.array([1.0, 1.0]), dtype=np.float32)# 初始化状态self.state = np.array([0.0, 0.0])# 初始化步长(每次移动的距离)self.step_size = 1.0# 初始化pygamepygame.init()# 设置窗口self.screen_size = (800, 800)self.screen = pygame.display.set_mode(self.screen_size)pygame.display.set_caption("Random Walk 2D")# 坐标转换,将-10到10的坐标映射到屏幕的像素坐标self.scale = 40  # 缩放因子,决定每个单位坐标对应多少像素self.origin = np.array([self.x_max, self.y_max])  # 原点在右上角# 路径记录self.path_x = []self.path_y = []def reset(self):# 将智能体重置到原点 (0, 0)self.state = np.array([0.0, 0.0])self.path_x = [self.state[0]]  # 重置路径记录self.path_y = [self.state[1]]  # 重置路径记录return self.statedef step(self, action):# 自动修正超出范围的actionaction = np.clip(action, -1.0, 1.0)# 根据动作更新坐标dx = action[0] * self.step_size  # x方向的移动dy = action[1] * self.step_size  # y方向的移动self.state[0] += dxself.state[1] += dy# 保证坐标不超出边界self.state[0] = np.clip(self.state[0], self.x_min, self.x_max)self.state[1] = np.clip(self.state[1], self.y_min, self.y_max)# 判断是否触及边缘,如果触及边缘,设置done为Truedone = Falseif self.state[0] == self.x_min or self.state[0] == self.x_max or self.state[1] == self.y_min or self.state[1] == self.y_max:done = True# 记录路径self.path_x.append(self.state[0])self.path_y.append(self.state[1])# 计算奖励:简单的奖励策略,离中心越远奖励越低distance_from_center = np.linalg.norm(self.state)reward = -distance_from_center  # 离原点越远,奖励越低return self.state, reward, done, {}def render(self, mode='human'):# 清空屏幕self.screen.fill((255, 255, 255))  # 白色背景# 绘制虚线表格self.draw_grid()# 绘制路径(红色线条)for i in range(len(self.path_x) - 1):x1 = int(self.path_x[i] * self.scale + self.screen_size[0] // 2)y1 = int(self.screen_size[1] // 2 - self.path_y[i] * self.scale)x2 = int(self.path_x[i + 1] * self.scale + self.screen_size[0] // 2)y2 = int(self.screen_size[1] // 2 - self.path_y[i + 1] * self.scale)pygame.draw.line(self.screen, (255, 0, 0), (x1, y1), (x2, y2), 2)  # 红色轨迹# 绘制起始点(蓝色圆点)start_x = int(self.path_x[0] * self.scale + self.screen_size[0] // 2)start_y = int(self.screen_size[1] // 2 - self.path_y[0] * self.scale)pygame.draw.circle(self.screen, (0, 0, 255), (start_x, start_y), 5)  # 蓝色圆点# 绘制当前智能体位置(黑色小圆点,半径为蓝色起点圆点的2/3)current_x = int(self.state[0] * self.scale + self.screen_size[0] // 2)current_y = int(self.screen_size[1] // 2 - self.state[1] * self.scale)pygame.draw.circle(self.screen, (0, 0, 0), (current_x, current_y), 3)  # 黑色圆点,半径为5的2/3# 刷新屏幕pygame.display.flip()# 处理事件,避免程序卡死for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()exit()def draw_grid(self):""" 绘制虚线网格,中心位置为实线 """# 设置线条颜色和宽度line_color = (200, 200, 200)  # 灰色center_line_color = (0, 0, 0)  # 中心线为黑色line_width = 1dash_length = 10  # 虚线的每段长度dash_gap = 5  # 虚线的间隔# 绘制垂直线for x in range(self.x_min, self.x_max + 1):x_pos = int(x * self.scale + self.screen_size[0] // 2)for y in range(self.y_min, self.y_max + 1):y_pos = int(self.screen_size[1] // 2 - y * self.scale)# 绘制最中间的线(交叉点处)if x == 0:pygame.draw.line(self.screen, center_line_color,(x_pos, self.screen_size[1] // 2 - self.y_max * self.scale),(x_pos, self.screen_size[1] // 2 + self.y_max * self.scale), line_width)elif y == 0:pygame.draw.line(self.screen, center_line_color,(self.screen_size[0] // 2 - self.x_max * self.scale, y_pos),(self.screen_size[0] // 2 + self.x_max * self.scale, y_pos), line_width)# 绘制垂直虚线elif x % 2 == 0:self.draw_dashed_line(x_pos, self.screen_size[1] // 2 - self.y_max * self.scale,x_pos, self.screen_size[1] // 2 + self.y_max * self.scale,line_color, dash_length, dash_gap)# 绘制水平虚线elif y % 2 == 0:self.draw_dashed_line(self.screen_size[0] // 2 - self.x_max * self.scale, y_pos,self.screen_size[0] // 2 + self.x_max * self.scale, y_pos,line_color, dash_length, dash_gap)def draw_dashed_line(self, x1, y1, x2, y2, color, dash_length, dash_gap):""" 绘制虚线 """total_length = np.linalg.norm([x2 - x1, y2 - y1])num_dashes = int(total_length / (dash_length + dash_gap))# 计算每段虚线的起始和结束点for i in range(num_dashes):start_x = x1 + (x2 - x1) * (i * (dash_length + dash_gap)) / total_lengthstart_y = y1 + (y2 - y1) * (i * (dash_length + dash_gap)) / total_lengthend_x = x1 + (x2 - x1) * ((i * (dash_length + dash_gap) + dash_length) / total_length)end_y = y1 + (y2 - y1) * ((i * (dash_length + dash_gap) + dash_length) / total_length)# 绘制虚线段pygame.draw.line(self.screen, color, (start_x, start_y), (end_x, end_y), 1)# 测试代码
if __name__ == "__main__":env = RandomWalk2DEnv()env.reset()for _ in range(50):action = env.action_space.sample()  # 采样一个动作(x 和 y 分量在 -1 到 1 之间)state, reward, done, info = env.step(action)env.render()if done:print("智能体触及边缘,回合结束")break

在这里插入图片描述

相关文章:

【URL】一个简单基于Gym的2D随机游走环境,用于无监督强化学习(URL)

import gym from gym import spaces import numpy as np import pygameclass RandomWalk2DEnv(gym.Env):def __init__(self):super(RandomWalk2DEnv, self).__init__()# 定义状态空间为2D坐标(x, y)self.x_min, self.x_max -10, 10 # 更新尺寸为 (-10,…...

【VM】VirtualBox安装ubuntu22.04虚拟机

阅读本文之前,请先根据 安装virtualbox 教程安装virtulbox虚拟机软件。 1.下载Ubuntu系统镜像 打开阿里云的镜像站点:https://developer.aliyun.com/mirror/ 找到如图所示位置,选择Ubuntu 22.04.3(destop-amd64)系统 Ubuntu 22.04.3(desto…...

MySQL的GROUP BY与COUNT()函数的使用问题

在MySQL中,GROUP BY和 COUNT()函数是数据聚合查询中非常重要的工具。正确使用它们可以有效地统计和分析数据。然而,不当的使用可能会导致查询结果不准确或性能低下。本文将详细讨论 GROUP BY和 COUNT()函数的使用方法及常见问题,并提供相应的…...

C# 精炼题18道题(类,三木运算,Switch,计算器)

1.数组元素和 2.数组元素乘积 3.数组元素平均数 4.数组中最大值 5.数组中的偶数 6.数组中的阶乘 7.数组反转 8.字符串反转 9.回文字符串 10.检查回文 11.最小最大值 12.找素数 13.字符串中的最长无重复字符串 14.字符串去重 15.数组中计算两数之和 16.数字到字符…...

96,【4】 buuctf web [BJDCTF2020]EzPHP

进入靶场 查看源代码 GFXEIM3YFZYGQ4A 一看就是编码后的 1nD3x.php 访问 得到源代码 <?php // 高亮显示当前 PHP 文件的源代码&#xff0c;用于调试或展示代码结构 highlight_file(__FILE__); // 关闭所有 PHP 错误报告&#xff0c;防止错误信息泄露可能的安全漏洞 erro…...

数据库 - Sqlserver - SQLEXPRESS、由Windows认证改为SQL Server Express认证进行连接 (sa登录)

本文讲SqlServer Express版本在登录的时候&#xff0c; 如何由Windows认证&#xff0c;修改为Sql Server Express认证。 目录 1&#xff0c;SqlServer Express的Windows认证 2&#xff0c;修改为混合认证 3&#xff0c;启用sa 用户 4&#xff0c;用sa 用户登录 下面是详细…...

2025年02月02日Github流行趋势

项目名称&#xff1a;oumi 项目地址url&#xff1a;https://github.com/oumi-ai/oumi 项目语言&#xff1a;Python 历史star数&#xff1a;1416 今日star数&#xff1a;205 项目维护者&#xff1a;xrdaukar, oelachqar, taenin, wizeng23, kaisopos 项目简介&#xff1a;构建最…...

【数据分析】案例03:当当网近30日热销图书的数据采集与可视化分析(scrapy+openpyxl+matplotlib)

当当网近30日热销图书的数据采集与可视化分析(scrapy+openpyxl+matplotlib) 当当网近30日热销书籍官网写在前面 实验目的:实现当当网近30日热销图书的数据采集与可视化分析。 电脑系统:Windows 使用软件:Visual Studio Code Python版本:python 3.12.4 技术需求:scrapy、…...

如何使用 DeepSeek 和 Dexscreener 构建免费的 AI 加密交易机器人?

我使用DeepSeek AI和Dexscreener API构建的一个简单的 AI 加密交易机器人实现了这一目标。在本文中&#xff0c;我将逐步指导您如何构建像我一样的机器人。 DeepSeek 最近发布了R1&#xff0c;这是一种先进的 AI 模型。您可以将其视为 ChatGPT 的免费开源版本&#xff0c;但增加…...

buu-jarvisoj_level0-好久不见30

嘶&#xff0c;我咋觉得这个也是栈溢出呢&#xff0c;找到读取的值&#xff0c;在再找到后门函数...

深度学习查漏补缺:1.梯度消失、梯度爆炸和残差块

一、梯度消失 梯度消失的根本原因在于 激活函数的性质和链式法则的计算&#xff1a; 激活函数的导数很小&#xff1a; 常见的激活函数&#xff08;例如 Sigmoid 和 Tanh&#xff09;在输入较大或较小时&#xff0c;输出趋于饱和&#xff08;Sigmoid 的输出趋于 0 或 1&#xf…...

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.2 多维数组切片:跨步访问与内存布局

2.2 多维数组切片&#xff1a;跨步访问与内存布局 目录/提纲 #mermaid-svg-FbBIOMVivQfdX2LJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FbBIOMVivQfdX2LJ .error-icon{fill:#552222;}#mermaid-svg-FbBIOMVivQ…...

ResNet--深度学习中的革命性网络架构

一、引言 在深度学习的研究和应用中&#xff0c;网络架构的设计始终是一个关键话题。随着计算能力和大数据的不断提升&#xff0c;深度神经网络逐渐成为解决复杂任务的主流方法。然而&#xff0c;随着网络层数的增加&#xff0c;训练深度神经网络往往面临梯度消失或梯度爆炸的…...

TypeScript语言的语法糖

TypeScript语言的语法糖 TypeScript作为一种由微软开发的开源编程语言&#xff0c;它在JavaScript的基础上添加了一些强类型的特性&#xff0c;使得开发者能够更好地进行大型应用程序的构建和维护。在TypeScript中&#xff0c;不仅包含了静态类型、接口、枚举等强大的特性&…...

17.2 图形绘制4

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 17.2.5 线条样式 C#为画笔绘制线段提供了多种样式&#xff1a;一是线帽&#xff08;包括起点和终点处&#xff09;样式&#xff1b…...

tomcat核心组件及原理概述

目录 1. tomcat概述 1.1 概念 1.2 官网地址 2. 基本使用 2.1下载 3. 整体架构 3.1 核心组件 3.2 从web.xml配置和模块对应角度 3.3 如何处理请求 4. 配置JVM参数 5. 附录 1. tomcat概述 1.1 概念 什么是tomcat Tomcat是一个开源、免费、轻量级的Web服务器。 Tomca…...

本地部署DeepSeek教程(Mac版本)

第一步、下载 Ollama 官网地址&#xff1a;Ollama 点击 Download 下载 我这里是 macOS 环境 以 macOS 环境为主 下载完成后是一个压缩包&#xff0c;双击解压之后移到应用程序&#xff1a; 打开后会提示你到命令行中运行一下命令&#xff0c;附上截图&#xff1a; 若遇…...

MyBatis-Plus笔记-快速入门

大家在日常开发中应该能发现&#xff0c;单表的CRUD功能代码重复度很高&#xff0c;也没有什么难度。而这部分代码量往往比较大&#xff0c;开发起来比较费时。 因此&#xff0c;目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是…...

爬取豆瓣书籍数据

# 1. 导入库包 import requests from lxml import etree from time import sleep import os import pandas as pd import reBOOKS [] IMGURLS []# 2. 获取网页源代码 def get_html(url):headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36…...

基于微信小程序的电子商城购物系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...