一种用于高速公路最短路径计算的矩阵压缩算法的制作方法

文档序号:26050884发布日期:2021-07-27 15:25阅读:57来源:国知局
一种用于高速公路最短路径计算的矩阵压缩算法的制作方法
本发明涉及高速公路算法
技术领域
,具体为一种用于高速公路最短路径计算的矩阵压缩算法。
背景技术
:目前,高速公路的最小费用路径计算都是使用的迪杰斯特拉算法,迪杰斯特拉算法是计算从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主的要计算过程是采用贪心算法的策略,从起始点开始,每次遍历与起始点距离最近,并且从未访问过的顶点的邻接节点,直到扩展到终点为止。简要的高速公路路网如图2所示,可以用以下方式进行建模:高速公路的收费门架和收费站入口和收费站出口作为有向图中的点,收费门架之间以及收费门架与收费站入口/出口之间的直接连接关系作为有向图的边,小客车经过收费门架的费用作为所有以该门架为终点的边的权值,终点为收费站出口的边的权值为0。如说明书附图2中,门架0标记为点0,门架1标记为点1,门架2标记为点2,门架3标记为点3,门架4标记为点4,门架5标记为点5,门架6标记为点6,门架7标记为点7,收费站0入口标记为点8,收费站0出口标记为点9,收费站1入口标记为点10,收费站1出口标记为点11,收费站2入口标记为点12,收费站2出口标记为点13,收费站3入口标记为点14,收费站3出口标记为点15。点0与点4直接连接,记为边0-4,值为2;点1与点0直接相连,记为边1-0,值为2;点1与点9直接相连,记为1-9,值为0;点2与点1直接相连,记为边2-1,值为3;点2与点11直接相连,记为边2-11,值为0;点3与点2直接相连,记为边3-2,值为2;点3与点13直接相连,记为边3-13,值为0;点4与点5直接相连,记为边4-5,值为3;点4与点9直接相连,记为边4-9,值为0;点5和点6直接相连,记为边5-6,值为2;点5和点11直接相连,记为边5-11,值为0;点6与点2直接相连,记为边6-2,值为2;点6与点7直接相连,记为边6-7,值为2;点6与点13直接相连,记为边6-13,值为0;点7与点15直接相连,记为边7-15,值为0;点8与点0直接相连,记为边8-0,值为2;点8与点5直接相连,记为边8-5,值为3;点10与点1直接相连,记为边10-1,值为3;点10与点6直接相连,记为边10-6,值为2;点12与点2直接相连,记为边12-2,值为2;点12与点7直接相连,记为边12-7,值为2;点14与点3直接相连,记为边12-3,值为2。建模后,形成如说明书附图3所示的有向图模型。说明书附图3中所示的有向图通过迪杰斯特拉算法计算之后,能够得到一个最短路径二维矩阵,即前序矩阵pre[n][n](n为点数,即(收费门架+收费站数量*2)的数值)。pre[i][j]表达的意思是从点i到点j的最短路径中,j的前一个节点的序号。pre[i][j]值为-1时,指点i无法到达点j。为了获取i,j两点间的最短路径,需要用以下方式从pre[i][j]开始递归至pre[i][i]:获取pre[i][j]的值k,若k为-1,则点i与点j不可连通,不存在最短路径;若k不为-1,则将k的值当做纵坐标,获取pre[i][k]的值。以此类推,直到k=i,则获取到了最短路径。由于高速公路模型的特殊性,即费用包含在收费门架的属性中,所以在获取路径的同时,通过车辆类型能够同时获取到最小费用。如要获取从点8(收费站0入)至点13(收费站2出)的最短路径,则获取逻辑如下:1.获取pre[8][13]的值,为6;2.获取pre[8][6]的值,为5;3.获取pre[8][5]的值,为8;4.此时已经获取了最短路径,为8,5,6,13。当前技术方案的空间复杂度为o(n2),主要内存占用空间为前序数组pre[n][n],n为高速路网建模中点的数量,而全国的收费门架总数+收费站总数*2的数值为50000左右,该技术方案要求的最低内存空间为10gb(50000*50000*4byte),这个内存空间大小远远大于收费门架系统所能提供的内存大小,因此该技术方案无法满足将最小费用计算放至收费门架系统上的需求。为此,我们提出一种用于高速公路最短路径计算的矩阵压缩算法。技术实现要素:本发明的目的在于提供一种用于高速公路最短路径计算的矩阵压缩算法,以解决上述
背景技术
中提出的问题。为实现上述目的,本发明提供如下技术方案:一种用于高速公路最短路径计算的矩阵压缩算法,步骤如下:步骤一,使用迪杰斯特拉算法计算出高速公路最小费用路径的矩阵图;步骤二,进行矩阵行压缩,建立行标记数组flag[n](初始化为全false),逐行遍历前序矩阵,对pre数组中的每一行,压缩成一个(列号c,值v)二元组集合rowlisti;步骤三,进行矩阵列压缩:逐列遍历矩阵,对pre数组中的每一列都压缩成一个(起始值s,终止值e,值v)的三元组集合collistk,将特殊点和重复点在矩阵内压缩并忽略;步骤四,矩阵压缩完成;步骤五,矩阵检索。优选的,若第i行不为-1的值数量小于或等于(n/10),则将flag[i]置为true,第i行压缩成一个(列号c,值v)二元组集合rowlisti,检索时若发现集合中没有对应的列号,则值为-1。优选的,在步骤三中,对于任意一行i,若flag[i]为true,在矩阵列压缩时,将忽略行i。优选的,在步骤四中,若点k为收费站入口,则其他任意点都无法到达该点,列k所有的值均为-1,压缩后的三元组集合listk中没有任何元素。优选的,在步骤三中,pre数组中,对于任意点i,pre[i][i]的值均为-1,即任何点都无法到达自身,在矩阵压缩时,将忽略这些点。优选的,在步骤五中,首先,获取行标记flag[i]的值,若值为true,则获取行二元组集合rowlisti,进入第2步进行查找;若值为false,通过列坐标j获取三元组集合collistj,进入第3步进行查找;然后,在rowlisti中使用折半查找方法查找pre[i][j],每次递归比较rowlisti[mid]二元组(列号c,值v)的c和列坐标j,若s>j,则向rowlisti前半部分查找;若c=j,则pre[i][j]值为v;若s<j,则向rowlisti后半部分查找;最后,在collistj中使用折半查找方法查找pre[i][j],每次递归比较collistj[mid]三元组(起始点s,终止点e,值v)的s与行坐标i,若s>i,则向collistj前半部分查找;若s<=i且e>=i,则pre[i][j]的值为v;若s<i且e<i,则向collistj后半部分查找。本发明至少具备以下有益效果:通过矩阵压缩算法,将前序数组进行压缩,使其所需要的的内存大大减小,且检索效率不会降低太多。附图说明图1为本发明逻辑框图;图2为简要的高速公路路网图;图3为高速公路有向图模型;图4为简单高速公路路网前序矩阵图。具体实施方式下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。请参阅图1-4,本发明提供一种技术方案:一种用于高速公路最短路径计算的矩阵压缩算法,包括:。由于高速公路路网模型结构相对简单,大部分点只与1-2个点直接连接,少部分点会与3个或更多的点直接连接。如矩阵1所示,在迪杰斯特拉算法运行之后,前序矩阵中的每一列会有大量的重复数值,可以针对矩阵中每一列进行压缩;为了提高列压缩效率,减少列中值-1的干扰,可以先做行压缩,再做列压缩。基于这个考虑,建立以下矩阵压缩算法:步骤一,使用迪杰斯特拉算法计算出高速公路最小费用路径的矩阵图;步骤二,先进行矩阵行压缩:建立行标记数组flag[n](初始化为全false),逐行遍历前序矩阵,若第i行不为-1的值数量小于或等于(n/10),则将flag[i]置为true,第i行压缩成一个(列号c,值v)二元组集合rowlisti,如行[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,4,-1,-1,-1,-1,-1,-1,-1],压缩为集合[(11,3),(12,4)],检索时若发现集合中没有对应的列号,则值为-1。步骤三,再进行矩阵列压缩:逐列遍历矩阵,对pre数组中的每一列都压缩成一个(起始值s,终止值e,值v)的三元组集合collistk,如列[1,1,1,1,1,2,2,2]可以压缩为集合[(0,4,1),(5,7,2)];对于任意一行i,若flag[i]为true,在矩阵列压缩时,将忽略行i,将特殊点和重复点在矩阵内压缩并忽略;若点k为收费站入口,则其他任意点都无法到达该点,列k所有的值均为-1,压缩后的三元组集合listk中没有任何元素;pre数组中,对于任意点i,pre[i][i]的值均为-1,即任何点都无法到达自身,在矩阵压缩时,将忽略这些点步骤四,矩阵压缩完成。通过这个压缩算法,对矩阵1进行压缩,可以得到以下行标记数组:flag[16]:[false,false,false,false,false,false,false,true,false,true,false,true,false,true]得到以下16个行集合表(flag[i]为false对应的行集合表为空):rowlist0:[]rowlist1:[]rowlist2:[]rowlist3:[]rowlist4:[]rowlist5:[]rowlist6:[]rowlist7:[(15,7)]rowlist8:[]rowlist9:[]rowlist10:[]rowlist11:[]rowlist12:[]rowlist13:[]rowlist14:[]rowlist15:[]以下16个列集合表:collist0:[(0,6,1),(8,8,8),(10,14,1)];collist1:[(0,8,2),(10,10,10),(12,14,2)];collist2:[(0,1,6),(3,3,3),(4,10,6),(12,12,12),(14,14,3)];collist3:[(0,12,-1),(14,14,14)];collist4:[(0,14,0)];collist5:[(0,6,4),(8,8,8),(10,14,4)]collist6:[(0,8,5),(10,10,10),(12,14,5)]collist7:[(0,10,6),(12,12,12),(14,14,6)]collist8:[]collist9:[(0,0,4),(1,3,1),(4,4,4),(5,6,1),(8,8,4),(10,14,1)]collist10:[]collist11:[(0,1,5),(2,3,2),(4,5,5),(6,6,2),(8,10,5),(12,14,2)]collist12:[]collist13:[(0,2,6),(3,3,3),(4,12,6),(14,14,3)]collist14:[]collist15:[(0,14,7)]检索矩阵的方式由之前通过ij两点直接取pre[i][j]的值修改为以下方式:1.获取行标记flag[i]的值,若值为true,则获取行二元组集合rowlisti,进入第2步进行查找;若值为false,通过列坐标j获取三元组集合collistj,进入第3步进行查找;2.在rowlisti中使用折半查找方法查找pre[i][j],每次递归比较rowlisti[mid]二元组(列号c,值v)的c和列坐标j,若s>j,则向rowlisti前半部分查找;若c=j,则pre[i][j]值为v;若s<j,则向rowlisti后半部分查找;3.在collistj中使用折半查找方法查找pre[i][j],每次递归比较collistj[mid]三元组(起始点s,终止点e,值v)的s与行坐标i,若s>i,则向collistj前半部分查找;若s<=i且e>=i,则pre[i][j]的值为v;若s<i且e<i,则向collistj后半部分查找。如在上面的压缩结果中查找pre[3][1]的值,按以下步骤查找:1.确定行标记flag[3]的值为false,则按照列坐标确定列集合表collist1;2.collist1的长度为3,按折半原则获得三元组collist1[1],即(10,10,10),比较起始值10与目标横坐标3,发现10>3,则向列表前半部分继续查找;3.对列表前半部分折半获得三元组collist1[0],即(0,8,2),发现起始值0<目标横坐标3,且终止值5>目标横坐标3,确认pre[3][1]的值为三元组的值2。本发明的技术关键点在于:1.对高速公路路网模型在应用时占用的内存按照算法进行压缩,以满足门架系统内存的要求;2.在做矩阵压缩的同时,通过优化查找算法提高矩阵检索的速度。本发明实验得到的效果:本发明针对某省高速路网进行测试,该省高速路网具有530个收费门架,199个收费站,1267个直接连接关系,体现到高速模型中,有向图模型中具有530+199*2=928个点,1267条边。针对该有向图进行两点间的最短路径查询测试,得到以下结果:测试运行次数平均总耗时(秒)平均单次耗时(毫妙)内存占用大小(字节)压缩前100000011.240.0113519376压缩后100000022.890.023148848该算法能够有效压缩高速公路路网模型中的前序数组,压缩比例为95.8%,平均耗时由0.011毫秒增长至0.023毫秒,高速公路门架收费计算时间上限为250毫秒,压缩算法能够完全满足高速公路通行的时限需求。需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1