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

庙算兵棋推演AI开发初探(6-神经网络开发)

碎碎念:

老师让我和同学组队参加10月底截止报名的庙算比赛,我俩走运进了64强,打的过程中发现了一个重要问题——为什么别人总能打我,但是我都看不见!就像玩dota被对面英雄莫名其妙单杀了但是他就一直隐身我都不知道怎么死的。还一个就是,步兵在这里非常厉害,在一个地方趴窝除了火炮集火,就像一个魔免英雄,坦克战车来了只能被步兵干死。

这些都源于一张规则表,但是打起来很离谱——环境和距离视野卡对了,这和不会玩的就是两个游戏!

(碎碎念,这个游戏移动过程中都没法更改目标位置,比星际魔兽操控起来死板,而且停止和冷却的cd太长了,75秒和120秒!什么RTS也不会设这么长的冷却时间……只能说这是一个不好玩的游戏)

——2024.12以上


一、神经网络简介

本质:不断求导找拟合,使得loss收敛,使得acc预测准确率变高

用法:编码映射到标签

结构:层级输入输出、loss函数设计、优化器

二、兵棋神经网络设计

参考alphaStar的星际2的监督学习-强化学习的构建道路,同时他们有强大算力来搞大规模的“联盟对抗”(不断的自己对战自己,利用强化学习然后挑选出更好的智能体)

1.明确实现目标

普通人都能叨叨两句“用AI就能实现”,“人工智能经过训练就可以实现”……这些都是不负责任的随口乱说,我十分讨厌这种空架子(好像当初我本科毕设就是讨厌空架子写的嗅图狗来帮我识图),我们得明确我们的任务是什么!

任务:经过挑选的样本的训练,得到可以准确预测敌方兵力运动方向的神经网络。(这一步还没到可以进行对战的智能体呢!)

2.明确输出、输入,构建数据集

既然输出是预测方位,那就按六边形构建行为空间

兵棋是六边形的格子,每个格子有6个临边。

定义:0~5,0是正右侧,按逆时针递进,加上原地不同作为6

行为空间是[0,6],即0123456共7个行为空间。

于是输出是一个动作向量,长度为7,分别代表7个行动的概率。

有因果关系的输入,我们可以定义各种行为作为输入

比如其他兵力的位置、兵力的血量状态、位置所处的地形……

位置是一个n*m的矩阵,可以作为一个张量输入

血量可以定义为离散的1、2、3、4,作为向量输入

……

最后将这些离散的状态组合到一起,变成一个大张量作为输入

3.数学理论基础

神经网络的数学原理本质上是一个非线性函数逼近器,它通过层层线性变换+非线性激活函数来学习数据中的复杂关系。

为什么神经网络能拟合复杂函数?

  • 线性变换+非线性激活:单独的线性变换无法拟合复杂数据,但非线性激活函数(如 ReLU、Sigmoid)允许网络学到更复杂的映射。

  • 通用逼近定理(Universal Approximation Theorem):只要有足够的隐藏层和神经元,神经网络可以逼近任意连续函数。

完整的神经网络训练过程:

  1. 前向传播:计算神经网络输出(经过各个节点的函数得到最后的输出)

  2. 计算损失:衡量误差(预测值、真实值之间的差距,评估方式不同loss函数也可以不同)

  3. 反向传播:计算梯度( 用链式法则(Chain Rule)传播误差,从输出层向输入层更新权重)

  4. 梯度下降更新权重

  5. 重复迭代,直到收敛

常见的神经网络的不同架构(Architecture):

  • MLP(多层感知机):如果输入足够丰富(如历史轨迹、环境状态),MLP 也能拟合出未来轨迹的函数关系。

  • RNN / LSTM / GRU:这些模型可以记住过去的信息,从而学会时间序列的依赖关系,对短期轨迹预测效果更好。

  • CNN(卷积神经网络):如果数据是空间+时间序列(如战场局势随时间变化的热力图),CNN 也可以提取空间特征并用于未来位置预测。

三、编码及实践

1.onehot编码(独热编码)

对于离散的无关的,使用onehot编码。这里采用的都是没有前后关系的离散数据,于是就用0和1来表示一切的独热编码作为编码。

2.将数据转化为编码

