机器人中的数值优化(七)——修正阻尼牛顿法

   本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,下半部分介绍带约束的优化,中间会穿插一些路径规划方面的应用实例



   九、修正阻尼牛顿法

   1、基本牛顿方法

   (1)基本牛顿方法介绍

   Newton方法是Newton型方法的基础.本文主要讨论基本Newton方法、阻尼Newton方法及修正Newton方法的构造与性质.这类方法适宜于解决中小型最优化问题.

   设f(x)具有连续的二阶偏导数,当前迭代点是 x k x_k xk,f(x)在 x k x_k xk处的Taylor展式为

   f ( x k + d ) = f k + ∇ f ( x k ) T d + 1 2 d T ∇ 2 f ( x k ) d + o ( ∥ d ∥ 2 ) . f(x_k+d)=f_k+\nabla f\left(x_{k}\right)^\mathrm{T}d+\dfrac12d^{\mathrm T}\nabla^2 f(x_k) d+o(\|d\|^2). f(xk+d)=fk+f(xk)Td+21dT2f(xk)d+o(d2).

   其中 d = x − x k d= x - x_k d=xxk ,在点 x k x_k xk的邻域内,用如下二次函数来近似 f ( x k + d ) f(x_k + d) f(xkd),求解问题

   q k ( d ) ≜ f k + ∇ f ( x k ) T d + 1 2 d T ∇ 2 f ( x k ) d q_k(d)\triangleq f_k+ \nabla f\left(x_{k}\right)^\mathrm{T}d+\dfrac12d^{\mathrm T}\nabla^2 f(x_k)d qk(d)fk+f(xk)Td+21dT2f(xk)d

   上式中的d也就是 x − x k x-x_k xxk,所以上式也可写为如下的形式:

   q k ( d ) ≜ f ( x k ) + ∇ f ( x k ) T ( x − x k ) + 1 2 ( x − x k ) T ∇ 2 f ( x k ) ( x − x k ) q_k(d)\triangleq f(\boldsymbol{x}_{k})+\nabla f(\boldsymbol{x}_{k})^{T}(\boldsymbol{x}-\boldsymbol{x}_{k})+{\frac{1}{2}}(\boldsymbol{x}-\boldsymbol{x}_{k})^{T}\nabla^{2}f(\boldsymbol{x}_{k})(\boldsymbol{x}-\boldsymbol{x}_{k}) qk(d)f(xk)+f(xk)T(xxk)+21(xxk)T2f(xk)(xxk)


   只要上式中的 ∇ 2 f ( x k ) \nabla^2f(x_k) 2f(xk) x k x_k xk处是正定的,就可以对上式求导,即求梯度等于0的点,得到以下方程组:

   ∇ 2 f ( x k ) ( x − x k ) + ∇ f ( x k ) = 0 \nabla^2f(\boldsymbol{x}_k)(\boldsymbol{x}-\boldsymbol{x}_k)+\nabla f(\boldsymbol{x}_k)=\boldsymbol{0} 2f(xk)(xxk)+f(xk)=0

   即:

   ∇ 2 f ( x k ) d = − ∇ f ( x k ) \nabla^2 f(x_k) d=-\nabla f\left(x_{k}\right) 2f(xk)d=f(xk)

   ∇ 2 f ( x k ) \nabla^2 f(x_k) 2f(xk)正定,则方程组的解 d k = − ∇ 2 f ( x k ) − 1 ∇ f ( x k ) d_k=-\nabla^2 f(x_k)^{-1}\nabla f\left(x_{k}\right) dk=2f(xk)1f(xk)为上述问题的唯一解,因为基本牛顿法步长取1,因此其迭代式为: x k + 1 = x k − [ ∇ 2 f ( x k ) ] − 1 ∇ f ( x k ) \boldsymbol{x}_{k+1}=\boldsymbol{x}_{k}-\left[\nabla^{2}\boldsymbol{f}(\boldsymbol{x}_{k})\right]^{-1}\nabla f(\boldsymbol{x}_{k}) xk+1=xk[2f(xk)]1f(xk)

   由上图可以看出通过不断迭代,可以很快收敛到局部最优解,此外,若目标函数 f ( x ) f(x) f(x)本来就是一个二次函数,其泰勒展开式 q k ( d ) q_k(d) qk(d)近似于它自己,此时,采用牛顿方向,就可以从任何地方经过一次迭代就能到达局部最优解。

   所以,对于严格正定的二次函数,采用牛顿方向(步长),可以一步收敛到精确解。

   我们称方程组 ∇ 2 f ( x k ) d = − ∇ f ( x k ) \nabla^2 f(x_k) d=-\nabla f\left(x_{k}\right) 2f(xk)d=f(xk)为Newton方程,由该方程组得到的方向 d p d_p dp为Newton方向.用Newton方向作为迭代方向的最优化方法称为Newton方法.用Newton方法迭代的意义如下图所示,其中粗虚线表目标函数 f ( x ) f(x) f(x)的等高线,细虚线表 q k ( d ) q_k(d) qk(d)的等高线。

   再例如下图中的例子,其中品红色曲线为 x 0 x_0 x0处的二次逼近的等值线,棕色曲线为 x 1 x_1 x1处的二次逼近的等值线


   (2)基本牛顿方法算法流程

   基本Newton方法指取全步长 a k = 1 a_k=1 ak=1的Newton方法, 下面给出基本Newton方法的迭代步骤:


   此外,只要 ∇ 2 f ( x k ) \nabla^2 f(x_k) 2f(xk)正定,Newton方向 d k d_k dk就是下降方向,只要在 x k x_k xk(k=0,1,2,3,…)处 ∇ 2 f ( x k ) \nabla^2 f(x_k) 2f(xk)均正定,迭代就能不停的进行下去

   附:判断一个矩阵是否是正定的方法
  
   一个矩阵是正定的,当且仅当它是对称的(即等于它的转置矩阵)且所有特征值都是正数。特别地,一个正定矩阵是一个非奇异(可逆)矩阵。
  
   判断一个矩阵是否是正定的方法有多种,以下是其中两种常用的方法:
  
   方法① 判断所有特征值是否为正数:设矩阵 A A A 的特征值为 λ 1 , λ 2 , ⋯   , λ n \lambda_1,\lambda_2,\cdots,\lambda_n λ1,λ2,,λn,则 A A A 是正定的当且仅当 λ i > 0 \lambda_i>0 λi>0 对于所有 i = 1 , 2 , ⋯   , n i=1,2,\cdots,n i=1,2,,n
  
   方法②判断所有主子矩阵的行列式是否为正数:设矩阵 A A A k k k 阶主子矩阵为 A k A_k Ak,即 A k A_k Ak A A A 的前 k k k 行和前 k k k 列组成,则 A A A 是正定的当且仅当 A k A_k Ak 的行列式 det ⁡ ( A k ) > 0 \det(A_k)>0 det(Ak)>0 对于所有 k = 1 , 2 , ⋯   , n k=1,2,\cdots,n k=1,2,,n
  
   需要注意的是,这些方法只适用于实对称矩阵,而对于复数矩阵,需要使用其他定义和方法来判断是否是正定的。


   一个简单的牛顿法例子如下(拖动或者双击可查看大图):

