交通 | 针对Close-Enough旅行商问题的一种分支定界算法

news2024/12/25 13:10:37

在这里插入图片描述

论文解读​:王飞龙,曲晨辉

1、问题背景

\qquad 旅行商问题(TSP)是一种众所周知的路径问题。TSP的目标是在图 G = ( V , E ) G=(V,E) G=(V,E)中找一条以场站为起终点的最短路,访问所有客户点 V V V,同时没有子环路。令 E E E表示网络中的弧集合,每条弧的长度通过欧式范数进行计算,如两个节点 p p p q q q之间的距离 d p q = ∣ ∣ v p − v q ∣ ∣ 2 d_{pq}=||v^p-v^q||_2 dpq=∣∣vpvq2 ,其中 v p v^p vp v q v^q vq分别表示节点 p p p q q q的坐标向量。

\qquad CETSP是TSP的一种变体形式,相比于TSP,CETSP中的每一个客户点均拥有一个覆盖域(covering region),旅行商不需要访问么一个客户点本身,只需要到达每一个客户点的覆盖域之内即可。在本文中,假设每个客户点的覆盖域是一个圆形,则只要旅行商经过以客户点 i i i为圆心,半径为 r i r_i ri的圆形区域 D i D_i Di,或者至少到达圆形区域 D i D_i Di的边缘之后,就称旅行商已经服务过客户点 i i i。CETSP的正式定义如下:给定一个二维空间中的节点集合 V = { 0 , . . . , n } V=\{0,...,n\} V={0,...,n},每一个节点的坐标为 ( x ‾ i , y ‾ i ) , i ∈ V (\overline{x}_i,\overline{y}_i),i\in V (xi,yi),iV,每一个节点 i i i都在其对应的圆形区域 D i D_i Di的圆心, D i D_i Di的半径为 r i r_i ri。假设网络中不存在重复节点,即 ( x ‾ i , y ‾ i ) ≠ ( x ‾ j , y ‾ j ) , i , j ∈ V , i ≠ j (\overline{x}_i,\overline{y}_i)\neq (\overline{x}_j,\overline{y}_j),i,j\in V,i\neq j (xi,yi)=(xj,yj),i,jV,i=j。CETSP需要决策旅行商到达每一个节点覆盖域的坐标 ( x i , y i ) ∈ R 2 , i ∈ V (x_i,y_i)\in \mathbb{R}^2, i \in V (xi,yi)R2,iV(hitting points),和节点的访问顺序 S = ( k 0 , k 1 , . . . , k n ) , k i ∈ V \mathscr{S}=(k_0,k_1,...,k_n),k_i\in V S=(k0,k1,...,kn),kiV,从而使得所有hitting points组成的哈密顿环路的距离最短。下图Figure 1展示了二维空间下的CETSP情景示例。
在这里插入图片描述

\qquad 其中,节点1和3只被访问了覆盖域中的一个点,节点2的覆盖域和当前路径有一段弧的交集。CETSP可以很简单地拓展到三维空间中去,只需要在每一个节点的坐标中添加一个维度即可,e.g., ( x ‾ i , y ‾ i , z ‾ i ) , i ∈ V (\overline{x}_i,\overline{y}_i,\overline{z}_i),i\in V (xi,yi,zi),iV。下图2和3分别展示了CETSP在二维和三维空间中的解方案示意。
在这里插入图片描述
在这里插入图片描述

\qquad CETSP在实践中有许多应用场景。如利用射频识别标签来给传输数据。在特定的物理仪表上安装射频标签,之后使用配备有自动抄表系统(AMR)的卡车来远距离收集仪表中的数据,这样卡车不需要访问每一个物理仪表所在的位置,只需要到达距离物理仪表一定的范围即可完成数据的收集和传输工作。近年来,无人机被广泛应用在军事和民用的各个领域。如空中侦查,火灾检测,船舶跟踪,物资配送,地理区域检测,管道检测等。如果为无人机配备无线传感器,其可以远距离对目标进行服务。