.举一个简单的例子,将json中的占领状态定义成离散的四种独热编码(两个点的,所以是4位长度)

# eg. [1, 0, 1, 0]
def get_city_states(stepData):"""获取夺控点状态信息:param stepData: 样本中一帧的数据:return:  夺控点信息   2个夺控点共4个值 每两位对应一个夺控点, 如果红色方占领则10, 蓝色方01, 未占领00"""cities = stepData['cities'] # [{'coord': 3636, 'value': 80, 'flag': -1, 'name': '主要夺控点'}, {'coord': 3739, 'value': 50, 'flag': -1, 'name': '次要夺控点'}]cities_info = [0] * 4 # [0, 0, 0, 0]num = 0for loc in cities:if loc['flag'] == -1: # 未占领cities_info[num:num + 2] = [0, 0]elif loc['flag'] == 0: # 红方占领cities_info[num:num + 2] = [1, 0]else: # 蓝方占领cities_info[num:num + 2] = [0, 1]num += 2# print(cities_info) # eg. [1, 0, 1, 0]return cities_info

将1-1800的连续值,变成5位的离散01独热编码。 (这里展示的是利用np.hstack(np.eye(n)函数创建n阶单位矩阵,np.eye(5)[m]是提取出矩阵中的第m行)

 cur_stage = np.hstack(np.eye(5)[int(cur_step / 400)]) # eg. [0. 1. 0. 0. 0.]

还一种,选取第m行的单位阵的值,这个方法速度上经试验与上述方法一样高效,更规范不容易出错。

def OneHotcode(self,curdata,list):onehot_encoded = [0]*len(list)if curdata in list:onehot_encoded[list.index(curdata)] = 1else:onehot_encoded = [-1] * len(list)return onehot_encodedOneHotcode(m, [x for x in range(0, 5)])

深度学习与传统特征工程的主要区别在于特征提取方式的不同。传统特征工程依赖人为经验,从数据中筛选出关键特征并输入数学模型以进行预测;而深度学习则由神经网络直接从原始数据中自动提取模式,并将其应用于新的数据,以得出预测结果。

在很多情况下,数据可能表面上看似无规律,但实际上隐藏着深层结构,神经网络可能能够提取出这些模式。如果数据中隐藏着某种模式,即使是复杂的、微弱的或者掺杂噪声的,神经网络可能仍然能够学习到某种有意义的特征。这正是深度学习强大的地方——它可以发现人类难以察觉的模式,但前提是数据本身确实存在某种可学习的结构。

3.  nn.Module使用

3-1模型部分

在 PyTorch 中,所有的神经网络模型都建议继承自 nn.Module,这是因为 nn.Module 提供了许多构建和管理神经网络的基础功能。

import torch
import torch.nn as nnclass MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()# 定义模型的层self.fc1 = nn.Linear(10, 20)  # 全连接层self.relu = nn.ReLU()        # 激活函数self.fc2 = nn.Linear(20, 1)  # 输出层def forward(self, x):# 定义前向传播逻辑x = self.fc1(x)x = self.relu(x)x = self.fc2(x)return x

继承 nn.Module 后,需要在 __init__ 方法中定义模型的层或子模块,并在 forward 方法中定义前向传播逻辑(输入数据x如何穿过这些层训练,又如何把这些层的函数固化让输入穿过后得到期望的输出)。

3-2训练部分

# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)# 模拟训练
for epoch in range(10):optimizer.zero_grad()  # 清空梯度output = model(input_data)  # 前向传播loss = criterion(output, torch.randn(5, 5))  # 计算损失loss.backward()  # 反向传播optimizer.step()  # 更新参数print(f"Epoch {epoch}, Loss: {loss.item()}")

可以通过 model.parameters() 或 model.state_dict() 访问模型的参数。

# 查看模型的参数
for name, param in model.named_parameters():print(name, param.shape)# 保存模型参数
torch.save(model.state_dict(), "model.pth")# 加载模型参数
model.load_state_dict(torch.load("model.pth"))

3-3调用部分

创建模型实例后,可以像调用函数一样调用模型,输入数据会自动经过 forward 方法。

model = MyModel()
input_data = torch.randn(5, 10)  # 假设输入是一个 (5, 10) 的张量
output = model(input_data)       # 前向传播
print(output)

4.我暂时的神经网络(仅预测兵力的移动方位)

这部分目前的实现,我考虑多层的决策处理,简单的方位预测我觉得还不够实用。

以后的通用RTS游戏智能体的自定义搭建我要更灵活通用。

# 通用兵力策略网络(坦克、战车、步兵)------输出是位置预测
class troopsNN(nn.Module): """输入:游戏状态、兵种特征、空间特征、位置嵌入"""def __init__(self):"""game_stats: torch.Size([batch_size, 10, 12]) bop_features: torch.Size([batch_size, 10, 12, 44])spatial_features:torch.Size([batch_size, 10, 14, 92, 77]) -> 送入cnn的形状应该是(b, n, h, w)bop_embeddings:torch.Size([batch_size, 10, 6, 92, 77])"""super(troopsNN, self).__init__()self.mlp_fg = torch.nn.Linear(12, 6)self.mlp_fb = torch.nn.Linear(44, 25)self.cnn_fs = nn.ModuleList() self.cnn_fs.append(self.conv_layer([17, 24], kernel=3))self.cnn_fs.append(self.conv_layer([24, 48], kernel=3))self.down_sampling = nn.MaxPool2d(kernel_size=2, stride=2)self.mlp_move_direction = self.mlp_layer(7)     # TODO: 这里用mask掩码机制,使得不同兵种的动作空间不同def conv_layer(self, channel, kernel):conv_block = nn.Sequential(nn.Conv2d(in_channels=channel[0], out_channels=channel[1], kernel_size=kernel, stride=2, padding=1),nn.BatchNorm2d(num_features=channel[1]),nn.ReLU(inplace=True),)return conv_blockdef mlp_layer(self, out_dim):mlp_block = nn.Sequential(nn.Linear(5430, 2048), # notemporal 5430; temporal 54300nn.ReLU(inplace=True),nn.Linear(2048, out_dim),) return mlp_blockdef forward(self, game_stats, bop_features, spatial_features, bop_embeddings):# 处理特征game_stats = game_stats.permute(1, 0, 2) # 1, b, 12bop_features = bop_features.permute(1, 2, 0, 3) # 1, 12, b, 44spatial_features = spatial_features.permute(1, 0, 2, 3, 4) # 1, b, 23, 92, 77bop_embeddings = bop_embeddings.permute(1, 0, 2, 3, 4) # 1, b, 3, 92, 77# final_feature_bop_frame = torch.zeros((6, 10, game_stats.shape[1], 2048), device=device) # (bop, frame, batch_size, length of final feature). too big?final_feature_frame = ([0] * 1)for i in range(1):final_feature_frame[i] = [0] * game_stats.shape[1]for i in range(1):for j in range(game_stats.shape[1]):final_feature_frame[i][j] = [0] * 2048# print(np.shape(final_feature_frame)) # (1, batch_size, 2048)for i in range(1):f_game = self.mlp_fg(game_stats[i]) # input (b, 12), output (b, 6)for j in range(6): # bops' features (our_info + enemy_info)fb_j_total = self.mlp_fb(bop_features[i][j]) # in (b, 44), out(b, 25)fb_j = fb_j_total[:, :-1] # (b, 24)if j == 0:f_bops = fb_jelse:f_bops = torch.cat((f_bops, fb_j), 1) # final f_bops: (b, 24*3=72)# basic网络中不需要区分算子的位置嵌入,直接把bop_embeddings与空间特征做concat。不再需要从共享特征池做att。f_spatial = torch.cat((spatial_features[i], bop_embeddings[i]), 1) # (b, 14+3, 92, 77)for u in range(len(self.cnn_fs)):f_spatial = self.cnn_fs[u](f_spatial)f_spatial = self.down_sampling(f_spatial)f_spatial = f_spatial.view(f_spatial.shape[0], -1) # 拉平成(b, )final_feature_frame[i] = torch.cat((f_game, f_bops, f_spatial), 1) # (b, )# print(final_feature_frame[i].shape) # torch.Size([8, 5430])pred_move_dir = self.mlp_move_direction(final_feature_frame[0])return pred_move_dir

——就像高中时悟到的那样,自己的笔记是一定要记的,就算别人的笔记再详细,也不是你所经历过的路,也有很多缺失的或多余的,所以不能依赖所谓的学霸笔记,要自己有自己的笔记,自己才能随时取用自己需要的知识。

相关文章:

庙算兵棋推演AI开发初探(6-神经网络开发)

碎碎念: 老师让我和同学组队参加10月底截止报名的庙算比赛,我俩走运进了64强,打的过程中发现了一个重要问题——为什么别人总能打我,但是我都看不见!就像玩dota被对面英雄莫名其妙单杀了但是他就一直隐身我都不知道怎…...

嵌入式硬件篇---嘉立创PCB绘制

文章目录 前言一、PCB绘制简介1.1绘制步骤1.1.1前期准备1.1.2原理图设计1.1.3原理图转PCB1.1.4PCB布局1.1.5布线1.1.6布线优化和丝印1.1.7制版 1.2原理1.2.1电气连接原理1.2.2信号传输原理1.2.3电源和接地原理 1.3注意事项1.3.1元件封装1.3.2布局规则1.3.3过孔设计1.3.4DRC检查…...

AI与.NET技术实操系列(四):使用 Semantic Kernel 和 DeepSeek 构建AI应用

1. 引言 在人工智能技术飞速发展的今天,大型语言模型(Large Language Models, LLMs)已成为智能应用开发的核心驱动力。从智能客服到自动化内容生成,LLMs的应用正在深刻改变我们的工作和生活方式。 对于.NET开发者而言,…...

Vue 组件 - Slot 内容分发

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue组件 - Slot 内容分发 目录 Slot内容分发 旧版slot 单插槽 使用插槽 具名插槽 插槽实现导航 使用插槽优点 新版slot Or 插槽版抽屉 总结 Slot内容分发 混合父组件的内容和子组件自己模板 -- 内容分发 父组件模…...

Mysql之事务(下)

🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 5. 事务的隔离级别与并发控制 5.1事务的隔离级别 5.2查看与设置事务的…...

LabVIEW液压控制系统开发要点

液压控制系统开发需兼顾高实时性、强抗干扰性和安全性,尤其在重工业场景中,毫秒级响应延迟或数据异常都可能导致设备损坏。本文以某钢厂液压升降平台项目为例,从硬件选型、控制算法、安全机制三方面,详解LabVIEW开发中的关键问题与…...

mybatis-genertor(代码生成)源码及扩展笔记

文章目录 生成过程MyBatisGenerator.generate()代码入口 pid0,id0context.generateFiles()代码 pid0,id1introspectedTable.getGeneratedJavaFiles() java部分生成 pid1,id11introspectedTable.getGeneratedXmlFiles() xml部分生成 pid1,id12这里是一波三连调用XMLMapperGenera…...

Mysql-数据库、安装、登录

一. 数据库 1. 数据库:DataBase(DB),是存储和管理数据的仓库。 2. 数据库管理系统:DataBase Management System(DBMS),操纵管理数据库的大型软件 3. SQL:Structured Query Language&…...

HTTP 请求方法

HTTP 请求方法 引言 HTTP(超文本传输协议)是互联网上应用最为广泛的网络协议之一。它定义了客户端与服务器之间通信的规则。HTTP请求方法,也称为HTTP动词,是客户端向服务器发送请求时使用的操作类型。本文将详细介绍HTTP请求方法的概念、分类、常用方法及其在实际应用中的…...

群体智能优化算法-算术优化算法(Arithmetic Optimization Algorithm, AOA,含Matlab源代码)

摘要 算术优化算法(Arithmetic Optimization Algorithm, AOA)是一种新颖的群体智能优化算法,灵感来源于加、减、乘、除四种基本算术运算。在优化过程中,AOA 通过乘除操作实现全局探索,通过加减操作强化局部开发&#…...

4.1-python操作wrod/pdf 文件

1.读取word文件 首先安装软件包 pip3 install python-docx from docx import Documentimport os path os.path.join(os.getcwd(),你的文档名字.docx)# 加载文档 doc Document(path)# 遍历数据 for p in doc.paragraphs:print(p.text)# 遍历文档中所有表格 for t in doc.t…...

C# 窗体应用(.FET Framework) 线程操作方法

一、Thread线程使用方法 初始化方法 Thread th1; th1 new Thread(方法名); th1.IsBackground true; th1.Start();传参 ///定义一个object接受参数的方法 private void Test(object n){string str1 n as string; MessageBox.Show(str1); }// 调用方法 Thread th2 string s…...

vscode/cursor编辑器中vue3文件里面的css不能注释解决办法

升级了cursor后发现css或者html里面的代码不能单行注释了,真的很烦人,找了很多解决办法,还是定位到插件上,有一个vue的插件,把它禁用掉就可以注释了,然后再把这个插件启用,就可以使用了&#xf…...

Jenkins详细安装配置部署

Jenkins是一款流行的开源持续集成/持续交付(CI/CD)工具,可以实现自动化构建、测试和部署软件。下面是Jenkins的详细安装、配置和部署过程。 安装Jenkins 1. 安装Java Jenkins运行需要Java环境,因此需要先安装Java。具体安装方式根据不同的操作系统有所…...

《Linux运维总结:基于银河麒麟V10+ARM64架构CPU源码编译部署单实例redis7.2.6》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、环境信息 环境信息如下: 主机IP 操作系统 Redis版本 CPU架构 192.168.1.111 K…...

音视频开发---常用工具

一、VLC播放器 1. 简介 VLC多媒体播放器(最初命名为VideoLAN客户端)是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘、VCD影音光盘和各类流式协议。它也能作为unicast或multicast的流式服务器在IPv4或IPv6的高速连接下使用。 它融…...

Java 大视界 -- 基于 Java 的大数据分布式计算在基因测序数据分析中的性能优化(161)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...

关于跨域与.NET的处理方案

在 Web 开发里,浏览器的同源策略是一项关键的安全机制。同源指的是两个 URL 的协议、域名和端口都相同。当浏览器从一个源(域名、协议、端口)的网页去请求另一个源的资源时,就会产生跨域问题。例如,从 http://www.exam…...

中级:Maven面试题精讲

一、引言 在Java开发中,Maven作为一款强大的项目管理和构建工具,被广泛应用于项目构建、依赖管理和插件机制等方面。面试官通过相关问题考察候选人对Maven核心功能的理解和实际应用能力,以及在复杂项目场景下合理配置和优化Maven的能力。本文…...

MySQL与Redis数据一致性保障方案详解

前言 在现代分布式系统中,MySQL和Redis的结合使用非常普遍。MySQL作为关系型数据库负责持久化存储,而Redis则作为高性能缓存层提升系统的响应速度。然而,在这种架构下,如何保证MySQL与Redis之间的数据一致性是一个重要的挑战。本…...

外观模式详解

以下是一个结合外观模式解决实际开发问题的Java实现案例,涵盖复杂系统整合、接口简化、版本兼容等场景需求,附带逐行中文注释: 场景描述 开发一个智能家居控制系统,需整合多个子系统: 灯光系统:多房间灯光…...

JavaScript单例模式

单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。 用一个变量来标志是否创建过对象,如果是,则在下次直接返回这个已经创建好的对象,示例代码如下: 单例模式的核心思想是让指定的类只存在唯一一个实例&…...

Kong网关研究

目录 概述 部署kong docker服务 kong初始化与启动 验证 部署konga 网关功能 JWT认证 若依的鉴权认证 kong的JWT支持 限流 黑名单 概述 Kong网关基于OpenResty,而OpenResty基于Nginx,Nginx本身是性能强大的方向代理与web容器,Ope…...

LangChain 结构化输出:用 Pydantic + PydanticOutputParser 驯服 LLM 的“自由发挥”

目录 一、Pydantic 二、PydanticOutputParser 1、为什么需要 PydanticOutputParser? 2、Pydantic和PydanticOutputParser核心区别 3、Pydantic的不足 (1)无法直接解析非结构化文本 (2)缺乏对 LLM 输出的适配性 …...

source(WEB)

##解题思路 首先打开kali,使用dirsearch扫描下网站目录,发现网站有.git源码泄露 dirsearch -u URL 接着使用wget将源码下载到本地(尝试过使用githack,但是得到的信息是flag不在这) wget -r URL/.git/ 接着cd到wget的…...

【蓝桥杯】单片机设计与开发,温度传感器DS18B20

一、温度传感器概述 结构图 二、通信过程 三、onewire单总线协议概述 四、单总线的工作原理 黑粗线是单片机发送的,浅的是s18b20回应的 五、温度传感器的应用 六、onewire 七、课后习题...

trae.ai 编辑器:前端开发者的智能效率革命

一、为什么我们需要更智能的编辑器? 作为从业5年的前端开发者,我使用过从Sublime到VSCode的各种编辑器。但随着现代前端技术的复杂度爆炸式增长(想想一个React组件可能涉及JSX、CSS-in-JS、TypeScript和GraphQL),传统…...

【FPGA实战】基于DE2-115实现数字秒表

【FPGA实战】基于DE2-115实现数字秒表 一、项目概述二、层次化设计架构三、核心模块实现原理1. 时钟分频模块(clock_divider.v)2. 按键处理模块2.1 消抖(debounce .v)2.2 边沿检测(edge_detector .v) 3. 时间计数模块(time_counter .v)4. 显示驱动模块(seven_seg_display.v)5.顶…...

动态规划入门:从记忆化搜索到递推

本篇笔记基于b站灵茶山艾府。 198. 打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统…...

Linux 入门:基础开发工具(上)vim,gcc/g++,make/makefile

目录 一.软件包管理器 一).软件包 二).安装软件 三).删除软件 二.编辑器vim 一).vim的基本介绍 1.正常/普通/命令模式(Normal mode) 2.插入模式(Insert mode) 3.底行模式(last line mode) 二).vim的基本操作 …...