--

   下面给出了其迭代过程,并与采用恒定步长0.1的梯度下降法进行了对比,从收敛速度来看,牛顿法更优,从稳定性和占用计算资源来看,牛顿法不占优,如果该凸函数的Hesse矩阵是严格正定的就可以满足稳定性,如果有高效的求解Hesse矩阵的方法,就可以减少计算资源的占用。


   一般从以下三个方面评价一种数值优化方法:

   ①、收敛速度:一般认为在对数精度曲线上随着迭代次数的增加,呈直线下降,一般认为收敛较快,如果是朝下的二次曲线,则认为收敛速度更快,如果是朝上的曲线,则认为收敛速度不佳。

   ②、适用于不同函数时的稳定性:有的要求是强凸的或者凸的,有的可以适应于非凸的函数,甚至是非光滑的函数,甚至是不连续的函数。

   ③、每次迭代的计算量:每次迭代需要计算多大的计算量,一般跟维度和约束个数有关,一般可用收敛速度和计算量(计算耗时)的乘积来衡量


   (3)基本牛顿方法收敛性

   Newton方法的收敛性依赖于初始点的选择.当初始点接近极小点时,迭代序列收敛于极小点,并且收敛很快; 否则就会出现迭代序列收敛到鞍点或极大点的情形,或者在迭代过程中出现矩阵奇异或病态的情形,使线性方程组不能求解或不能很好地求解,导致迭代失败.

   由基本Newton方法的收敛性定理可知,只有当迭代点充分接近a*时,基本Newton方法的收敛性才能保证。


   (4)基本牛顿方法的优缺点

   优点:

   (1)当 x 0 x_0 x0充分接近问题的极小点x * 时,方法以二阶收敛速度收敛;

   (2)方法具有二次终止性.

   缺点:

   (1)当 x 0 x_0 x0没有充分接近问题的极小点x * 时, ∇ 2 f ( x k ) \nabla^2 f(x_k) 2f(xk)会出现不正定或奇异的情形,使{ x k x_k xk}不能收敛到x * ,或使迭代无法进行; 即使 ∇ 2 f ( x k ) \nabla^2 f(x_k) 2f(xk)正定也不能保证{ f k f_k fk}单调下降。

   (2)每步迭代需要计算Hesse矩阵,即计算n(n +1)/2个二阶偏导数.

   (3)每步迭代需要解一个线性方程组,计算量为O( n 3 n^3 n3) 。

   (4)在很多非凸的函数中曲率可能不是正向的曲率,即使Hesse矩阵是半正定的也会出现奇异值是0的情况,不能对Hesse矩阵求逆也就完成不了一次迭代,因此需要规避Hesse矩阵奇异或者不定的情况,才能快速收敛。

   (5)只有当Hesse是正定的时候,它的逆才是正定的,此时乘以一个负梯度方向才能保证牛顿方向与负梯度方向夹角是小于90度的,若Hesse是不定的,则夹角可能是钝角,此时,不能保证牛顿方向是下降方向。即我们要保证牛顿方向与最速下降方向夹角小于90度


   2、阻尼牛顿方法

   为改善Newton方法的局部收敛性质,我们可以采用带一维搜索的Newton方法,即

   x k + 1 = x k + α k d k x_{k+1}=x_{k}+\alpha_k d_k xk+1=xk+αkdk

   其中 a k a_k ak 是一维搜索的结果.该方法称为阻尼Newton方法.此方法能够保证对正定的 ∇ 2 f ( x k ) \nabla^2 f(x_k) 2f(xk),{ f k f_k fk}单调下降;即使 x k x_k xk x ∗ x^* x稍远,该方法产生的点列{ x k x_k xk}仍可能收敛至 x ∗ x^* x

   对严格凸函数,采用Wolfe 准则的阻尼Newton方法具有全局收敛性,且采用Wolfe准则的阻尼Newton方法产生的{ x k x_k xk}满足下列二者之一:

   ① { x k x_k xk}为有穷点列,即存在N,使得 ∇ f ( x N ) \nabla f\left(x_{N}\right) f(xN)= 0;

   ② { x k x_k xk}为无穷点列, { x k x_k xk}收敛到 f f f的唯一极小值点 x ∗ x^* x

   此外,采用精确线搜索、Goldstein 准则等线搜索准则,阻尼Newton方法对严格凸函数的全局收敛性亦存在.


   3、修正阻尼牛顿方法(混合方法)

   Newton方法在迭代的过程中会出现 Hesse矩阵奇异、不正定的情形,Newton方向会出现与梯度 ∇ f ( x k ) \nabla f\left(x_{k}\right) f(xk)几乎正交的情形.为解决这些问题,人们提出了许多修正Newton方法.这些方法或采用与其他方法混合的方式,或采用隐式地、显式地对Hesse矩阵进行修正的方式对Newton方法进行修正.

   笼统来说,修正阻尼牛顿法满足以下框架,其中M是对Hessian矩阵的近似,根据不同的情况,可以选择不同的近似方法,得到不同的M,多种方法组合在一起也就成了混合方法

   (1)

   最简单的修正 Newton方法是针对 ∇ 2 f ( x k ) \nabla^2 f(x_k) 2f(xk)可逆但不正定情形的.即当 ∇ f ( x k ) \nabla f\left(x_{k}\right) f(xk) ∇ 2 f − 1 ( x k ) \nabla^2 f^{-1}(x_k) 2f1(xk) ∇ f ( x k ) \nabla f\left(x_{k}\right) f(xk) <0时,我们可以简单地取

   d k = ∇ 2 f − 1 ( x k ) ∇ f ( x k ) d_k=\nabla^2 f^{-1}(x_k)\nabla f\left(x_{k}\right) dk=2f1(xk)f(xk)

   使 d k d_k dk是下降方向.然而这样的修正不能处理Newton方法可能遇到的各种情形,如下的混合方法可以处理Newton方法可能遇到的各种情形。

   (2)一种混合方法

   所谓的混合方法就是一种方法与另外一种或多种方法混合使用的方法.混合的方式有多种,混合的目的是取各方法所长,或者是在一种方法无法继续迭代下去时,采用另一种方法.使迭代得以继续进行.下面我们要考虑的方法是Newton方法与负梯度方法的混合.该方法采用Newton方向,但在 Hesse矩阵 ∇ 2 f ( x k ) \nabla^2 f(x_k) 2f(xk)奇异或 ∇ f ( x k ) \nabla f\left(x_{k}\right) f(xk) d k d_k dk几乎正交时,采用负梯度方向;在 ∇ 2 f ( x k ) \nabla^2 f(x_k) 2f(xk)负定,但 ∇ 2 f − 1 ( x k ) \nabla^2 f^{-1}(x_k) 2f1(xk)存在时,取 d k d_k dk= ∇ 2 f − 1 ( x k ) \nabla^2 f^{-1}(x_k) 2f1(xk) ∇ f ( x k ) \nabla f\left(x_{k}\right) f(xk).考虑到Newton方法在迭代过程中可能出现的各种情形,我们有如下算法:


   该方法的缺点在于,若迭代过程中连续多步使用负梯度方向,收敛速度会趋于负梯度方法的收敛速度.虽然该方法不是非常有效的方法,然而为了让迭代进行下去,它所采用的混合方式还是有代表意义的。


   (3)LM方法

   LM (Levenberg-Marquardt)方法是处理 ∇ 2 f ( x k ) \nabla^2 f(x_k) 2f(xk)奇异、不正定等情形的一个最简单且有效的方法,它是指求解

   ( ∇ 2 f ( x k ) + ν k I ) d = − ∇ f ( x k ) (\nabla^2 f(x_k)+\nu_kI)d=-\nabla f\left(x_{k}\right) (2f(xk)+νkI)d=f(xk)

   来确定迭代方向的Newton型方法,这里 v k v_k vk >0,Ⅰ是单位阵.显然,若 v k v_k vk足够大,可以保证 ∇ 2 f ( x k ) + ν k I \nabla^2 f(x_k)+\nu_kI 2f(xk)+νkI正定,当 v k v_k vk很小时,上述方程的的解偏向于Newton方向,此时能够保证正定性,随着 v k v_k vk的增大,上述方程的解向负梯度方向偏移.这种修正Newton方法的思想来自解最小二乘问题的LM方法,在后续的文章中讨论关于修正 v k v_k vk的方法.这里当 ∇ 2 f ( x k ) + ν k I \nabla^2 f(x_k)+\nu_kI 2f(xk)+νkI不正定时,我们可以简单地取 v k v_k vk=2 v k v_k vk

   ( ∇ 2 f ( x k ) + ν k I ) (\nabla^2 f(x_k)+\nu_kI) (2f(xk)+νkI)正定时可以对其进行Cholesky分解,分解成一个下三角阵乘一个上三角阵的形式,即 ( ∇ 2 f ( x k ) + ν k I ) (\nabla^2 f(x_k)+\nu_kI) (2f(xk)+νkI)= L L T LL^T LLT,其中L为下三角阵,通过Cholesky分解可以快速求出以上方程。

   LM方法比 Newton方法有效,它能够处理Newton方法所不能处理的情况.


   (4)

   对于一般的非凸函数,它的Hessian矩阵是不定的,我们可以将Hessian矩阵进行Bunch-Kaufman因式分解,分解成 L B L T LBL^T LBLT,L为下三角阵,B为分块对角阵, L T L^T LT为上三角阵。假设B由1个1x1的对角块,和1个2x2的对角块组成。对于1x1的块,要求其为正数,对于2x2的块的两个特征值必然为1正1负,所以在将Hessian矩阵分解成 L B L T LBL^T LBLT后,将其中的B阵的2x2的块更改为与其最接近的正定阵,即2x2的块的两个特征值均为正,然后再利用修改后的方程求出迭代方向。




   参考资料:

   1、数值最优化方法(高立 编著)

   2、机器人中的数值优化


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu入门03——Ubuntu用户操作