\qquad 本文基于分枝定界(branch-and-bound)算法框架设计了一种可以在有限步求解CETSP的精确算法,将CETSP进行分解,子问题是一个二阶锥规划(SOCP),算法可以求解1000个客户点规模的算例到最优,同时通过改变分枝规则和可行性检验规则,算法也可以处理椭圆形状的覆盖域。

2、针对CETSP的分枝定界算法框架

\qquad CETSP的BB框架的整体描述如下:分枝树中每一个节点均表示一个最优的路径片段(partial path),其中只访问了一部分客户点。在根结点,算法随机选择两个客户点作为初始序列的访问客户,同时可知,在TSP问题情境中,由于距离矩阵是对称的,所以只访问两个客户点没有顺序限制,正序和逆序访问的解是等效的。从而可以使用这两个随机选定的客户点组成的序列初始化分枝树的根结点,将这个序列输入到子问题SCOP模型中,得到的解作为原问题的一个有效下界。

\qquad 在分枝的过程中,若所有的客户点均被访问了,并且通过求解子问题得出当前序列是可行的,则找到原问题的一个有效上界,否则需要对分枝树结点进行分枝,随机选择一个未访问的客户点插入到当前序列的每一个位置。当出现下述两种情况时,对分枝树进行剪枝:某个分枝结点的下界解不小于当前最优上界解或者某个分枝结点中的客户点序列中包含所有的客户点。

\qquad 注意到,每一个分枝结点生成的子结点个数为当前分枝结点中包含的结点数量(场站算作一个节点)。下图4展示了包含6个客户点的分枝树示例。
在这里插入图片描述

\qquad 上图4中,未被访问的客户点被罗列在每一个分枝结点的右侧方框内,使用加粗表示选定插入的客户点。在这个情境中,根结点的节点序列选定为:0-3-6-0。之后,客户点1被选定插入到0-3-6-0的每一个位置中,生成3个子结点(如图4第二层所示)。当客户1被插入到0-3-6-0的第一个和第二个位置时,客户4可以被顺便访问到,从而0-1-3-6-0和0-3-1-6-0不需要重复访问客户4,但0-3-6-1-0需要对客户4进行访问。之后再对第二层的节点进行分枝,为了简单起见,图中没有罗列出剪枝的情况。最终,得到最优路径为0-3-1-6-5-0。

\qquad 分析分枝树中的节点数量,在分枝树的某一层 l l l最多生成的分枝结点数量为 ( l + 2 ) ! / 2 (l+2)!/2 (l+2)!/2,在最坏情况下,整个分枝过程生成的分枝结点数量为: ∑ l = 0 n ( ( l + 2 ) ! / 2 ) = O ( ( n + 2 ) ! ) \sum_{l=0}^n((l+2)!/2)=\mathscr{O}((n+2)!) l=0n((l+2)!/2)=O((n+2)!)

2.1 算法描述和精确性分析

\qquad N k \mathcal{N}_k Nk表示第 k k k个分枝树结点,其由一系列节点顺序组成: ( i 0 , . . . , i q ) (i_0,...,i_q) (i0,...,iq) N k \mathcal{N}_k Nk的子问题需要寻找在当前顺序下,访问顺序中每个节点的最优路径。令 c ( N k ) c(\mathcal{N}_k) c(Nk) V ( N k ) \mathscr{V}(\mathcal{N}_k) V(Nk)分别表示当前路径的成本和节点集合。

  • V ( N k ) = V \mathscr{V}(\mathcal{N}_k)=V V(Nk)=V,则当前节点无需进行后续分枝,被认定为求解完毕,同时使用求解完之后的路径成本更新上界解的值;

  • c ( N k ) c(\mathcal{N}_k) c(Nk)不小于当前最优上界,则表明继续对 N k \mathcal{N}_k Nk进行分枝也不能生成更优的解方案,则 N k \mathcal{N}_k Nk被认定为剪枝;

  • 否则,选定一个未访问的节点 i ∗ i^* i插入到 N k \mathcal{N}_k Nk中并生成 q q q个新的分枝子结点,则 N k \mathcal{N}_k Nk被认定为已处理

