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

《Python实战进阶》No37: 强化学习入门:Q-Learning 与 DQN-加餐版1 Q-Learning算法可视化

在《Python实战进阶》No37: 强化学习入门:Q-Learning 与 DQN 这篇文章中,我们介绍了Q-Learning算法走出迷宫的代码实践,本文加餐,把Q-Learning算法通过代码可视化呈现。我尝试了使用Matplotlib实现,但局限于Matplotlib对动画不支持,做出来的仿动画太僵硬,所以使用 pygame 重新设计 Q-Learning 的可视化程序可以显著提升动画的流畅性和交互性。相比于 matplotlibpygame 更适合处理实时动画和游戏化的内容。以下是一个完整的基于 pygame 的实现方案,

视频:Q-Learning算法训练可视化


目标

  1. 迷宫布局:动态绘制迷宫(包括起点、终点和墙壁)。
  2. 智能体移动:实时更新智能体的位置。
  3. 最优路径:训练完成后显示从起点到终点的最优路径。
  4. 最终目标:完整呈现Q-Learning算法的训练过程。

实现步骤

步骤 1:安装依赖

确保安装了 pygame 库:

pip install pygame

步骤 2:修改迷宫环境

我们对迷宫环境进行一些扩展,以便更好地支持 pygame 可视化。

import numpy as npclass MazeEnv:def __init__(self):self.maze = [['.', '.', '.', '#', '.'],['.', '#', '.', '.', '.'],['.', '#', '.', '#', '.'],['.', '.', '.', '#', '.'],['.', '#', 'G', '#', '.']]self.maze = np.array(self.maze)self.start = (0, 0)self.goal = (4, 2)self.current_state = self.startself.actions = [(0, 1), (0, -1), (1, 0), (-1, 0)]  # 右、左、下、上def reset(self):self.current_state = self.startreturn self.current_statedef step(self, action):next_state = (self.current_state[0] + action[0], self.current_state[1] + action[1])if (next_state[0] < 0 or next_state[0] >= self.maze.shape[0] ornext_state[1] < 0 or next_state[1] >= self.maze.shape[1] orself.maze[next_state] == '#'):next_state = self.current_state  # 如果撞墙,保持原位置reward = -1  # 每步移动的默认奖励done = Falseif next_state == self.goal:reward = 10  # 到达终点的奖励done = Trueself.current_state = next_statereturn next_state, reward, donedef get_maze_size(self):return self.maze.shapedef is_wall(self, position):return self.maze[position] == '#'def is_goal(self, position):return position == self.goal

步骤 3:设计 pygame 可视化程序

以下是基于 pygame 的完整可视化代码:

import pygame
import time
import random
import numpy as np# 初始化 pygame
pygame.init()# 定义颜色
WHITE = (255, 255, 255)  # 空地
BLACK = (0, 0, 0)        # 墙壁
GREEN = (0, 255, 0)      # 终点
RED = (255, 0, 0)        # 智能体
BLUE = (0, 0, 255)       # 最优路径# 定义单元格大小
CELL_SIZE = 50
FPS = 10  # 动画帧率def visualize_with_pygame(env, agent, num_episodes=1000):rows, cols = env.get_maze_size()screen_width = cols * CELL_SIZEscreen_height = rows * CELL_SIZE# 初始化屏幕screen = pygame.display.set_mode((screen_width, screen_height))pygame.display.set_caption("Q-Learning Maze Visualization")clock = pygame.time.Clock()def draw_maze():for i in range(rows):for j in range(cols):rect = pygame.Rect(j * CELL_SIZE, i * CELL_SIZE, CELL_SIZE, CELL_SIZE)if env.is_wall((i, j)):pygame.draw.rect(screen, BLACK, rect)elif env.is_goal((i, j)):pygame.draw.rect(screen, GREEN, rect)else:pygame.draw.rect(screen, WHITE, rect)def draw_agent(position):x, y = positioncenter = (y * CELL_SIZE + CELL_SIZE // 2, x * CELL_SIZE + CELL_SIZE // 2)pygame.draw.circle(screen, RED, center, CELL_SIZE // 3)def draw_path(path):for (x, y) in path:rect = pygame.Rect(y * CELL_SIZE, x * CELL_SIZE, CELL_SIZE, CELL_SIZE)pygame.draw.rect(screen, BLUE, rect)# 训练过程可视化for episode in range(num_episodes):state = env.reset()done = Falsepath = [state]while not done:# 处理退出事件for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()return# 清屏并绘制迷宫screen.fill(WHITE)draw_maze()# 获取动作action = agent.get_action(state)next_state, reward, done = env.step(action)agent.update_q_table(state, action, reward, next_state)state = next_statepath.append(state)# 绘制智能体draw_agent(state)# 更新屏幕pygame.display.flip()clock.tick(FPS)if episode % 100 == 0:print(f"Episode {episode}: Training...")# 测试过程可视化state = env.reset()done = Falsepath = [state]while not done:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()returnscreen.fill(WHITE)draw_maze()action = agent.get_action(state)state, _, done = env.step(action)path.append(state)draw_agent(state)pygame.display.flip()clock.tick(FPS)# 显示最终路径screen.fill(WHITE)draw_maze()draw_path(path)pygame.display.flip()# 等待用户关闭窗口running = Truewhile running:for event in pygame.event.get():if event.type == pygame.QUIT:running = Falsepygame.quit()

步骤 4:集成到 Q-Learning 算法

pygame 可视化函数集成到 Q-Learning 的训练和测试过程中。

class QLearningAgent:def __init__(self, env, learning_rate=0.1, discount_factor=0.9, epsilon=0.1):self.env = envself.q_table = {}self.learning_rate = learning_rateself.discount_factor = discount_factorself.epsilon = epsilondef get_action(self, state):if random.uniform(0, 1) < self.epsilon:return random.choice(self.env.actions)  # 探索else:q_values = [self.get_q_value(state, action) for action in self.env.actions]return self.env.actions[np.argmax(q_values)]  # 贪婪策略def get_q_value(self, state, action):key = (state, action)return self.q_table.get(key, 0.0)def update_q_table(self, state, action, reward, next_state):old_q = self.get_q_value(state, action)max_next_q = max([self.get_q_value(next_state, a) for a in self.env.actions])new_q = old_q + self.learning_rate * (reward + self.discount_factor * max_next_q - old_q)self.q_table[(state, action)] = new_q

步骤 5:运行代码

创建迷宫环境和智能体,并运行训练和测试代码。

# 创建环境和智能体
env = MazeEnv()
agent = QLearningAgent(env)# 使用 pygame 可视化训练和测试
visualize_with_pygame(env, agent, num_episodes=1000)

效果

  1. 流畅的动画pygame 提供了高效的绘图性能,动画更加流畅。
  2. 实时更新:智能体的位置和路径会实时更新,清晰展示学习过程。
  3. 交互性:用户可以通过关闭窗口随时停止程序。

扩展功能

  1. 优化动画速度:通过调整 FPSclock.tick() 控制动画速度。
  2. 添加热力图:使用不同颜色表示 Q 值表的变化。
  3. 支持更大迷宫:通过缩放单元格大小(CELL_SIZE)适应更大迷宫。

通过以上方法,你可以实现一个高效且流畅的 Q-Learning 可视化程序!

相关文章:

《Python实战进阶》No37: 强化学习入门:Q-Learning 与 DQN-加餐版1 Q-Learning算法可视化

在《Python实战进阶》No37: 强化学习入门&#xff1a;Q-Learning 与 DQN 这篇文章中&#xff0c;我们介绍了Q-Learning算法走出迷宫的代码实践&#xff0c;本文加餐&#xff0c;把Q-Learning算法通过代码可视化呈现。我尝试了使用Matplotlib实现&#xff0c;但局限于Matplotli…...

