雷达算法 | 一种适用于汽车雷达的聚类算法研究与分析

news2024/11/23 20:14:40

在这里插入图片描述

本文参考TI的一种适用于汽车雷达的聚类算法研究和实现.pdf文档,原文链接如下:https://www.ti.com.cn/cn/lit/an/zhca739/zhca739.pdfts=1672973254109&ref_url=https%253A%252F%252Fwww.google.com.hk%252F。

由于不涉及硬件,因此本文仅对算法部分进行分析,需要用到硬件分析部分的读者,可以直接参考原文。

1.概述

雷达接收处理包括射频前端,基带信号处理后处理算法三部分:

(1)射频前端完成高频雷达接收信号的模拟域信号处理和数模转换(ADC);

(2)基带信号处理在零中频上完成雷达接收信号的数字信号处理(DSP)和目标检测;

(3)在目标检测之后的高层算法被统称为后处理算法,如聚类(Clustering)、 关联(Association)、跟踪(Tracking)、分类(Classification)等。

这三部分是雷达工程师需要重视的,建议进行系统性地学习,多看、多思考、多动手实践。本文主要是针对后处理算法中的一种聚类算法做分析,解决汽车雷达目标由于目标尺寸、雷达发射系数(RCS)和检测算法的不同所带来的一系列问题。

聚类算法的本质是“物以类聚,人以群分”思想,只有“志同道合”的点云才会被归为一类。本文选取了 DBSCAN(Density-Based Spatial Clustering of Application with Noise)作为适合汽车雷达的聚类算法,重点研究了这种算法的性能和参数敏感性,并提出了一种简单可行的参数调整(有点类似于自适应)方法。

2.算法背景

线性快速频率调制连续波(Linear Fast FMCW) 是一种频率随时间快速线性变化(斜率在几十 MHz/us)的雷达波形,由于它可以提供较高的分辨率,同时有效地解决距离-速度模糊性的问题,当前已经成为主流的汽车雷达波形。

常用的信号处理链流程如下图所示:

在这里插入图片描述
(图1:雷达信号处理链)

首先,通过第一维和第二维 FFT 计算获得目标距离和速度,然后采用特定的角度估计算法(例如 FFT,MUSIC 等)来获得目标的角度,最后再通过特定的目标检测算法(例如 CFAR-CA、CFAR-OS 等)从噪声中检测获得反射点。随着目标的尺寸、雷达发射系数(RCS)和检测算法的不同,一个物体在目标检测后可能产生从几个到几百个不同的反射点。

如果通过聚类算法分析这些反射点的内部结构,将属于同一 个物体的反射点归为一个簇,这样每一个检测到的物体都形成一个簇,最后再通过对聚类以后的簇进行目标跟踪和分类, 可以获得可靠的物体的距离和移动速度。

3.汽车雷达聚类算法

聚类在无监督机器学习领域是一个非常热门的研究课题,近年来出现了许多的算法。现有的聚类算法可以大致分为:原型聚类(Prototype-based clustering)、密度聚类 (Density-based clustering) 和层次聚类 (Hierarchical clustering)三个类别。

(1)原型聚类

通常,假设聚类结构能通过一组原型刻画,在现实聚类算法中比较常用。通常情况下,算法先对原型进行初始化,然后对原型进行迭代更新求解。采用不同的原型表示,不同的求解方式,将产生不同的算法。常见的原型聚类算法有 k 均值方法 (k-means)、高斯混合聚类方法 (Mixture-of-Gaussian) ,在数据挖掘领域被广泛应用,但是这些算法都要求在聚类之前就确定输出的簇的数量。对于汽车雷达来说,也就是要求在聚类之前就确定目标的数量,这显然是无法做到的,因为汽车雷达无法确定当前的目标数量是多少。

(2)层次聚类

层次聚类尝试在不同层次对数据集进行划分,从而形成树形的聚类结构。层次聚类可以采用“自下而上”的聚类策略,也可以采用“自上而下”的聚类策略。AGNES 方 法 (AGglomerative NESting)是一种常用的“自下而上”的层次聚类算法。然而这种算法面临和原型聚类相同的问 题,也需要在聚类之前确定输出的簇的数量,因此也无法直接应用到汽车雷达上,因此就只剩下了密度聚类。

(3)密度聚类

