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

24/8/17算法笔记 MPC算法

MPC算法,在行动前推演一下

MPC(Model Predictive Control,模型预测控制)是一种先进的控制策略,它利用未来预测模型来优化当前的控制动作。MPC的核心思想是,在每一个控制步骤中,都基于当前系统状态的测量值,通过预测模型向前看若干步,并计算出一个使未来输出最优化的控制序列。然后,只应用这个序列的第一个控制动作,并在下一个时间步重复这个过程。

MPC算法的主要特点包括:

  1. 滚动时域优化:MPC在每一个控制步骤中解决一个有限时间范围内的优化问题,而不是试图直接解决整个控制任务。

  2. 模型预测:利用系统模型来预测未来的行为。这个模型可以是物理模型,也可以是基于数据的模型。

  3. 约束处理:MPC可以自然地处理系统的输入和输出约束,例如,限制控制输入的最大和最小值,或者状态变量的运行范围。

  4. 优化目标:通常包括跟踪预定轨迹、最小化能耗、保证系统稳定性等。

  5. 反馈校正:由于实际系统与模型之间存在差异,MPC通常会在每个控制周期中使用最新的测量状态来更新预测并重新优化。

MPC算法的一般步骤包括:

  1. 状态测量:获取当前系统状态的实际测量值。

  2. 模型预测:使用当前状态和预测模型来预测未来的状态和输出。

  3. 优化问题设置:定义目标函数和约束条件,设置优化问题。

  4. 求解优化问题:求解优化问题,得到最优控制序列。

  5. 应用控制动作:将优化问题的解,即控制序列的第一个控制动作应用到系统上。

  6. 重复过程:在下一个控制周期,重复上述步骤。

MPC算法广泛应用于化工、石油、交通、航空等众多领域,特别是在需要考虑复杂约束和多步预测的场合。然而,MPC算法的性能在很大程度上依赖于模型的准确性和优化算法的选择。随着计算能力的提升和优化算法的发展,MPC在实际工业应用中的使用越来越广泛。

import gym
#创建环境
env = gym.make('Pendulum-v1')

定义样本池对象

import numpy as np
import torchclass Pool:def __init__(self,limit):#样本池self.datas = []self.limit = limitdef add(self,state,action,reward,next_state,over):if isinstance(state,np.ndarray) or isinstance(state,torch.Tensor):#检查变量 state 是否是 bo.ndarray 或者 torch.Tensor 类型state = state.reshape(3).tolist()action = float(action)reward = float(reward)if isinstance(next_state,np.ndarray) or isinstance(next_state,torch.Tensor):next_state = next_state.reshape(3).tolist()over = bool(over)self.datas.appen((state,action,reward,next_state,over))#数据上限,超出时从最古老的开始删除while len(self.datas)>self.limit:self.datas.pop(0)#获取一批数据样本def get_sample(self):samples = self.datasstate = torch.FloatTensor([i[0] for i in samples]).reshape(-1,3)action = torch.FloatTensor([i[1] for i in samples]).reshape(-1,1)reward = torch.FloatTensor([i[2] for i in samples]).reshape(-1,1)     next_state = torch.FloatTensor([i[3]for i in samples]).reshape(-1,3)over = torch.LongTensor([i[4]for i in samples]).reshape(-1,1)input = torch.cat([state,action],dim=1)label = torch.cat([rewarrd,next_state-state],dim=1)return input,labeldef _len_(self):return len(self_datas)

初始化样本池,并添加一局游戏的数据

pool = Pool(1000000)#初始化一局游戏的数据
def _():#初始化游戏state = env.reset()#玩到游戏结束为止over = Falsewhile not over:#随机一个动作action = env.action_space.sample()[0]#执行动作,得到反馈next_state,reward,over,_ = env.step([action])#记录数据样本pool.add(state,action,reward,next_state,over)#更新游戏状态,开始下一个动作state = next_state

定义主模型