将ZABBIX结合AI实现自动化运维

1. 执行摘要 评估将ZABBIX监控系统与人工智能&#xff08;AI&#xff09;相结合&#xff0c;以实现自动化IT运维的可行性。这种集成具有显著的潜力&#xff0c;能够提升IT运维的效率、可靠性和主动性。通过利用ZABBIX强大的监控和告警功能&#xff0c;以及AI在异常检测、根因分…...

Go 语言规范学习(2)

文章目录 VariablesTypesBoolean typesNumeric typesString typesArray typesSlice typesStruct typesPointer typesFunction typesInterface typesBasic interfacesEmbedded interfacesGeneral interfaces【泛型接口】Implementing an interface【实现一个接口】 Map typesCha…...

XCode中使用MonkeyDev开发iOS版的Comand-line Tool的daemon程序

前提条件&#xff1a;iphone手机越狱ios15&#xff0c;cydia/Sileo中安装好ssh&#xff0c;ldid等相关的常用插件 备注&#xff1a;如何iphone是ios15以下的越狱机&#xff0c;可直接看11步 1. 安装MonkeyDev sudo /bin/sh -c "$(curl -fsSL https://raw.githubusercon…...

Nodejs上传文件的问题

操作系统&#xff1a;window和linux都会遇到 软件环境&#xff1a;v20.10.0的Nodejs 1、前端代码如下&#xff1a; 2、后端Nodejs 2.1、注册接口 2.2、上传接口 其中memoryUpload方法代码如下&#xff1a; 3、用页面上传文件 查看具体报错原因&#xff1a; TypeError: sourc…...

SpringMVC 拦截器详解与实战

在 SpringMVC 框架中&#xff0c;拦截器&#xff08;Interceptor&#xff09;是一种强大的机制&#xff0c;它允许开发者在控制器方法执行前后进行拦截&#xff0c;从而实现诸如用户权限验证、日志记录、性能监控等各种功能。本文将深入探讨 SpringMVC 拦截器的相关知识&#x…...

5.3 MVVM模型

一、MVVM的基本概念 MVVM的基本概念&#xff1a;Model、View、ViewModel 组件职责示例内容Model封装业务数据User类&#xff0c;包含姓名、年龄属性View负责UI呈现XAML界面&#xff0c;包含数据绑定ViewModel连接View和Model&#xff0c;处理视图逻辑MainViewModel包含命令和…...

6、进程理论和简单进程创建

一、了解进程推荐看这个视频&#xff0c;很详细 1、概念 进程(Process)程序的运行过程&#xff0c;是系统进行资源分配和调度的独立单元程序的运行过程&#xff1a;多个不同程序 并发&#xff0c;同一个程序同时执行多个任务。 就需要很多资源来实现这个过程。 每个进程都有一…...

python面试-基础

Python 面试题&#xff1a;解释 filter 函数的工作原理 难度: ⭐⭐ 特点: filter 函数是 Python 内置的高阶函数&#xff0c;用于过滤序列中的元素。这道题考察面试者对函数式编程概念的理解以及对 filter 函数的实际应用能力。和 map 函数类似, Python 3 中的 filter 返回一…...

全分辨率免ROOT懒人精灵-自动化编程思维-设计思路-实战训练

全分辨率免ROOT懒人精灵-自动化编程思维-设计思路-实战训练 1.2025新版懒人精灵-实战红果搜索关键词刷视频&#xff1a;https://www.bilibili.com/video/BV1eK9kY7EWV 2.懒人精灵-全分辨率节点识别&#xff08;红果看广告领金币小实战&#xff09;&#xff1a;https://www.bili…...

前后端常见模型以及相关环境配置介绍

一、前端常见框架 Vue.js 特点&#xff1a;采用数据驱动的响应式编程&#xff0c;组件化的开发模式使得代码结构清晰&#xff0c;易于维护&#xff0c;且学习成本相对较低&#xff0c;适合初学者和快速迭代的项目。应用场景&#xff1a;广泛应用于各类 Web 应用开发&#xff…...