密度聚类(Density-based clustering)没有其它两种聚类的限制,不需要事先确定簇的数量。密度聚类假设簇的 结构能通过目标点分布的紧密程度来确定。在密度聚类中,簇被认为是数据空间中目标点密集的区域,在簇之间出 现的低密度的目标点被认为是噪声. 这些簇可以有任意的形状,并且簇内的目标点也可以任意分布,这一点和汽车 雷达上的检测目标特性十分接近。汽车雷达对应同一个目标的检测点之间距离接近,并且这些点的密度分布是一定 的(这个密度分布和物体的反射特性相关)。因为具备以上这些特性,密度聚类更加适合于汽车雷达的应用,DBSCAN 算法是一种常用的密度聚类算法(可以清晰地知道,DBSCAN能够用于汽车雷达的本质原因)。

4.聚类算法指标

一个好的聚类结果的目标点应该具有高的簇内相似性和低的簇间相似性,在低维度数据集上, 聚类性能的好坏通过可视化的数据分布图就可以直观的看出来,但是通过度量指标来定量地衡量聚类性能的好坏更加准确。

参考文献[2] 给出了常用的聚类性能度量 DI (Dunn Index), DBI (Davies-Bouldin Index) ,这两种度量在原理上类似,本文选择 DI 作为分析聚类性能的度量指标。假设数据集𝐷𝐷 = {𝑥1, 𝑥2, … , 𝑥𝑚}被划分成了𝑘个簇 𝐶 = {𝐶1, 𝐶2,… , 𝐶𝑘}, DI 的定义如下:

D I = min ⁡ 1 ≤ i ≤ k { min ⁡ j ≠ i ( d min ⁡ ( C i , C j ) max ⁡ 1 ≤ l ≤ k diam ⁡ ( C l ) ) } D I=\min _{1 \leq i \leq k}\left\{\min _{j \neq i}\left(\frac{d_{\min }\left(C_i, C_j\right)}{\max _{1 \leq l \leq k} \operatorname{diam}\left(C_l\right)}\right)\right\} DI=min1ik{minj=i(max1lkdiam(Cl)dmin(Ci,Cj))}

上式中的分母对应的是所有簇内目标点之间的最大距离,分子对应的是所有簇间目标点之间的最小距离。显然同于同一个数据集,一个聚类结果对应的 DI 越大,聚类的性能越好。即:最大距离越小,说明点云越集中,则点云越相似

5.DBSCAN算法分析

5.1 算法定义

DBSCAN算法比较容易理解,它基于一组“邻域” (neighborhood) 参数(𝜀, 𝑀inPts)来刻画样本分布的紧密程度。给定数据集𝐷 = {𝑥1, 𝑥2, … , 𝑥𝑚}, 定义下面几个概念:

在这里插入图片描述

DBSCAN 算法先任选数据集中的一个核心对象为种子 (seed), 将它的 ε-邻域 中的所有样本加入一个簇,新加入的样本如果是核心对象,再将这个核心对象的 ε-邻域中的所有样本加入本簇。通过这种递归搜索,将所有密度相连的样本归入一个簇。如果此时数据集中还有未处理的核心对象,再重复上述的过程开始一个新簇的搜索。DBSCAN 算法的伪代码描述如下图所示:

图片
(图2:DBSCAN算法描述)

5.2 算法代码