golang 的channel

理解 Go 语言的 Channel Channel 是 Go 语言中用于 goroutine 之间通信和同步的重要机制。通过 channel,goroutine 可以安全地交换数据,避免了共享内存带来的竞态条件和内存一致性问题。 1. Channel 的基本概念 Channel 是一个先进先出(FI…...

HarmonyOS Next~鸿蒙元服务开发指南:核心功能与实践

HarmonyOS Next~鸿蒙元服务开发指南:核心功能与实践 一、元服务核心概念 原子化服务定义 元服务(原子服务)是鸿蒙系统的核心架构单元,具备独立业务能力的轻量化服务模块,支持免安装、跨设备调用和智能分发…...

stm32面试

数据结构相关问题 stm32面试 数据结构相关问题 目录基础数据结构树与图排序与查找算法 Linux相关问题Linux系统基础Linux命令与脚本Linux网络与服务 操作系统相关问题操作系统基础概念操作系统调度算法操作系统同步与通信 STM32相关问题STM32硬件基础STM32编程与开发STM32应用与…...

构建大语言模型应用:句子转换器(Sentence Transformers)(第三部分)

本系列文章目录 简介数据准备句子转换器(本文)向量数据库搜索与检索大语言模型开源检索增强生成评估大语言模型服务高级检索增强生成 RAG 在之前的博客中,我们学习了为RAG(检索增强生成,Retrieval Augmented Generati…...

新能源汽车空调系统(R134A)性能评估(一)

国内外主流空调系统厂家:贝尔、德尔福、空调国际、法雷奥、电装、松芝、杰信、新电、豫新等 泛亚汽车的空调电子部是比较优秀的整车空调研发团队。 空调系统综合试验台架是一套由试验室、风量测定装置、空气调和器、空气温度测定装置、湿度测定装置、加热器试验辅助…...

STRUCTBERT:将语言结构融入预训练以提升深度语言理解

【摘要】最近,预训练语言模型BERT(及其经过稳健优化的版本RoBERTa)在自然语言理解(NLU)领域引起了广泛关注,并在情感分类、自然语言推理、语义文本相似度和问答等各种NLU任务中达到了最先进的准确率。受到E…...

MCP协议的Streamable HTTP:革新数据传输的未来

引言 在数字化时代,数据传输的效率和稳定性是推动技术进步的关键。MCP(Model Context Protocol)作为AI生态系统中的重要一环,通过引入Streamable HTTP传输机制,为数据交互带来了革命性的变化。本文将深入解读MCP协议的…...

基于 RK3588 的 YOLO 多线程推理多级硬件加速引擎框架设计(代码框架和实现细节)

一、前言 接续上一篇文章,这个部分主要分析代码框架的实现细节和设计理念。 基于RK3588的YOLO多线程推理多级硬件加速引擎框架设计(项目总览和加速效果)-CSDN博客https://blog.csdn.net/plmm__/article/details/146542002?spm1001.2014.300…...

stm32 can 遥控帧的问题

STM32单片机使用CAN协议进行通信 引用这个博客的一段话 CAN的遥控帧(Remote Frame)的主要作用是请求其他节点发送具 有特定ID的数据帧。具体来说,当一个节点需要从另一个节点获取数 据时,它可以发送一个遥控帧,而不是…...

机器人基础知识-1

1.六轴机器人中的六轴是什么? 第一轴(J1):底座旋转 控制机器人整体绕垂直轴旋转(左右摆动),决定工作范围的水平方向。 第二轴(J2):下臂前后摆动 驱动机器人的…...

JAVA- 锁机制介绍 进程锁

进程锁 基于文件的锁基于Socket的锁数据库锁分布式锁基于Redis的分布式锁基于ZooKeeper的分布式锁 实际工作中都是集群部署,通过负载均衡多台服务器工作,所以存在多个进程并发执行情况,而在每台服务器中又存在多个线程并发的情况,…...

如何在WordPress中强制用户使用强密码?

在如今网络安全备受关注的环境下,弱密码问题不容忽视。很多用户习惯在多个网站使用相同且简单的密码,这样一来,若不强制他们在 WordPress 网站上使用强密码,网站的安全性就会受到威胁。尤其对于在线商店、会员网站、多作者博客等站…...

鸿蒙NEXT开发Base64工具类(ArkTs)

import util from ohos.util;/*** Base64 工具类* author: 鸿蒙布道师* since: 2025/03/31*/ export class Base64Util {/*** 创建 Base64Helper 实例* returns Base64Helper 实例*/private static createBase64Helper(): util.Base64Helper {return new util.Base64Helper();}…...

基于HUTOOL实现RSA工具类

一、前言:用 Hutool 简化 RSA 加密开发,提升代码安全与效率 在当今数据安全至关重要的时代,RSA 非对称加密作为保护敏感信息的核心技术,广泛应用于通信加密、数字签名、密钥交换等场景。然而,手动实现 RSA 算法涉及复…...

flink 分组窗口聚合 与 窗口表值函数聚合 的区别

警告:分组窗口聚合已经过时。推荐使用更加强大和有效的窗口表值函数聚合。 参考官方文档 在 Apache Flink 中,分组窗口聚合(Group Window Aggregation) 和 窗口表值函数聚合(Windowing TVF Aggregation)…...

prompt_status:5: command not found: wc解决办法

问题出现背景 想配置uniapp的命令行,在.zprofile配置路径的时候PATH 前面少打了一个$,执行了 source,导致各种命令都失效。 解决办法 用fider 打开用户文件夹,Command Shift .显示隐藏文件,用文本编辑器修改一下&…...

《STL 六大组件之容器篇:简单了解 list》

目录 一、list 简介二、list 的常用接口1. 构造函数(constructor )2. 迭代器(iterator)3. 容量、修改和访问(capacity 、modify and access) 一、list 简介 简单来说,list 就是数据结构初阶中学…...

向量数据库学习笔记(2) —— pgvector 用法 与 最佳实践

关于向量的基础概念,可以参考:向量数据库学习笔记(1) —— 基础概念-CSDN博客 一、 pgvector简介 pgvector 是一款开源的、基于pg的、向量相似性搜索 插件,将您的向量数据与其他数据统一存储在pg中。支持功能包括&…...

TCP的连接建立

面向连接 定义:在发送数据之前,需要建立一条点到点的连接 (参数协商的过程。因为tcp要保证可靠,所以tcp通信是发生在双方之间、两端之间的,两端在正式发送数据之前需要约定一些初始参数,这个过程就是面向连…...

如何让AI帮你做用户运营:用户消费偏好分层和洞察

随着deepseek的爆火,我一直在想能不能用AI来帮我做用户运营,目前deepseek只能提供框架层面的运营建议,还无法实现将订单数据给到它,能够自动化分析并将用户分层,并给出可视化的运营洞察报表。但是,我要告诉…...