1.Ubuntu如何进入root用户 进入ROOT用户的指令&#xff1a; Linux用su命令来切换用户&#xff1a; su root执行命令后&#xff0c;会提示你输入密码&#xff0c;而Ubuntu是没有设置root初始密码的。 若su命令不能切换root&#xff0c;提示su: Authentication failure&#x…

ASP.NET修改默认端口

找到发布目录下的appsettings.json文件 加入下面内容 "Kestrel":{"Endpoints": {"Https": {"Url": "https://*:8827"},"Http": {"Url": "http://*:8828"}}} 不使用https的话去掉https,修改…

二进制安全虚拟机Protostar靶场 安装,基础知识讲解,破解STACK ZERO

简介 pwn是ctf比赛的方向之一&#xff0c;也是门槛最高的&#xff0c;学pwn前需要很多知识&#xff0c;这里建议先去在某宝上买一本汇编语言第四版&#xff0c;看完之后学一下python和c语言&#xff0c;python推荐看油管FreeCodeCamp的教程&#xff0c;c语言也是 pwn题目大部…

【洛谷】P3853 路标设置

原题链接&#xff1a;https://www.luogu.com.cn/problem/P3853 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 整体思路&#xff1a;二分答案 由题意知&#xff0c;公路上相邻路标的最大距离定义为该公路的“空旷指数”。在公路上增设一些路标&…