读者根据上述算法流程编写仿真代码应该是不难的,这也是一名工程师必备的职业素养。如果实在有困难,那可以参照下面的代码(https://blog.csdn.net/yuanshixin_/article/details/117409961),这也是网友编写的,调皮哥验证过,好使。

clc;clear all;close all;
%% 数据
X1 =[5.1,3.5,1.4,0.2;%,Iris-setosa
4.9,3.0,1.4,0.2;
4.7,3.2,1.3,0.2;
4.6,3.1,1.5,0.2;
5.1,3.7,1.5,0.4;
4.6,3.6,1.0,0.2;
5.1,3.3,1.7,0.5;
5.0,3.6,1.4,0.2;
5.4,3.9,1.7,0.4;
4.6,3.4,1.4,0.3;
5.0,3.4,1.5,0.2;
4.4,2.9,1.4,0.2;
4.9,3.1,1.5,0.1;
5.4,3.7,1.5,0.2;
4.8,3.4,1.6,0.2;
4.8,3.0,1.4,0.1;
4.3,3.0,1.1,0.1;
5.8,4.0,1.2,0.2;
5.7,4.4,1.5,0.4;
5.4,3.9,1.3,0.4;
5.1,3.5,1.4,0.3;
5.7,3.8,1.7,0.3;
5.1,3.8,1.5,0.3;
5.4,3.4,1.7,0.2;
6.4,3.2,4.5,1.5;%Iris-versicolor
6.9,3.1,4.9,1.5;
5.5,2.3,4.0,1.3;
6.5,2.8,4.6,1.5;
5.7,2.8,4.5,1.3;
6.3,3.3,4.7,1.6;
4.9,2.4,3.3,1.0;
4.9,2.4,3.3,1.0;
6.6,2.9,4.6,1.3;
5.2,2.7,3.9,1.4;
5.0,2.0,3.5,1.0;
5.9,3.0,4.2,1.5;
6.0,2.2,4.0,1.0];
X=X1(:,3:4);
A = X;
%% 观察数据距离,估计epsilon
[index,Dist] = knnsearch(A(2:end,:),A(1,:));
Kdist(1) = Dist;
for i = 1:size(A,1)
[index,Dist] = knnsearch(A([1:i-1,i+1:end]😅,A(i,:));
Kdist(i) = Dist;
end
sortKdist = sort(Kdist,‘descend’);
distX = 1:size(A);
plot(distX,sortKdist,‘r±’);
grid on;
%% 运行DBSCAN
% parament1
epsilon = 0.15;
minPts = 3;
[IDC,isnoise] = DBSCAN(epsilon,minPts,A);
PlotClusterinResult(A,IDC,epsilon,minPts);
% parament2
epsilon= 0.25 ;
minPts= 3 ;
[IDC2,isnoise2] = DBSCAN(epsilon,minPts,A);
PlotClusterinResult(A,IDC2,epsilon,minPts);
function [IDC,isnoise] = DBSCAN(epsilon,minPts,X)
% DBSCAN
C = 0;
D = pdist2(X,X); % 各元素之间距离
IDC = zeros(size(X,1),1);
visited = false(size(X,1),1); % 访问标志
isnoise = false(size(X,1),1); % 噪声
for i = 1:size(X,1)
if ~visited(i)
visited(i) = true;
Neighbors = find(D(i,:)<=epsilon); % 找领域样本
if numel(Neighbors)<minPts
isnoise(i) = true;
else
C = C + 1;
[IDC,isnoise] = expandCluster(i,Neighbors,C,IDC,isnoise); % 以核心对象X(j)扩展簇
end
end
end
function [IDC,isnoise] = expandCluster(i,Neighbors,C,IDC,isnoise)
% 针对核心对象X(i)进行扩展
IDC(i) = C; % 将X(j)的领域元素规定为族C
k = 1;
while true
j = Neighbors(k);
if ~visited(j)
% 针对未访问元素继续寻找领域样本
visited(j) = true;
Neighbors2 = find(D(j,:)<=epsilon);
if numel(Neighbors2) >= minPts
Neighbors = [Neighbors,Neighbors2]; % X(j)也是核心对象
end
end
IDC(j) = C; %
k = k +1;
if k > numel(Neighbors)
break;
end
end
end
end
function PlotClusterinResult(X, IDC,epsilon,minPts)
figure;
k=max(IDC);
Colors=hsv(k);
Legends = {};
for i=0:k
Xi=X(IDC==i,:);
if i~=0
Style = ‘x’;
MarkerSize = 8;
Color = Colors(i,:);
Legends{end+1} = [‘Cluster #’ num2str(i)];
else
Style = ‘o’;
MarkerSize = 6;
Color = [0 0 0];
if ~isempty(Xi)
Legends{end+1} = ‘Noise’;
end
end
if ~isempty(Xi)
plot(Xi(:,1),Xi(:,2),Style,‘MarkerSize’,MarkerSize,‘Color’,Color);
end
hold on;
end
hold off;
axis equal;
grid on;
legend(Legends);
legend(‘Location’, ‘NorthEastOutside’);
title(['DBSCAN Clustering (\epsilon = ’ num2str(epsilon) ', MinPts = ’ num2str(minPts) ‘)’]);
end

执行效果:

在这里插入图片描述

在这里插入图片描述
(图3:DBSCAN聚类结果)

5.3 参数敏感性分析

通过上述的代码,相信读者也能够看出DBSCAN算法的性能对这两个参数非常敏感,因此如何设置算法的入参对聚类的效果非常重要,输入不合适的参数将会产生错误的聚类结果

图 4 也给出了一个在不同入参下 DBSCAN 聚类结果的例子。在子图(1)的原始的数据集中我们很容 易发现存在 5 个簇,子图(2)的聚类结果输出了 5 个簇,比较接近真实的场景。子图(3)因为选取了过大的𝑀inPts 将原本比较稀疏的原始数据集中右上角的簇错误地分成了 2 个簇,而子图(4)因为选取了过小的ϵ导致聚类结果中出 现了过多的簇划分,并且错误地将原始数据集中右上角的簇当成了噪声。同样通过对子图(2),(3),(4)的聚类结果 计算的 DI 分别为 0.8323, 0.1234 和 0.1145,同样说明子图(2)的聚类效果比较好,而子图(3) 和(4)的聚类效 果不太令人满意。

在这里插入图片描述

图4:DBSCAN 参数敏感性 (1)原始数据(左上角), (2)MinPts=5, 𝜺=0.2 下聚类结果(右上角), (3)MinPts=10, 𝜺=0.2 下聚类结果(左下角),(4)MinPts=5, 𝜺=0.1 下聚类结果(右下角)

5.4 参数调整策略

大部分关于 DBSCAN 的文献都讨论的是算法本身,而很少涉及如何为算法选择合适的参数,而从上一节的介绍中 可以看到参数的选取对聚类结果非常重要。

汽车雷达使用 DBSCAN 时需要根据探测场景和目标检测算法的性能对 参数有针对性地进行一些调整。实践中,通常选取一些典型的测试场景,对 DBSCAN 的入参进行调教以获得期望的聚类效果,最后对不同测试场景下的理想参数进行综合来确定车上实际使用的参数,比如:道路上的两个靠近的行人不被聚类为一个簇,以及一辆汽车因为点云太稀疏不被聚类为多个簇,主要是想解决掉这个问题

本文将提出一种创新的方法针对一个特定测试场景,确定最优的𝑀inPts和ϵ。𝑀inPts是区别于噪声的一个簇内的最少点数,在理论上噪声和它的邻点之间的距离要大于目标点和它的邻点之间的距离

如果定义点p和它的第k个最近的邻点之间的k近邻距离为k_neighbor_dis§,理论上噪声点的k近邻距离要大于目标点的k近邻距离。如果对一个数据集中的所有点分别计算k近邻距离并进行从大到小排序,k近邻距离较大的一些点对应的是噪声,而k近邻距离较小的一些点对应的是簇中的目标点。

另外,如果分别计算一个数据集中所有 点的 1 近邻,2 近邻,…k近邻距离,并对近邻距离最大的n 个点的近邻距离分别进行平均,会发现这个平均值随 着k的增加而增加,但是平均值的增量随着k的增加而降低,会发现一个特定的k,超过这个k后,k + 1近邻距离, k + 2近邻距离…会越来越接近。

从理论上讲,这个k值接近于合理的𝑀inPts值,因为对于近邻距离最大的 n 个点 (主要是噪声点),其k近邻,k + 1近邻, k + 2近邻距离趋向接近,也就是对应的k近邻,k + 1近邻,k + 2近邻更 加接近于簇中的目标点。

基于这种思想,设计了下面的𝑀inPts搜索算法

  1. 计算数据集𝐷中所有样点的 1 近邻,2 近邻,…n 近邻距离,并对所有的近邻距离从大到小进行排序 ;

  2. 选定一个 n 值,从 1)中得到的 1 近邻,2 近邻,…n 近邻距离选择出最大的 n 个值,并求平均值 ;

  3. 计算 2)中得到的相邻两个平均值之间的差值,找到一个𝑘值使得𝑘𝑘近邻的平均值大于𝑘 + 1近邻的平均值,并 且𝑘近邻的平均值减去𝑘 + 1近邻的平均值最小

  4. 定义𝑀inPts= 𝑘 − 1。