西电考研目前缺额专业,调剂助力上岸!

注意啦&#xff01;准备调剂的兄弟们看过来&#xff1a;今天带大家梳理【西电调剂】的相关内容。助力大家上岸西安电子科技大学研究生 调剂必须在短时间内迅速做出决策&#xff0c;收集信息、筛选院校、准备复试&#xff0c;每一个环节都容不得丝毫懈怠&#xff01;现在除了关注…...

英语四六级听力考试网络广播系统建设方案:助力大学英语四六级听力考试清晰度与可靠性升级

英语四六级听力考试网络广播系统建设方案&#xff1a;助力大学英语四六级听力考试清晰度与可靠性升级 北京海特伟业科技有限公司任洪卓发布于2025年3月26日 一、建设背景&#xff1a;听力考试的重要性与现有系统的痛点 英语四六级考试听力部分作为学生英语听力能力的直接检验…...

性能比拼: Rust vs C++

本内容是对知名性能评测博主 Anton Putra 1个月前 Rust vs C Performance 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 介绍 在本视频中&#xff0c;将对比 Rust 和 C。 会使用 Axum 框架的一个稍微改进的版本&#xff0c;该框架基于 Hyper 和 Tokio 运行时&am…...

b站视频提取mp4方案

引言 对于b站视频&#xff0c;有些视频是不能提取字幕的&#xff0c;所以我们想把对应的视频下载下来&#xff0c;然后进行对应的本地处理&#xff0c;获得所需的自由处理&#xff0c;吞食视频。 整体思路 下载b站客户端 ----> 把缓存路径修改------> 下载所需视频---…...

PyQt6实例_批量下载pdf工具_exe使用方法

目录 前置&#xff1a; 工具使用方法&#xff1a; step one 获取工具 step two 安装 step three 使用 step four 卸载 链接 前置&#xff1a; 1 批量下载pdf工具是基于博文 python_巨潮年报pdf下载-CSDN博客 &#xff0c;将这个需求创建成界面应用&#xff0c;达到可…...

【java笔记】泛型、包装类、自动装箱拆箱与缓存机制

一、泛型&#xff1a;类型安全的基石 1. 泛型的本质与原理 Java 泛型&#xff08;Generics&#xff09;是 JDK 5 引入的特性&#xff0c;通过类型参数化实现代码的通用性。泛型类、接口和方法允许在定义时声明类型参数&#xff08;如 T、E、K、V&#xff09;&#xff0c;这些…...

计算机网络——传输层(TCP)

传输层 在计算机网络中&#xff0c;传输层是将数据向上向下传输的一个重要的层面&#xff0c;其中传输层中有两个协议&#xff0c;TCP&#xff0c;UDP 这两个协议。 TCP 话不多说&#xff0c;我们直接来看协议报头。 源/目的端口号&#xff1a;表示数据从哪个进程来&#xff0…...

Go 语言规范学习(1)

文章目录 IntroductionNotation示例&#xff08;Go 语言的 if 语句&#xff09;&#xff1a; Source code representationCharacters例子&#xff1a;变量名可以是中文 Letters and digits Lexical elementsCommentsTokensSemicolons例子&#xff1a;查看程序所有的token Ident…...

深入理解椭圆曲线密码学(ECC)与区块链加密

椭圆曲线密码学&#xff08;ECC&#xff09;在现代加密技术中扮演着至关重要的角色&#xff0c;广泛应用于区块链、数字货币、数字签名等领域。由于其在提供高安全性和高效率上的优势&#xff0c;椭圆曲线密码学成为了数字加密的核心技术之一。本文将详细介绍椭圆曲线的基本原理…...

nginx优化(持续更新!!!)