\qquad 文中对branch and bound求解CETSP的算法精确性进行了简单证明,应用了反证法的思路,首先令 S \mathscr{S} S 表示最优解方案的序列,令 c ∗ c^* c表示最优解目标值,令 N \mathcal{N} N表示一个被剪枝掉的关于 S \mathscr{S} S的一个子序列。根据动态规划的最有性保证,全局最优情况下可以推出局部最优, N \mathcal{N} N作为最优解 S \mathscr{S} S的子序列,存在关系 c ( N ) ≤ c ∗ c(\mathscr{N})\leq c^* c(N)c成立。若 N \mathcal{N} N被剪枝,则说明有另外一个序列的解方案的值优于 c ∗ c^* c,违背了 S \mathscr{S} S为最优解方案的假定,从而 N \mathcal{N} N不会被提前剪枝。

2.2 二阶锥规划

\qquad 为了求解分枝树中每一个结点的子问题,文中提出了一个二阶锥规划模型(SOCP)。令 S = ( i 0 , . . . , i q ) \mathscr{S}=(i_0,...,i_q) S=(i0,...,iq)表示一个分枝树分枝过程中某个分枝结点中的路径序列片段。子问题的的SOCP模型是为了寻找旅行商到达路径序列中每一个节点的位置坐标, ( x i k , y i k ) , k = 0 , . . . , q (x_{i_k},y_{i_k}),k = 0,...,q (xik,yik),k=0,...,q,从而使得路径片段的长度最小化。令 i − 1 = i q i_{-1}=i_q i1=iq,SOCP的形式如下所示:
在这里插入图片描述

\qquad 在SOCP模型中,目标函数(1)是线性的,变量 z k z_k zk表示旅行商在第 k − 1 k-1 k1个节点和第 k k k个节点之间行走的欧式距离。变量 w k , u k , s k , t k w_k, u_k, s_k, t_k wk,uk,sk,tk用来表示坐标之间的差值。二阶锥约束(6)表示当前分枝结点中,旅行商在不同节点之间行走的距离约束;二次约束(7)表示旅行商到达每一个节点的位置均需要在当前节点的覆盖域之内。约束(8)和(9)表示变量的取值范围约束。

\qquad SOCP可以再多项式时间内进行有效求解,同时,一些成熟的商用求解器,如CPLEX, Gurobi等都可以用来对SOCP进行有效求解。

2.3 根结点松弛

\qquad 根结点需要选择两个客户点组成初始序列,作为原问题的初始松弛问题。文章采用下述方式进行根结点序列的构建。首先选择场站作为根结点中的第一个节点,之后选择距离场站最近的节点作为第二个节点插入到根结点序列之中。第三个节点的选择需要将剩余没有服务的节点依次插入到根结点序列中,并求解不同序列的SOCP,选择下界值最大的SOCP对应的节点作为根结点的第三个节点。

2.4分枝树结点的可行性检测

\qquad 每一个分枝树结点的可行性检查就是需要检查当前是否所有节点均被服务到了,若是,则称当前分枝树是可行的。可行性检查的关键在于判断当前没有直接访问的客户点的覆盖域是否可以被当前已经构建的路径中的某条弧经过。令 d i ^ \hat{d_i} di^表示当前解方案中距离客户点 i i i最近的弧和客户点 i i i之间的距离,若 d i ^ > r i \hat{d_i}>r_i di^>ri说明客户点 i i i没有被访问到,则将客户点 i i i计入未访问的客户点集合 V ^ = { i ∈ V : d i ^ > r i } \hat{V}=\{i \in V:\hat{d_i}>r_i\} V^={iV:di^>ri}。若 V ^ = ∅ \hat{V}=\empty V^=,则说明当前结点的解方案已经可行。下面主要介绍对于一个选定的客户点 c c c怎样计算其到某一条弧 p 1 p 2 ‾ \overline{p_1p_2} p1p2的最短距离。客户点 c c c和弧 p 1 p 2 ‾ \overline{p_1p_2} p1p2之间的最短距离可以通过求解 d ^ = m i n 0 ≤ θ ≤ 1 ∣ ∣ ( 1 − θ ) p 1 + θ p 2 − c ∣ ∣ \hat{d}=min_{0 \leq \theta\le 1}||(1-\theta)p_1+\theta p_2-c|| d^=min0θ1∣∣(1θ)p1+θp2c∣∣子优化问题进行求解。其解析解表达形式如下所示:KaTeX parse error: Got function '\rm' with no arguments as superscript at position 22: …^*=-(p_2-p_1)^ \̲r̲m̲{T}(p_1-c)/||p_…,从而最短距离可以通过下式(10)进行计算。