上述过程本质上讲就是一个用统计的思路,来区分噪声和目标点,得到二者之间的大概界限,然后把这个界限作为𝑀inPts

图 5 中画出了对于图 4 数据集中最大的 3 个𝑘 + 1近邻和𝑘𝑘近邻的平均值之间的差值(例如图中第一个柱状图对应的是 3 个最大的 2 近邻距离平均值减去 3 个最大的 1 近邻距离平均值的差值)。从这张图中我们可以发现𝑘 = 6下有最小的近邻距离增量,因此建议的𝑀inPts设置为 5。

在这里插入图片描述
(图 5. 图 4 数据集的 k+1 近邻和 k 近邻距离中最大 n 个数值的平均值之差(n=3))

5.5 Optics算法

𝑀inPts谈完了,我们继续来搞ϵ。

ϵ决定了聚类时邻域搜索的半径,DBSCAN 算法中一个点的ϵ-邻域中的邻点的数目大于𝑀inPts的时候被定义为核心 节点,并且这个点和所有它的ϵ-邻域中的点都被归入同一个簇。通常一个数据集越密集,聚类时选取的ϵ应该越小, 因此在调整ϵ参数的时候,需要分析数据集的密度结构。怎么分析?是一个问题。

参考文献[3]介绍了一种 OPTICS (Ordering Points To Identify the Clustering Structure) 算法可以获得一个数据集的密度信息。作者基于 OPTICS 算法进行了一些 改进,提出了一种更有效的ϵ搜索的算法。作者设计的ϵ搜索算法分为两步:

第一步通过改进的 OPTICS 算法对数据集的密度信息进行分析,得到一个大致的ϵ搜索区间;

第二步在第一步获得的ϵ搜索区中,按照一定的步长尝试进行DBSCAN 聚类,对聚类的结果分别计算DI 进行评估,从而选择出最优的ϵ。

作者给出的改进的 OPTICS 算法的伪代码描述如图 6 所示:

在这里插入图片描述
(图6:改进的 OPTICS 算法描述)

对于图 4 中的数据集,采用改进的 OPTICS 算法对样本重新排序后输出的包含可达距离的曲线如图 7 所示。

在这里插入图片描述
(图7:图 4 数据集采用改进的 OPTICS 算法排序输出的可达距离)

图中的峰值突起对应的是一个簇中样本和其前序样本(通常是另一个簇中的样本) 之间的可达距离。从图中可以直观地发现,簇中样本之间的可达距离(对应曲线的底部)要远远小于簇间样本之间的可达距离(对应曲线的峰值突起),同时也能直观的发现数据集中簇中样本之间和簇间样本之间的可达距离的大致范围。可以设置ϵ搜索的大致范围在曲线的最低峰值和底部平均值之间,比如在图 7 中可以设置ϵ的搜索范围为 0.1 到 0.6 之间。

在 0.1 到 0.6 之间选择搜索步长为 0.1,对数据集进行 DBSCAN 聚类, 并计算聚类结果的 DI,可以得到表 1 中对应的 DI 数值。从表 1 中可以发现,ϵ = 0.1时,DI 最小,而对于其他的 ϵ值,DI 较大且取值相同,也就是说采用这些ϵ值的聚类效果都比较理想。

综合本节前面的内容,对于图 4 数据集, 采用MinPts = 5,ε = 0.2 − 0.6是一个比较合理的 DBSCAN 算法入参,这与图 4 本身显示的聚类效果一致。

其实,这里读者可以采用MATLAB自带的OPTICS算法模块(具体见帮助文档)来对上述DBSCAN代码中自带的数据参数进行验证,就能够绘制出与图5类似的图,用于确定DBSCAN的参数。

6.总结

DBSCAN的主要优点有:

(1)可以对任意形状的稠密数据集进行聚类,而K-Means之类的聚类算法一般只适用于凸数据集。

(2)可以在聚类的同时发现异常点,对数据集中的异常点不敏感。

(3)聚类结果没有偏倚,而K-Means之类的聚类算法初始值对聚类结果有很大影响。

(4)DBSCAN不需要输入类别数,而K-Means之的聚类算法需要输入类别数。

DBSCAN的主要缺点有:

(1)如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,这时用DBSCAN聚类一般不适合。

(2) 如果样本集较大时,聚类收敛时间较长,此时可以对搜索最近邻时建立的KD树或者球树进行规模限制来改进。

(3)调参相对于传统的K-Means之类的聚类算法稍复杂,主要需要对距离阈值ϵ,邻域样本数阈值MinPts联合调参,不同的参数组合对最后的聚类效果有较大影响。

参考文献:

1.Sriram Murali and Pankaj Gupta, “FMCW Radar System Overview, Session #1: FMCW Radar Signal Processing”, TI internal document, 2015
2.周志华, “机器学习”, 清华大学出版社,2016, 202-217 页
3.Mihael Ankerst, Markus M. Breunig, Hans-Peter Krieegel and Jorg Sander, “OPTICS: Ordering Points To Identify the Clustering Structure”, in SIG-MOD, 1999, pp49-60
4.https://blog.csdn.net/yuanshixin_/article/details/117409961
5.https://www.ti.com.cn/cn/lit/an/zhca739/zhca739.pdfts=1672973254109&ref_url=https%253A%252F%252Fwww.google.com.hk%252F

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

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

相关文章

C生万物 | 反汇编深挖【函数栈帧】的创建和销毁

&#x1f451;作者主页&#xff1a;Fire_Cloud_1 &#x1f3e0;学习社区&#xff1a;烈火神盾 &#x1f517;专栏链接&#xff1a;万物之源——C 一文彻底搞懂函数栈帧创建和销毁的过程一、 什么是函数栈帧二、 理解函数栈帧能解决什么问题呢&#xff1f;三、 函数栈帧的创建和…

易基因|糖尿病大血管和微血管病变的表观遗传学调控机制(DNA甲基化+组蛋白修饰):综述

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。2022年12月09日&#xff0c;《Frontiers in Endocrinology》杂志发表了题为“Epigenetic basis of diabetic vasculopathy”的综述文章&#xff0c;综述了表观遗传学修饰如DNA甲基化和组蛋…

电脑开机出现英文字母开不了机?小白操作技巧

在使用电脑的过程中&#xff0c;有时我们会遇到这种情况&#xff0c;就是电脑开机出现英文字母开不了机&#xff0c;而且还伴随着黑屏背景出现。出现这种问题&#xff0c;你们知道这是什么原因吗&#xff1f;以及我们该如何解决&#xff1f;下面这篇文章就可以告诉你&#xff0…

Foundry 中文文档发布啦

Foundry是一个Solidity智能合约开发工具链。Foundry管理您的依赖关系、编译项目、运行测试、部署&#xff0c;并允许您通过命令行和Solidity 脚本与链交互。 Foundry 中文文档是基于官方 Foundry book 的翻译&#xff0c;全面介绍 Foundry 所有功能。 使用Foundry的好处 Fou…

lvs负载均衡、nginx基本内容复习

文章目录前言一、LVSkeepalived实现高可用负载均衡二、三种不同模式实现负载均衡的区别与优缺点NAT模式DR直连路由模式TUN隧道模式三、Nginx之编译、负载均衡实现rr算法实现负载均衡ip_hash算法四、nginx平滑升级前言 一、LVSkeepalived实现高可用负载均衡 C/S架构和B/S架构&…

UWB室内定位系统的优势与好处

UWB定位系统的优势整理1、精度高&#xff1a;在室内定位领域&#xff0c;能够做到厘米级高精度定位的技术非UWB定位莫属。UWB采用TDOA&#xff08;到达时间&#xff09;算法&#xff0c;测量电磁波从发射端到达接收端所用的时间&#xff0c;分布在房间内的几个接收端同时接收到…

nginx小结二:高可用

nginx小结二&#xff1a;高可用nginx作为负载均衡器&#xff0c;所有请求都到了nginx&#xff0c;可见nginx处于非常重点的位置&#xff0c;如果nginx服务器宕机后端web服务将无法提供服务&#xff0c;影响严重。有鉴于此需要建立一个备份机&#xff0c;主服务器和备份机通过定…

用迭代局部搜索求解TSP问题(python)

文章目录1.迭代局部搜索(ILS)2.用ILS解决TSP问题2.1 函数模块2.2 主函数2.3 berlin52数据集测试1.迭代局部搜索(ILS) 关于迭代局部搜索(ILS iterated local search)的框架和应用总结可以阅读文献Iterated Local Search: Framework and Applications ILS的核心思想&#xff1a;…

【Kubernetes 企业项目实战】02、基于 Prometheus 和 K8s 构建智能化监控告警系统(下)

目录 一、可视化 UI 界面 Grafana 的安装和配置 1.1 Grafana 介绍 1.2 安装 Grafana 1.3 Grafana 界面接入 Prometheus数据源 1&#xff09;登录 grafana 2&#xff09;配置 grafana 界面 3&#xff09;导入的监控模板 二、kube-state-metrics 组件 2.1 kube-state-m…