1.调整文件描述符 # 查看当前系统文件描述符限制 ulimit -n# 永久修改文件描述符限制 # 编辑 /etc/security/limits.conf 文件&#xff0c;添加以下内容 * soft nofile 65535 * hard nofile 65535# 编辑 /etc/sysctl.conf 文件&#xff0c;添加以下内容 fs.file-max 655352.调…...

ARCGIS PRO SDK 创建右键菜单

ArcGIS Pro SDK中的弹出式右键菜单常见的在地图视图、布局视图、文件目录等地方&#xff0c;随便右键点击某个文件、要素、要素类&#xff0c;一般都会弹出一个右键菜单。 操作对象右键菜单 refID要素图层esri_mapping_layerContextMenushp图层esri_mapping_unregisteredLaye…...

编译原理——LR分析

文章目录 LR分析概述一、LR分析概述二、LR(0)分析概述&#xff08;一&#xff09;可归前缀和子前缀&#xff08;二&#xff09;识别活前缀的有限自动机&#xff08;三&#xff09;活前缀及可归前缀的一般计算方法&#xff08;四&#xff09;LR(0)项目集规范族的构造 三、SLR(1)…...

css100个问题

一、基础概念 CSS的全称及作用是什么&#xff1f;行内样式、内部样式表、外部样式表的优先级&#xff1f;解释CSS的层叠性&#xff08;Cascading&#xff09;CSS选择器优先级计算规则伪类与伪元素的区别&#xff1f;举例说明!important的作用及使用注意事项如何继承父元素字体…...

js文字两端对齐

目录 一、问题 二、原因及解决方法 三、总结 一、问题 1.text-align: justify; 不就可以了吗&#xff1f;但是实际测试无效 二、原因及解决方法 1.原因&#xff1a;text-align只对非最后一行文字有效。只有一行文字时&#xff0c;text-align无效&#xff0c;要用text-alig…...

Java-面向对象-多态和抽象类

目录 什么是多态&#xff1f; 多态的优点 多态存在的三个必要条件 虚函数 重写 多态的实现方式 什么是抽象类&#xff1f; 继承抽象类 实现抽象方法 抽象类总结 什么是多态&#xff1f; 多态就是一个行为具有多种不同的表现形式。 举例&#xff1a; 我们按下 F1 键…...

前端性能优化:深入解析哈希算法与TypeScript实践

/ 示例&#xff1a;开放寻址哈希表核心实现 class OpenAddressingHashTable<T> {private size: number;private keys: (string | null)[];private values: (T | null)[];private tombstone Symbol(Deleted);constructor(size: number 53) {this.size size;this.keys …...

车架号查询车牌号接口如何用Java对接

一、什么是车架号查询车牌号接口&#xff1f; 车架号查询车牌号接口&#xff0c;即传入车架号&#xff0c;返回车牌号、车型编码、初次登记日期信息。车架号又称车辆VIN码&#xff0c;车辆识别码。 二、如何用Java对接该接口&#xff1f; 下面我们以阿里云接口为例&#xff0…...

linux input子系统深度剖析

input 就是输入的意思&#xff0c;因此 input 子系统就是管理输入的子系统&#xff0c;和 pinctrl 、 gpio 子系统 一样&#xff0c;都是 Linux 内核针对某一类设备而创建的框架。比如按键输入、键盘、鼠标、触摸屏等 等这些都属于输入设备&#xff0c;不同的输入设备…...

香蕉派 BPI-CM6 工业级核心板采用进迭时空K1 8核 RISC-V 芯片开发

BPI-CM6 产品介绍 香蕉派BPI-CM6是一款工业级RISC-V核心板&#xff0c;它采用SpacemiT K1 8核RISC-V芯片设计&#xff0c;CPU集成2.0 TOPs AI计算能力。8/16G DDR和8/16/32/128G eMMC。设计了板对板连接器&#xff0c;以增强稳定性&#xff0c;与树莓派CM4尺寸相同&#xff0c…...