【ELK日志收集系统】

目录 一、概述 1.作用 2.为什么使用&#xff1f; 二、组件 1.elasticsearch 1.1 作用 1.2 特点 2.logstash 2.1 作用 2.2 工作过程 2.3 INPUT 2.4 FILETER 2.5 OUTPUTS 3.kibana 三、架构类型 1.ELK 2.ELKK 3.ELFK 4.ELFKK 四、案例 - 构建ELK集群 1.环境…

MFC网络编程简单例程

目录 一、关于网络的部分概念1 URL(网址)及URL的解析2 URL的解析3 域名及域名解析3 IP及子网掩码4 什么是Web服务器5 HTTP的基本概念6 Socket库概念7 协议栈8 Socket库收发数据基本步骤 二、基于TCP的网络应用程序三、基于UDP的网络应用程序 一、关于网络的部分概念 1 URL(网址…

git在windows上安装

介绍git工具在windows上如何安装 git官网下载地址 1.1、下载 https://github.com/git-for-windows/git/releases/download/v2.36.0.windows.1/Git-2.36.0-64-bit.exe自行选择版本&#xff0c;这里我选择的是 Git-2.36.0-64-bit这个版本 1.2、安装 安装路径选择英文且不带空格…

【计算机网络】HTTP

文章目录 1.HTTP概念2. URLurlencode 和 urldecode转义规则 3. HTTP的宏观理解HTTP的请求HTTP的响应 4. 见一见HTTP请求和响应请求报头 1. 模拟一个简单的响应response响应报头 2. 从路径中获取内容ReadFile函数的实现 3.不同资源进行区分反序列化的实现ReadOneLine函数的实现P…

docker-compose 部署nacos 整合 postgresql 为DB

标题docker-compose 部署nacos 整合 postgresql 为DB 前提&#xff1a; 已经安装好postgresql数据库 先创建好一个数据库 nacos&#xff0c;执行以下sql: /** Copyright 1999-2018 Alibaba Group Holding Ltd.** Licensed under the Apache License, Version 2.0 (the "…

Java:Springboot和React中枚举值(数据字典)的使用

目录 1、开发中的需求2、实现效果3、后端代码4、前端代码5、接口数据6、完整代码7、参考文章 1、开发中的需求 开发和使用过程中&#xff0c;通常会涉及四个角色&#xff1a;数据库管理员、后端开发人员、前端开发人员、浏览者 数据库使用int类型的数值进行存储&#xff08;e…

POSTGRESQL WAL 日志问题合集之WAL 如何解析

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请加 liuaustin3微信号 &#xff0c;在新加的朋友会分到3群 &#xf…

最小二乘法处理线性回归

最小二乘法是一种数学优化技术&#xff0c;用于查找最适合一组数据点的函数。 该方法主要用于线性回归分析&#xff0c;当然&#xff0c;也可用于非线性问题。 开始之前&#xff0c;我们先理解一下什么是回归。 回归&#xff1a;回归是一种监督学习算法&#xff0c;用于建模和…

MySql时间

一、查询 查询mysql当前时间 SELECT now();查询mysql时区 show variables like%time_zone;二、修改时区 set global time_zone 8:00; &#xff08;修改mysql全局时区为北京时间&#xff0c;也就是我们所在的东8区&#xff0c;需要root权限&#xff09; set time_zone 8:0…

销量蹭蹭上涨!亚马逊上这几款宿舍神器火爆了!

一、BedShelfie床边置物架 每年返校季&#xff0c;收纳工具都是最畅销的产品。在亚马逊床头柜热销榜单中&#xff0c;这款产品位居第二。过去一个月里&#xff0c;有1000多名用户购买了这件产品。 二、U Brands磁性干擦日历板 目前&#xff0c;亚马逊上这款产品已经卖到断货。…

自建音乐服务器Navidrome之一

这里写自定义目录标题 1.1 官方网站 2. Navidrome 简介2.1 简介2.2 特性 3. 准备工作4. 视频教程5. 界面演示5.1 初始化页5.2 专辑页 前言 之前给大家介绍过 Koel 音频流服务&#xff0c;就是为了解决大家的这个问题&#xff1a;下载下来的音乐&#xff0c;只能在本机欣赏&…

The remote endpoint was in state [TEXT_FULL_WRITING]

报这个错是因为在websocket接收与发送消息时&#xff0c;资源互抢造成的&#xff0c;有很多帖子说将session锁住&#xff0c; 但是同一个账号多个客户端登陆的时候&#xff0c;session是不同的&#xff0c;所以只能锁住一个session&#xff0c;还是出现这个问题。 解决办法&a…

Go 官方标准编译器中所做的优化

本文是对#102 Go 官方标准编译器中实现的优化集锦汇总[1] 内容的记录与总结. 优化1-4: 字符串和字节切片之间的转化 1.紧跟range关键字的 从字符串到字节切片的转换&#xff1b; package mainimport ( "fmt" "strings" "testing")var cs10086 s…

正则表达式练习

(function() {//#region 定义正则表达式// const reg /前端/g;// ------------test-------------// const res reg.test("学java,找黑马");// console.log(res)// ------------exec--------------// const res reg.exec("学好前端&#xff0c;找黑马"…

【调试经验】Ubuntu22.04 安装和配置MySQL 8.0.34

本文共计1469字&#xff0c;预计阅读时间5分钟 在安装新版本的MySQL到电脑时&#xff0c;按着网上一些教程执行发现错误繁多&#xff0c;最后索性自己摸索并把服务装好了。自己也整理了一下在操作时的笔记&#xff0c;上传上来希望能帮助到大家。 目录 正文 安装MySQL 配置…

串口接收数据-控制LED灯

目标 通过串口接收数据&#xff0c;对数据分析&#xff0c;控制8个LED灯按照设定时间闪烁。 8个LED灯可以任意设计&#xff0c;是否闪烁。闪烁时间按ms计算&#xff0c;通过串口发送&#xff0c;可设置1~4,294,967,296ms&#xff0c;也就是4字节数据协议自拟&#xff0c;有数…