JS的基础语法

作者&#xff1a;~小明学编程 文章专栏&#xff1a;JavaEE 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 JavaScript的书写形式 行内式 内嵌式 外部式 注释 输入输出 输入 输出 JS的语法规则 变量 数据类型 数字类型 字符串类型 布尔类型 运算…

YED-M724嵌入式4G Cat1 核心板介绍

YED-M724嵌入式4G Cat1 核心板简介YEDM724 核心板是由银尔达&#xff08;yinerda&#xff09;基于合宙Air724 模组推出的低功耗&#xff0c;超小体积&#xff0c;高性能嵌入式4G Cat1 核心板。YED-M724嵌入式4G Cat1 核心板特点1、支持5-16V 供电&#xff1b;2、工作环境为-35℃…

基于轻量级YOLOV5融合RepVGG的电梯内电动车检测识别分析系统

RepVGG: Making VGG-style ConvNets Great Again 是2021 CVPR的一篇论文&#xff0c;正如他的名字一样&#xff0c;使用structural re-parameterization的方式让类VGG的架构重新获得了最好的性能和更快的速度。将RepVGG的设计思想融合进入到yolov5目标检测模型中是否有性能的提…

多线程案例-实现定时器

1.定时器是什么定时器是软件开发中的一个重要组件,功能是当达到一个特定的时间后,就执行某个指定好的代码定时器是一个非常常用的组件,特别是在网络编程中,当出现了"连接不上,卡了"的情况,就使用定时器做一些操作来止损标准库中也提供了定时器标准库中的Timer类标准库…

阿里妈妈Dolphin智能计算引擎基于Flink+Hologres实践

作者&#xff1a;徐闻春&#xff08;花名 陌奈&#xff09; 阿里妈妈事业部技术专家 本文整理至FlinkHologres实时数仓Workshop北京站&#xff0c;点击查看视频回放>>> 阿里妈妈数据引擎团队负责广告营销计算引擎Dophin的开发&#xff0c;目前支撑百万级广告主的营销…

ios打包证书申请流程

目前的APP开发&#xff0c;多端开发成为了主流&#xff0c;所以开发APP很多都是使用uniapp来开发&#xff0c;而且都是使用windows电脑来开发。但是在打包ios应用的时候&#xff0c;是需要一个p12格式的打包证书和profile描述文件的。 那么这两个文件如何申请呢&#xff1f;这…

关系抽取Casrel实现(Pytorch版)

前言 关系抽取是自然语言处理中的一个基本任务。关系抽取通常用三元组(subject, relation, object)表示。但在关系抽取中往往会面临的关系三元组重叠问题。《A Novel Cascade Binary Tagging Framework for Relational Triple Extraction》提出的CASREL模型可以有效的处理重叠关…

前端基础(十)_Dom自定义属性(带案例)

Dom自定义属性 1.1、为什么要用自定义属性 例&#xff1a;很多个 li 点击变颜色。 <ul><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8&…

LeetCode[373]查找和最小的K对数字

难度&#xff1a;中等题目&#xff1a;给定两个以 升序排列 的整数数组 nums1和 nums2, 以及一个整数 k。定义一对值 (u,v)&#xff0c;其中第一个元素来自 nums1&#xff0c;第二个元素来自 nums2。请找到和最小的 k个数对 (u1,v1), (u2,v2)... (uk,vk)。示例 1:输入: nums1 …

离散数学与组合数学-01集合论

文章目录1.离散数学与组合数学-01集合论1.1 集合定义1.1.1 什么是集合1.1.2 集合案例1.1.3 集合的符号表示1.2 集合表示1.2.1属于关系1.2.2 枚举法1.2.3 叙述法1.2.4 文氏图1.3 集合基数1.3.1 什么是集合基数1.3.2 集合基数案例1.4 集合间关系1.4.1 空集1.4.2 全集1.4.3 集合的…

【Vue + Koa 前后端分离项目实战9】使用开源框架==>快速搭建后台管理系统 -- part9 项目总结

人要保持忙碌&#xff0c;因为忙碌是世界上最便宜的药。 本博客教学视频来源于imoom 《0到1快速构建自己的后台管理系统》课程 官方演示地址&#xff1a;https://talelin.com/ 目录 一、项目介绍 1.技术准备 2.学到的内容 &#xff08;1&#xff09;后端接口实现的业务逻辑…