9.4分漏洞!Next.js Middleware鉴权绕过漏洞安全风险通告

今日&#xff0c;亚信安全CERT监控到安全社区研究人员发布安全通告&#xff0c;Next.js 存在一个授权绕过漏洞&#xff0c;编号为 CVE-2025-29927。攻击者可能通过发送精心构造的 x-middleware-subrequest 请求头绕过中间件安全控制&#xff0c;从而在未授权的情况下访问受保护…...

【Unity3D实现UI轮播效果】

系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、效果展示👉二、实现步骤👉2-1、搭建UI👉2-2、代码实现👉2-3、代码挂载使用👉三、扩展实现👉壁纸分享👉总结👉前言 功能需求如图所示,点击下一个按钮,所有卡片向右滚动,其中最后一张需要变更…...

谈谈 Webpack 中的 Loader 和 Plugin,它们的区别是什么?

Webpack Loader与Plugin深度解析 作为前端工程化的核心工具&#xff0c;Webpack的Loader和Plugin机制是其强大扩展能力的基石。 理解它们的差异和适用场景&#xff0c;是构建高效打包体系的关键。 我们将从底层原理到实际应用&#xff0c;深入剖析两者的区别。 核心概念对比…...

C#单例模式

单例模式 (Singleton),保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。通常我们可以让一个全局变量使得一个对象被访问&#xff0c;但它不能防止你实例化对个对象&#xff0c;一个最好的办法就是&#xff0c;让类自身负责保护它的唯一实例。这个类可以保证没…...

Oracle 数据库通过exp/imp工具迁移指定数据表

项目需求&#xff1a;从prod数据库迁移和复制2个表(BANK_STATE&#xff0c;HBS)的数据到uat数据库环境。 数据库版本&#xff1a;Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 迁移工具&#xff1a;客户端exp/imp工具 -- 执行命令 从Prod数据库导出数据exp us…...

MongoDB 与 Elasticsearch 使用场景区别及示例

一、核心定位差异 ‌MongoDB‌ ‌定位‌&#xff1a;通用型文档数据库&#xff0c;侧重数据的存储、事务管理及结构化查询&#xff0c;支持 ACID 事务‌。‌典型场景‌&#xff1a; 动态数据结构存储&#xff08;如用户信息、商品详情&#xff09;‌。需事务支持的场景&#xf…...

PyTorch生成式人工智能实战:从零打造创意引擎

PyTorch生成式人工智能实战&#xff1a;从零打造创意引擎 0. 前言1. 生成式人工智能1.1 生成式人工智能简介1.2 生成式人工智能技术 2. Python 与 PyTorch2.1 Python 编程语言2.2 PyTorch 深度学习库 3. 生成对抗网络3.1 生成对抗网络概述3.2 生成对抗网络应用 4. Transformer4…...

蓝桥杯高频考点——二分(含C++源码)

二分 基本框架整数查找&#xff08;序列二分的模版题 建议先做&#xff09;满分代码及思路solution 子串简写满分代码及思路solution 1&#xff08;暴力 模拟双指针70分&#xff09;solution 2&#xff08;二分 AC&#xff09; 管道满分代码及思路样例解释与思路分析solution 最…...

VUE3项目VITE打包优化

VUE3项目VITE打包优化 代码加密依赖配置效果对比图 自动导入依赖配置 代码压缩依赖配置效果对比图 图片压缩依赖配置效果对比图 字体压缩总结与实践运用效果 代码加密 依赖 npm install -D vite-plugin-bundle-obfuscator配置 import vitePluginBundleObfuscator from "…...

IP 分片重组与 TCP 会话重组

1. IP 分片重组&#xff08;IP Fragmentation & Reassembly&#xff09; &#xff08;1&#xff09;分片原因 当 IP 数据包长度超过 MTU&#xff08;Maximum Transmission Unit&#xff09;&#xff08;如以太网默认 1500 字节&#xff09;时&#xff0c;路由器或发送端会…...