import random
#定义主模型
class Model(torch.nn.Module):#swish激活函数class Swish(torch.nn.Module):def __init__(self):super().__init__()def forward(self,x):return X*torch.sigmoid(x)

主模型中的FC层

#定义一个工具层
class FCLayer(torch.nn.Module):def __init__(self,in_size,out_size):super().__init__()self.in_size = in_size#初始化参数std  = in_size**0.5std *=2std = 1/stdweight = torch.empty(5, in_size,out_size)torch.nn.init.normal_(weight,mean=0.0,std=std)self.weight = torch.nn.Parameter(weighr)self.bias = torch.nn.Parameter(torch.zeros(5,1,out_size))def forward(self,x):x = torch.bmm(x,self.weight)x = x+self.biasreturn x

主模型初始化函数

def __init__(self):super().__init__()self.sequential = torch.nn.Sequential(self.FCLayer(4,200), #全连接层(线性层)self.Swish(), #激活函数层self.FCLayer(200,200),self.Swish(),self.FCLayer(200,200),self.Swish(), self.FCLayer(200,200),self.Swish(),self.FCLayer(200,8),torch.nn.Identity(),)self.softplus = torch.nn.Softplus() #Softplus 是一个平滑的ReLU激活函数self.optimizer = torch.optim.Adam(self.parameters(),lr=1e-3)

主模型计算过程,计算结果是一个均值和log方差,对logvar的加减操作是为了调整logvar的最大最小值

def forward(self,x):x = self.sequential(x)mean  = x[...,:4]logvar = x[...,4:]logvar = 0.5 - logvarlogva = 0.5 -self.softplus(logvar)logvar = logvar+10logvar = self.softplus(logvar)-10return mean,logvar

主模型的训练函数

def train(self,input,label):#反复训练N次for _ in range(len(input)//64*20):#从全量数据中抽样64个,反复抽5遍,形成5份数据select = [torch.randperm(len(input))[:64] for _ in range(5)]select =torch.stack(select)input_select = input[select]label_select = label[select]del select#模型计算mean,logvar = model(input_select)#计算lossmse_loss = (mean - label_select)**2*(-logvar).exp()mse_loss = mse_loss.mean(dim=1).mean()var_loss+logvar.mean(dim=1).mean()loss =mse_loss+var_lossself.optimizer.zero_grad()loss.backward()self.optimizer.step()

初始化主模型

model = Model()a,b = model(torch.randn(5,64,4))
a.shape,b.shape

MPC fake step函数,功能是根据state和action估计reward和next_state

class MPC:def _fake_step(self,state,action):input = torch.cat([state,action],dim=1)#重复5遍input = input.unsqueeze(dim=0).repeat([5,1,1])#模型计算with torch.no_grad():mean,std = model(input)std = std.exp().sqrt()del input#means的后3列加上环境数据mean[:,:,1:]+=state#重采样sample = torch.distributions.Normal(0,1).sample(mean.shape)#0-4的值域采样b个元素select = [random.choice(range(5))for _ in range(mean.shape[1])]#重采样结果,第0个维度,0-4随机选择,第二个维度,0-b顺序选择sample = sample[select,range(mean.shape[1])]#切分一下,就成了rewards,next_statereward,next_state = sample[:,:1],sample[:,1:]return reward,next_state

MPC cem优化函数,虚拟N条动作链,并优化M次,求与孤寂结果最佳的分布

    def _cem_optimizer(self,state,mean):state = torch.FloatTensor(state).reshape(1,3)var = torch.ones(25)#当前游戏的环境信息,复制50次state = state.repeat(50,1)#循环5次,寻找最优解for _ in range(5):#采样50个标准正态分布数据作为actionactions = torch.distributions.Normal(0,1).sample([50,25])#乘以标准差,加上均值actions *=var**0.5actions +=mean#计算每条动作序列的累计奖励reward_sum = torch.zeros(50,1)#遍历25个动作for i in range(25):action = actions[:,i].unsqueeze(dim=1)#现在是不能真的去玩游戏的,只能去预测reward和next_statereward,next_state = self._fake_step(state,action)reward_sum += rewardstate = next_state#按照reward_sum从小到大排序select = torch.sort(reward_sum.squeeze(dim=1)).indicesactions = actions[select]del select#取发聩最优的10个动作链actions = actions[-5:]#在下一次随机动作时,希望贴近这些动作的分布new_mean = actions.mean(dim= 0)new_var = actions.var(dim=0)#增量更新mean = 0.1*mean +0.9*new_meanvar = 0.1*var+0.9*new_varreturn mean

MPC mpc函数,每次动作都预演N次,求预演结果最佳的分布

def mpc(self):#初始化动作的分布均值都是0mean = torch.zeros(25)reward_sum = 0state = env.reset()over = Falsewhile not over:#当前状态下,找25个最优都知道均值actions = self._cem_optimize(state,mean)#执行第一个动作action = actions[0].item()#执行动作next_state,reward,over,_ = env.step([action])#增加数据pool.add(state,action,reward,next_state,over)state = next_statereward_sum +=reward#下个动作的均值,在当前动作均值的基础上寻找mean = torch.empty(actions.shape)mean[:-1] = actions[1:]mean[-1] = 0return reward_sum

初始化MPC对象

mpc = MPC()
a,b = mpc._fake_step(torch.randn(200,3),torch.randn(200,1))
print(a.shape,b.shape)
print(mpc._cem_optimize(torch.randn(1,3),,torch.zeros(25)).shape)

训练

for i in range(10):input,label = pool.get_sample()model.train(input,label)reward_sum = mpc.mpc()print(i,len(pool),reward_sum)

相关文章:

24/8/17算法笔记 MPC算法

MPC算法,在行动前推演一下 MPC(Model Predictive Control,模型预测控制)是一种先进的控制策略,它利用未来预测模型来优化当前的控制动作。MPC的核心思想是,在每一个控制步骤中,都基于当前系统状…...

GROUP_CONCAT 用法详解(Mysql)

GROUP_CONCAT GROUP_CONCAT 是 MySQL 中的一个聚合函数,用于将分组后的多行数据连接成一个单一的字符串。 通常用于将某个列的多个值合并到一个字符串中,以便更方便地显示或处理数据。 GROUP_CONCAT([DISTINCT] column_name[ORDER BY column_name [ASC…...

Golang httputil 包深度解析:HTTP请求与响应的操控艺术

标题:Golang httputil 包深度解析:HTTP请求与响应的操控艺术 引言 在Go语言的丰富标准库中,net/http/httputil包是一个强大的工具集,它提供了操作HTTP请求和响应的高级功能。从创建自定义的HTTP代理到调试HTTP流量,h…...

SQLALchemy 分页

SQLALchemy 分页 1. 使用SQLAlchemy的`slice`和`offset`/`limit`SQLAlchemy 1.4及更新版本SQLAlchemy 1.3及更早版本使用第三方库注意事项在Web开发中,分页是处理大量数据时一个非常重要的功能。SQLAlchemy是一个流行的Python SQL工具包和对象关系映射(ORM)库,它允许开发者…...

快速上手体验MyPerf4J监控springboot应用(docker版快速开始-本地版)

使用MyPerf4J监控springboot应用 快速启动influxdb时序数据库日志收集器telegrafgrafana可视化界面安装最终效果 项目地址 项目简介: 一个针对高并发、低延迟应用设计的高性能 Java 性能监控和统计工具。 价值 快速定位性能瓶颈快速定位故障原因 快速启动 监控本地应用 idea配…...

C语言 之 strlen、strcpy、strcat、strcmp字符串函数的使用和模拟实现

文章目录 strlen的使用和模拟实现函数的原型strlen模拟实现:方法1方法2方法3 strcpy的使用和模拟实现函数的原型strcpy的模拟实现: strcat的使用和模拟实现函数的原型strcat的模拟实现: strcmp的使用和模拟实现函数的原型strcmp的模拟实现 本…...

CAPL使用结构体的方式组装一条DoIP车辆识别请求报文(payload type 0x0002)

DoIP车辆识别请求(payload type 0x0002)报文的格式为: /******************************************************** +--------+--------+--------+--------+ |version | inVer | type | +--------+--------+--------+--------+ | length …...

数据接入教学

数据接入教学 1、开通外部网络策略2、检查本地防火墙策略3、测试网络连通性4、工具抓包命令5、本地测试发送与监听 1、开通外部网络策略 保证外部网络联通、保证内部防火墙开通策略(可以关闭进行测试) 2、检查本地防火墙策略 关闭进行测试 停止firewa…...

炒作将引发人工智能寒冬

我们似乎经常看到人工智能的进步被吹捧为机器真正变得智能的一大飞跃。我将在这里挑选其中的一个例子,并确切解释为什么这种态度会为人工智能的未来埋下隐患。 这很酷,这是一个非常困难且非常具体的问题,这个团队花了3 年时间才解决。他们一定…...

clamp靶机复现

靶机设置 设置靶机为NAT模式 靶机IP发现 nmap 192.168.112.0/24 靶机IP为192.168.112.143 目录扫描 dirsearch 192.168.112.143 访问浏览器 提示让我们扫描更多的目录 换个更大的字典,扫出来一个 /nt4stopc/ 目录 目录拼接 拼接 /nt4stopc/ 发现页面中有很多…...

mfc100u.dll丢失问题分析,详细讲解mfc100u.dll丢失解决方法

面对mfc100u.dll文件丢失带来的挑战时,许多用户都可能感到有些无助,尤其是当这一问题影响到他们日常使用的软件时。但实际上,存在几种有效方法可以帮助您快速恢复该关键的系统文件。为了方便不同水平的用户,本文将详细解析各种处理…...

【C++】什么是内存管理?

如果有不懂的地方,可以看我以往文章哦! 个人主页:CSDN_小八哥向前冲 所属专栏:C入门 目录 C/C内存分布 C内存管理方式 new/delete操作内置类型 new/delete操作自定义类型 operator new与operator delete函数 new和delete实现…...

产业经济大脑建设方案(五)

为了提升产业经济的智能化水平,我们提出建设一个综合产业经济大脑系统,该系统通过整合大数据分析、人工智能和云计算技术,构建全方位的数据采集、处理和决策支持平台。该平台能够实时监测产业链各环节的数据,运用智能算法进行深度…...

如何在 Odoo 16 中覆盖创建、写入和取消链接方法

Odoo 是一款强大的开源业务应用程序套件,可为各种业务运营提供广泛的功能。其主要功能之一是能够自定义和扩展其功能以满足特定的业务需求。在本博客中,我们将探讨如何覆盖Odoo 16中的创建、写入和取消链接方法,从而使您无需修改​​核心代码…...

pip离线安装accelerate

一、离线下载到当前文件夹 pip download accelerate -d ./anzhuangbao# 制定版本使用以下命令pip download accelerate0.32.0 -d ./anzhuangbao二、离线安装 cd anzhuangbaipip install --no-index --find-links. accelerate三、验证是否安装 pip show accelerateAccelerate: …...

VUE3请求意外报跨越错误或者500错误问题

1.有可能是请求传参和传参类型写错了 首先要确保该请求接口是支持跨域的(不支持叫后端改) access-control-allow-headers:Content-Type, Accept, Access-Control-Allow-Origin, api_key, Authorization access-control-allow-methods:GET, POST, OPTIO…...

vue 关于两个if条件中的promise

一、案例效果 期望if判断条件里的两个promise 都同时执行完成 二、 初始代码案例 const formatDetail async (fnArgsJsonParams: MapLogicType) > {if (fnArgsJsonParams?.targetFeatureName) {const resDetailData await formatFeatureInfo(fnArgsJsonParams.targetF…...

C/C++移位运算问题

目录 上期答案揭晓: 回忆: 问题1展现: 问题2展现: 改进方案: 下期预告:C语言类型转换的问题。 上期答案揭晓: 上期的问题大家是否都有了想法,下面说说我的思路。 上次我们提到…...

录屏工具 Icecream Screen Recorder PRO v7.41

Icecream Screen Recorder的免费屏幕录制工具,具备捕捉视频、音频、图片和游戏等多种功能。以前推荐过的icecreamPDF也是他家的非常好用! 下载链接:「录屏」来自UC网盘分享https://drive.uc.cn/s/b474616b91534...

解决连接不上Linux和服务器中的Nacos(Windows中能连接但是Linux中却不行)

报错 com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNKNOWN: Uncaught exception in the SynchronizationContext. Re-thrown. at com.alibaba.nacos.shaded.io.grpc.Status.asRuntimeException(Status.jav 2024-08-13T10:21:52.93708:00 ERROR 27764 --- …...

【LLM大语言模型-开篇】LLM入门实践指南

"LLM入门实践指南"是一个通过代码实践,为大模型入门读者提供全面且较为深入的大模型技术视角的教程。 为何关注LLM? 创新与变革:LLM不仅推动了自然语言处理(NLP)领域的进步,还在诸多行业中催生了…...

实时视频换脸、8 万家 AI 公司消失、论文天价售卖、新的 scaling law、爆火毒舌 AI | AI 掘金视界周刊第 5 期

AI 视界周刊由战场小包维护,每周一更新,包含热点聚焦、应用破局、学术前沿、社区热议、智见交锋、跨界 AI、企业动态和争议 AI 八大板块,后续板块划分和内容撰写在周刊迭代过程中持续优化,欢迎大家提出建议。 欢迎大家来到《AI 视…...

XSS靶场(1-11关)

目录 简述xss xss第1关 xss第2关 ​编辑 xss第3关 xss第4关 xss第5关过滤了 on script xss第6关 xss第7关 xss第8关 xss第9关 xss第10关 xss11关 我把源代码靶场放到了最顶端 简述xss XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法…...

vue2 子组件props接收父组件对象或数组必须使用函数进行返回

export default{ name:MyComponent, props:{ title:{ type:String, default:"" }, age:{ type:Number, default:1 }, names:{ type:Array, //数组或对象必须用函数进行返回 default:function(){ return [] …...

【算法/学习】双指针

✨ 少年要迎着朝阳,活得肆无忌惮 🌏 📃个人主页:island1314 🔥个人专栏:算法学习 🚀 欢迎关注:👍点赞 &a…...

Springboot集成Liquibase笔记整理

添加依赖<dependency><groupId>org.liquibase</groupId><artifactId>liquibase-core</artifactId> </dependency>添加配置spring:liquibase:contexts: dev,testenabled: true编写liquibase配置类Configuration EnableConfigurationPropert…...

Python拆分无atlas图集(瑕疵版)

老板给了张没有atlas文件的图集让我拆图&#xff0c;简单写了一版凑合用。 存在的问题&#xff1a; 可能会拆出来一些小尺寸的透明像素图片&#xff1b;可能会拆出来一些偏大的小图的整体集合&#xff1b;可能会把应该是一块的小图批成两半&#xff0c;不过不多&#xff1b;其…...

SQLALchemy 排序

SQLALchemy 排序 基本用法多列排序使用函数或表达式进行排序注意事项在SQLAlchemy中,排序(Ordering)是通过order_by()方法实现的。这个方法允许你指定一个或多个列(或表达式),用于对查询结果进行排序。你可以指定升序(默认)或降序排序。 基本用法 假设你有一个User模…...

【iOS】Block底层分析

目录 前言Block底层结构Block捕获变量原理捕获局部变量&#xff08;auto、static&#xff09;全局变量捕获实例self Block类型Block的copyBlock作为返回值将Block赋值给__strong指针Block作为Cocoa API中方法名含有usingBlock的方法参数Block作为GCD API的方法参数Block属性的写…...

复现dom破坏案例和靶场

文章目录 靶场网址第一个实验步骤和原理(代码为示例要根据自己的实验修改) 第二个实验步骤和原理(代码为示例要根据自己的实验修改) 靶场网址 注册后点击 第一个实验 此实验室包含一个 DOM 破坏漏洞。注释功能允许“安全”HTML。为了解决这个实验&#xff0c;请构造一个 HT…...

【高校科研前沿】南方科技大学冯炼教授等人在遥感顶刊RSE发文:全球人类改造的基塘系统制图

1.文章简介 论文名称&#xff1a;Global mapping of human-transformed dike-pond systems&#xff08;全球人类改造的基塘系统制图&#xff09; 第一作者及单位&#xff1a;Yang Xu&#xff08;南方科技大学环境学院&#xff09; 第一通讯作者及单位&#xff1a;冯炼&#x…...

How to run angular CICD on gitlab-runner of wsl?

前提文件 .gitlab-ci.yml, .dockerignore, ci-funcs.sh, Dockerfile, karma.conf.js, nginx.conf, nginx-custom.conf, sonar-project.properties 1.test.ts const context require.context(./app/pages, true, /\.spec\.ts$/); 2.sonar-project.properties sonar.sourcessrc/…...

搭建Java集成开发环境IntelliJ IDEA

搭建Java集成开发环境&#xff08;Integrated Development Environment&#xff0c;简称IDE&#xff09;IntelliJ IDEA是一个涉及多个步骤的过程&#xff0c;旨在帮助Java开发者高效、舒适地进行编程工作。IntelliJ IDEA由JetBrains公司开发&#xff0c;以其强大的代码自动补全…...

JS逆向浏览器脱环境专题:事件学习和编写、DOM和BOM结构、指纹验证排查、代理自吐环境通杀环境检测、脱环境框架、脱环境插件解决

&#x1f310;JS逆向浏览器脱环境专题&#xff1a;事件学习和编写、DOM和BOM结构、指纹验证排查、代理自吐环境通杀环境检测、脱环境框架、脱环境插件解决 &#x1f5a5;️ 浏览器事件学习和编写 浏览器事件是用户与网页交互的主要方式&#xff0c;了解并掌握这些事件的处理方…...

驾校预约学习系统--论文pf

TOC springboot373驾校预约学习系统--论文pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思想上不可跨域…...

交叉编译ARM平台的OpenCV1.0

首先,从http://www.opencv.org.cn下载1.0的源码包,然后解压出来,进入解压后的目录,再进行下面的修改: 将configure 文件下列内容注释掉(有两处)&#xff0c;只保留GTK_CFLAGS"" 、GTK_LIBS"" 、have_gtkno 三项内容&#xff08;如下黑体所示&#xff09;&…...

牛客周赛 Round 56 AK

背景 语言艺术 A题&#xff1a;面包店故事 题意 一块面包要x元&#xff0c;加培根要y元&#xff0c;有n元&#xff0c;问能否买到加培根的面包 思路 大水题&#xff0c;gpt秒了 代码 #include <bits/stdc.h> using namespace std; int main() {int x, y, n; cin …...

LeetCode 热题 HOT 100 (038/100)【宇宙最简单版】

【动态规划】No. 0337 打家劫舍III【中等】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&a…...

SQLALchemy ORM 的关联关系之 ORM 中的一对一

SQLALchemy ORM 的关联关系之 ORM 中的一对一 场景示例实现一对一关系使用 `relationship()` 和外键(FK)插入和查询数据总结在 SQLAlchemy ORM 中,一对一(One-to-One)关联关系是一种比较少见的模型关系,但它确实有其应用场景,特别是在你需要将一个对象与另一个对象紧密绑…...

模型部署 - docker

docker简介 Docker 是一种开源的容器化平台&#xff0c;允许开发者将应用程序及其依赖项打包到一个标准化的单元中&#xff0c;称为“容器”。这些容器可以在任何支持 Docker 的系统上运行&#xff0c;无需担心环境差异。 为什么需要 Docker&#xff1f; 在传统的开发中&…...

学懂C++(三十四):深入详解 C++ 高级多线程编程技术中的并发设计模式

引言 在现代软件开发中&#xff0c;多线程编程已成为提升性能和响应能力的重要手段。设计模式为解决并发问题提供了有效的解决方案。本文将探讨常见的并发设计模式&#xff0c;包括生产者-消费者模式、读者-写者模式、单例模式、帧-工作者模式以及Future-Task模式&#xff0c;并…...

大数据产业链图谱_产业链全景图_大数据行业市场分析

数据作为新型生产要素&#xff0c;是数字化、网络化、智能化的基础&#xff0c;已快速融入生产、分配、流通、消费和社会服务管理等各环节&#xff0c;影响着千行百业&#xff0c;推动着我国数字经济的蓬勃发展。 大数据又称巨量数据、海量数据&#xff0c;是由数量巨大、结构…...

photonserver 部署相关教程

Photon Server 是 Exit Games 开发的高性能、可扩展的多人游戏服务器框架。部署 Photon Server 需要一些基础的服务器管理知识和配置技巧。以下是一个基本的部署教程&#xff0c;帮助你将 Photon Server 部署在 Windows 服务器上。 目录 1. 下载并安装 Photon Server 2. 配置…...

GEE训练:sentinel-1数据的投影、显示和导出

函数 projection() Returns the default projection of an Image. Throws an error if the bands of the image dont all have the same projection. 返回图像的默认投影。如果图像带的投影不一致,则会抛出错误。 Arguments: this:image (Image): The image from which …...

后端学习笔记(七)--MyBatis参数传递

5.MyBatis参数传递 ​ *MyBatis接口方法中可以接收各种各样的参数&#xff0c;MyBatis底层对于这些参数进行不同的封装处理方式 ​ *单个参数&#xff1a; 1.POJO类型&#xff1a;直接使用&#xff0c;属性名和参数占位符名称一致 2.Map集合&#xff1a;直接使用&#xff0c;…...

uniapp 网络请求自动处理loading

文章目录 背景整理思路V1版本V2版本V3版本 背景 最近在写uniapp&#xff0c;发现执行网络请求的时候经常要处理Loading效果。 比如&#xff0c;在发送网络请求之前&#xff0c;触发Loadng&#xff1b;无论请求成功还是失败都要关闭Loading&#xff1b;请求失败的时候我们还要…...

【Solidity】函数的使用

构造函数 构造函数仅在部署合约时调用一次&#xff0c;它的作用主要是初始化一些状态变量。 contract Demo {address public owner;uint public num;constructor(uint _num) {owner msg.sender;num _num;} }函数装饰器 函数装饰器可以在函数执行之前或之后插入代码逻辑&am…...

详解golang内存管理

介绍 要搞明白 Go 语言的内存管理,就必须先理解操作系统以及机器硬件是如何管理内存的。因为 Go 语言的内部机制是建立在这个基础之上的,它的设计,本质上就是尽可能的会发挥操作系统层面的优势,而避开导致低效情况。 操作系统内存管理 其实现在计算机内存管理的方式都是…...

C++ 线程 一些同步方式

C 线程一些同步方式 1.互斥锁&#xff08;Mutex&#xff09;2. 读写锁&#xff08;Reader-Writer Lock&#xff09;3. 信号量&#xff08;Semaphore&#xff09;4. 原子操作&#xff08;Atomic&#xff09;5. 屏障&#xff08;Barrier&#xff09;6. 条件变量&#xff08;Condi…...

【开发语言】编译型语言和解释性语言有啥区别?

作为一名从业多年的程序员,对于编译型语言和解释型语言之间的区别有着深入的理解。这两种类型的编程语言在将源代码转换成可执行代码的过程中采用了不同的机制,这导致了它们在执行效率、跨平台性、安全性以及开发效率等方面存在一些差异。 编译型语言(Compiled Languages)…...