d ^ = { ∣ ∣ p 1 − c ∣ ∣ ,    i f    θ ∗ ≤ 0 ∣ ∣ p − c ∣ ∣ ,    i f    0 < θ < 1 ∣ ∣ p 2 − c ∣ ∣ ,    i f    θ ≥ 1 \begin{equation} \tag{10} \hat{d}=\left\{ \begin{aligned} %\nonumber &||p_1-c||,\ \ if\ \ \theta^*\le 0\\ &||p-c||,\ \ if\ \ 0<\theta < 1 \\ &||p_2-c||,\ \ if\ \ \theta \ge 1 \\\end{aligned} \right.\end{equation} d^= ∣∣p1c∣∣,  if  θ0∣∣pc∣∣,  if  0<θ<1∣∣p2c∣∣,  if  θ1(10)

\qquad 其中 p = ( 1 − θ ∗ ) p 1 + θ ∗ p 2 p={(1-\theta^*)p_1+\theta^*p_2} p=(1θ)p1+θp2。假设当前有问题中有 n n n个节点,有 e e e条边,则可行性检查的时间复杂度为: O ( n e ) \mathscr{O}(ne) O(ne),这种检验规则在二维和三维空间之中均适用。

2.5 分枝规则

\qquad 文章基于算例中客户点的覆盖域的半径分布情况,提出了两种分枝方法。所谓的分枝方法就是选择一个未被访问的客户点,将其插入到当前分枝结点对应的序列中。

\qquad 如果所有未被服务的客户点的覆盖域半径均相同,则第一种分枝方法如下执行:首先计算所有未服务的节点中的 d ^ k , k ∈ V ^ \hat{d}_k,k\in \hat{V} d^k,kV^,之后选择其中最大的 d ^ k \hat{d}_k d^k对应的客户点作为分枝待插入的客户点,其示意图如下图6所示。
在这里插入图片描述

\qquad 这样的分枝规则保证了将节点插入到当前序列之后,下界的增量为 m a x k ∈ V ^ { d ^ k } max_{k\in \hat{V}}\{\hat{d}_k\} maxkV^{d^k}的一定比例,但如果所有未被访问的客户点的覆盖域半径不相同,则上述结论也不成立,需要使用下述第二种分枝规则进行分枝。

\qquad 对于第二种分枝规则,首先需要估计将某个未被服务的客户点 k ∈ V ^ k\in\hat{V} kV^插入到当前序列中后下界增量,记为 r k r_k rk。为了计算 r k r_k rk,首先计算出 D k D_k Dk边界上的一个点 p ~ k \tilde{p}_k p~k,使得 p ~ k \tilde{p}_k p~k到最近的弧 p 1 p 2 ‾ \overline{p_1 p_2} p1p2的距离最短。令 e ~ 1 k \tilde{e}_1^k e~1k e ~ 2 k \tilde{e}_2^k e~2k分别表示 p ~ k \tilde{p}_k p~k p 1 p_1 p1 p 2 p_2 p2的距离,令 e i j e_{ij} eij表示弧 p 1 p 2 ‾ \overline{p_1 p_2} p1p2的长度,则 r k = e ~ 1 k + e ~ 2 k − e i j r_k=\tilde{e}_1^k +\tilde{e}_2^k- e_{ij} rk=e~1k+e~2keij。计算完所有未访问客户点的 r k r_k rk之后,选定其中最大的 r k r_k rk对应的客户点作为分枝客户点。第二种分枝规则的示意图如下图7所示。
在这里插入图片描述

3、计算试验和结果

\qquad 作者进行了一系列的实验,以选择在计算上最有效的分支策略。主要使用了以下策略进行测试:深度优先搜索、广度优先搜索和最佳优先搜索。结果显示,最佳优先搜索是最适合应用于文章算法的策略。所提出的算法在824个实例中进行了测试,这些实例由Mennell(2009)和Behdani和Smith(2014)提出。

3.1 Behdani和Smith(2014)的小实例发现的结果

\qquad 表1显示了对Behdani和Smith(2014)的实例所发现的结果的总结。可以看出,所有的实例都在几秒钟内被解决到了最优状态。
在这里插入图片描述

3.2 为Mennell(2009)的二维实例找到的结果

\qquad 表2列出了Mennell(2009)的2D实例的结果。每个实例的时间限制为4小时。新的改进(最优)解决方案以黑体字突出显示。通过观察表2的结果,我们可以看到文章提出的B&B算法找到了62个实例中22个的最优解。
在这里插入图片描述
在这里插入图片描述

\qquad 我们还可以证实,所有文献中的下限都得到了极大的改善。此外,重叠率越大,算法的效果越好。这在某种程度上是意料之中的,因为最佳旅游路线中的顶点数量往往与重叠率值成反比,从而有助于B&B算法快速收敛到最佳解决方案,因为整个树上需要探索的节点较少。下图8-10描述了部分相关的最优路由。
在这里插入图片描述

3.3 为Mennell(2009)的三维实例找到的结果

\qquad 表3列出了Mennell(2009)的三维实例所得到的结果。本表中各列的含义与上一节相同。我们的算法找到了42个实例中的10个最优解。此外,所有的下限都得到了改善。图11-13中显示了一些相关的最优路由。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.4 重叠率对算法性能的影响

\qquad 如前所述,实例的难度与它的重叠率有关。在这一节中,我们提供了一些关于算法在对一个实例采用不同重叠率时的性能的见解。

\qquad 重叠率可以简单地定义为每个顶点的半径和涉及它的矩形的最大边,也就是说, o v e r l a p r a t i o = r / l m a x overlap ratio=r/l_{max} overlapratio=r/lmax,其中 r r r是每个覆盖圆的大小。对于Mennell(2009)建议的名为TSPLIB问题的基准数据集,所有顶点都有相同的半径。因此,我们可以通过将 r r r乘以一个常数 f f f来改变每个实例的重叠率,这里表示为半径因子。

\qquad 鉴于此,我们可以进行一个简单的实验来证明重叠率对分支和边界算法性能的影响。具体来说,我们对上述基准数据集的每个实例都运行了提出的算法,但考虑了 f f f的不同值,范围从0.5到1.5。

\qquad 正如预期的那样,该算法的性能随着顶点之间重叠度的增加而提高。此外,B&B节点的数量以及计算时间高度依赖于每个实例的重叠率。因此,对于顶点半径非常小的实例,枚举方案在实践中可能会失败。还要注意的是,如果重叠率下降到某一数值,这些性能指标可能会爆炸。一些实例的结果显示在图14-17中,从图中可以看出,以对数尺度,树的大小(连续线)和计算时间(虚线)是如何随着重叠率的增加而减少的。
在这里插入图片描述

在这里插入图片描述

4、结论和总结

\qquad 文章基于branch and bound算法框架,针对CETSP提出了一种精确求解算法,其中每个分枝结点的子问题都需要求解一个二阶锥规划来计算每一个客户点覆盖域中的最优访问位置。文章对824个benchmark算例进行了测试和计算,得到了其中752个算例的最优解方案,同时对于算例的整体下界有明显的改善。

\qquad 通过算例验证,文中提出的算法对于节点覆盖域重叠较大的算例计算效果较好,对于节点覆盖域重叠较小的算例(更加贴近TSP情景)的算例计算效果较差。从而后续研究可以针对节点覆盖域重叠较小的情景设计更加有效的方法来提升“根结点松弛”策略,加速此类算例的求解速度。

参考文献
Coutinho, W. P., Nascimento, R. Q. D., Pessoa, A. A., & Subramanian, A. (2016). A branch-and-bound algorithm for the close-enough traveling salesman problem. INFORMS Journal on Computing, 28(4), 752-765.

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【复习30-35题】【每天40分钟,我们一起用50天刷完 (剑指Offer)】第二十一天 21/50

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

几款ai绘画二次元关键词软件分享给你

伴随着二次元文化的兴起&#xff0c;越来越多的人开始关注和喜爱这种独特的漫画风格。二次元绘画风格确实赏心悦目&#xff1a; 当然&#xff0c;绘画创作是二次元文化中不可或缺的部分&#xff0c;很多人也因此对绘画更加热爱。然而&#xff0c;想要制作二次元比较好看的绘画并…

RocketMQ5.0的Broker主从同步机制

RocketMQ5.0的Broker主从同步机制 一、主从同步工作原理 为了提高消息消费的高可用性&#xff0c;避免Broker发生单点故障引起存储在Broker上的消息无法及时消费&#xff0c; RocketMQ引入Broker主备机制&#xff0c;即&#xff1a;消息消费到达主服务器后需要将消息同步到消…

15分钟真正搞懂什么是“交叉熵损失函数”

大家好啊&#xff0c;我是董董灿。 在你刚学习神经网络的时候&#xff0c;有没有被一个名字叫做“交叉熵”的概念绕的云里雾里&#xff0c;以至于现在看到这个概念&#xff0c;依然很懵。 今天就来看一下&#xff0c;这个所谓的“交叉熵”到底是什么&#xff0c;以及它在神经…

【项目级面试题】关于前端鉴权这块,能详细的说说吗?

如果有人问你&#xff1a;”你做了这么多年的开发&#xff0c;关于前端鉴权这块&#xff0c;能详细的说说吗&#xff1f;“。你该如何作答&#xff0c;脑海中有没有一个完整的思路。 像 Token、Cookie、Session、JWT、单点登录 这些概念&#xff0c;它们的作用、应用场景、如何…

【C#】并行编程实战:使用 PLINQ(3)

PLINQ 是语言集成查询&#xff08;Language Integrate Query , LINQ&#xff09;的并行实现&#xff08;P 表示并行&#xff09;。本章将继续介绍其编程的各个方面以及与之相关的一些优缺点。 本文的主要内容为 PLINQ 中的组合并行和顺序 LINQ 查询、取消 PLINQ 查询、使用 PLI…

Azure AD混合部署,实现在本地AD同步到AAD上面

一、前期准备 1、进入 Azure云 注册一个账号 云计算服务 | Microsoft Azure 2、进入 AAD 管理后台 Microsoft Azure 3、创建一个新的租户 4、添加自定义域名&#xff0c;这里要做下验证&#xff0c;所以你要有个线上的域名 5、创建一个全局管理员 6、登陆本地AD&#xff0c;创…

第133页的gtk+编程例子——计算器应用改写网上的例子

第133页的gtk编程例子——计算器应用改写网上的例子 来源&#xff1a;《GTK的计算器》 https://blog.csdn.net/zhouzhouzf/article/details/17097999 重点在于它的设计思路是比较巧妙的&#xff0c;能够处理多种情况&#xff0c;比较容易理解&#xff0c;也感到人类的思想是非…

Java进程ProcessBuilder类的介绍及使用,ProcessBuilder调用外部程序执行shell命令Linux命令

目录 ProcessBuilder类的介绍及使用 【前言】 【正文】 --构造方法-- --常用方法-- --使用技巧-- --调用本地Shell命令&#xff0c;实例-- 【总结】 【注意】 ProcessBuilder类的介绍及使用 【前言】 在做一个项目的时候需要用到运行时动态执行JAVA命令&#xff0c;一…

常用数据聚类算法总结记录与代码实现[K-means/层次聚类/DBSACN/高斯混合模型(GMM)/密度峰值聚类/均值漂移聚类/谱聚类等]

本文的主要目的是总结记录日常学习工作中常用到的一些数据聚类算法&#xff0c;对其原理简单总结记录&#xff0c;同时分析对应的优缺点&#xff0c;以后需要的时候可以直接翻看&#xff0c;避免每次都要查询浪费时间&#xff0c;欢迎补充。 聚类算法是一种无监督学习的方法&am…

chrales过期重装或使用途中的踩坑记录及使用方法

1、背景 我的是证书过期了&#xff0c;提示无网络。 1. 重新下载 安装(或者 不需要重新下载安装&#xff0c;用已有的就可以) 2. 重新进行配置 3. (关键)检查电脑上的 证书过期时间 4. (关键)检查手机上的证书过期时间 5. (手机配置好后&#xff0c;点开链接显示无网络&#…

Android:简单登录界面

一、前言&#xff1a;这个登陆界面我前前后后写了差不多一个星期&#xff0c;主要有密码登录、验证码登录、键盘自动隐藏、忘记密码、新建密码等功能&#xff0c;你们可以自己研究一下&#xff01; 二、上代码&#xff1a; 资源文件 1.在value包下面添加一个dimens.xml <…

对性能测试评估分析优化市场的反思

目录 前言&#xff1a; 性能市场的现状 性能测试人员的价值体现 年龄和加班 性能行业的出路 前言&#xff1a; 性能测试评估分析和优化是一个关键的环节&#xff0c;它可以帮助我们了解系统的性能瓶颈和潜在问题&#xff0c;并提出相应的优化方案。在市场竞争激烈的环境下…

Cesium 实战 - AGI_articulations 扩展:模型自定义关节动作

Cesium 实战 - AGI_articulations 扩展&#xff1a;模型自定义关节动作 简要概述两种方式实现模型组件动作模型添加关节&#xff08;articulations&#xff09;1.导入模型&#xff08;J15.glb&#xff09;2.查看模型内部组件信息&#xff08;名称&#xff09;4.将需要J15.glb复…

Docker常见命令(以备不时之需)

参考官网&#xff1a;https://docs.docker.com/engine/reference/commandline/cli/ 帮助启动类命令 启动docker&#xff1a; systemctl start docker 停止docker&#xff1a; systemctl stop docker 重启docker&#xff1a; systemctl restart docker 查看docker状态&…

架构训练营笔记系列:面向复杂度的设计

面向复杂度的设计 DDD 是可扩展架构的设计技巧&#xff0c;不是架构方法论。不关注高性能、高可靠。 架构本质&#xff1a;为了降低软件系统复杂度 怎么做架构设计 &#xff1f;思路是分析系统需求找到系统复杂的地方&#xff0c;然后设计方案。 复杂度相关有哪些&#xff1…

Unity的PostProcessing后处理使用介绍

大家好&#xff0c;我是阿赵。 上一篇文章说了Unity的PostProcessing后处理有bug并提供了解决办法&#xff0c;这里顺便介绍一下PostProcessing的用法。 一、安装 打开PackageManager&#xff0c;然后搜索Post&#xff0c;应该就能看到左边出现搜索结果&#xff0c;选择&…

一个人的面相能直接反映其个性与命运

中国传统文化&#xff0c;博大精深&#xff0c;面相学只是其中一种。 在古代&#xff0c;面相学却是一门非常实用的学科&#xff0c; 尤其是经过了一代代人的发展&#xff0c;面相学得到了完善之后&#xff0c;他的准确性往往会超过现代人的预料。相由心生&#xff0c;面相是对…

用户端App 测试方法与技术

目录&#xff1a; app测试体系app项目测试流程app结构讲解app测试设计思路app常见bug解析常用模拟器使用android开发者选项安装mumu模拟器adb命令介绍adb环境搭建与配置adb与设备交互adb安装卸载应用adb命令启动页面adb命令清缓存adb文件传输adb日志操作adb命令操作Android设备…