《Python实战进阶》No34:卷积神经网络(CNN)图像分类实战

第34集&#xff1a;卷积神经网络&#xff08;CNN&#xff09;图像分类实战 摘要 卷积神经网络&#xff08;CNN&#xff09;是计算机视觉领域的核心技术&#xff0c;特别擅长处理图像分类任务。本集将深入讲解 CNN 的核心组件&#xff08;卷积层、池化层、全连接层&#xff09;…...

【Django】教程-1-安装+创建项目+目录结构介绍

欢迎关注我&#xff01;后续会更新django教程。一周2-3更&#xff0c;欢迎跟进&#xff0c;本周会更新第一个Demo的单独一个模块的增删改查【Django】教程-4-一个增删改查的Demo【Django】教程-2-前端-目录结构介绍【Django】教程-3-数据库相关介绍 1.项目创建 1.1 安装 Djan…...

力扣DAY29 | 热100 | 删除链表的倒数第N个结点

前言 中等 √ 链表心得&#xff1a;考虑好边界情况。 题目 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#…...

渗透测试过-关于学习Token、JWT、Cookie等验证授权方式的总结

关于学习Token、JWT、Cookie等验证授权方式的总结 目录 一、为什么Cookie无法防止CSRF攻击&#xff0c;而Token可以&#xff1f; 二、为什么无论采用Cookie-session的方式&#xff0c;还是Token&#xff08;JWT&#xff09;的方式&#xff0c;在一个浏览器里&#xff0c;同一个…...

C#从入门到精通(3)

目录 第九章 窗体 &#xff08;1&#xff09;From窗体 &#xff08;2&#xff09;MDI窗体 &#xff08;3&#xff09;继承窗体 第十章 控件 &#xff08;1&#xff09;控件常用操作 &#xff08;2&#xff09;Label控件 &#xff08;3&#xff09;Button控件 &…...

greenhill编译出现:3201原因错误

ecom800: 21Mar25 16:26:45.609351: No licenses available for ecom800 Reason: ecom800 (3201): The License Manager cannot be contacted. 解决方式&#xff1a;重新加载lincese驱动。 检查是否安装正确: 检查驱动是否正确识别&#xff1a; 以上检查都正常&#xff0c…...

Docker 快速入门指南

Docker 快速入门指南 1. Docker 常用指令 Docker 是一个轻量级的容器化平台&#xff0c;可以帮助开发者快速构建、测试和部署应用程序。以下是一些常用的 Docker 命令。 1.1 镜像管理 # 搜索镜像 docker search <image_name># 拉取镜像 docker pull <image_name>…...

RISC-V AIA学习2---IMSIC

我在学习文档这章时&#xff0c;对技术术语不太理解&#xff0c;所以用比较恰当的比喻来让自己更好的理解。 比较通俗的理解&#xff1a; 将 RISC-V 系统比作一个工厂&#xff1a; hart → 工厂的一条独立生产线IMSIC → 每条生产线配备的「订单接收员」MSI 中断 → 客户通过…...

C#基础学习(五)函数中的ref和out

1. 引言&#xff1a;为什么需要ref和out&#xff1f; ​问题背景&#xff1a;函数参数默认按值传递&#xff0c;值类型在函数内修改不影响外部变量&#xff1b;引用类型重新赋值时外部对象不变。​核心作用&#xff1a;允许函数内部修改外部变量的值&#xff0c;实现“双向传参…...

【每日算法】Day 9-1:贪心算法精讲——区间调度与最优选择(C++实现)

掌握高效决策的核心思想&#xff01;今日深入解析贪心算法的底层逻辑&#xff0c;聚焦区间调度与最优选择两大高频场景&#xff0c;结合大厂真题与严谨证明&#xff0c;彻底掌握“局部最优即全局最优”的算法哲学。 一、贪心算法核心思想 贪心算法&#xff08;Greedy Algorit…...