一种基于A*算法的三维空间疏散模拟方法转让专利

申请号 : CN202111584265.7

文献号 : CN113963089B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 武爱斌魏小庆方福璟

申请人 : 朗坤智慧科技股份有限公司

摘要 :

本发明公开了一种基于A*算法的三维空间疏散模拟方法,包括,构建三维棋盘模型;采集位置数据,并将三维棋盘模型数据和位置数据进行转换;设计相邻节点的获取函数,以优化A*算法,并将转换结果作为A*优化算法的输入,获得最短路径;以设置的扫描的步长STEP为边长的方块对建筑模型的包围盒进行划分,根据最短路径的方块数确定路径长度;若最短路径的方块数为0,则表示没有路径能够到达疏散出口;若人员与疏散出口的距离小于扫描的步长STEP,则视人员到达疏散出口,此时最短路径的方块数为1;否则,疏散出口位于最短路径的另一端;结合最短路径和疏散出口的位置,进行疏散动画模拟;本发明能够满足路径计算的需求。

权利要求 :

1.一种基于A*算法的三维空间疏散模拟方法,其特征在于:包括,根据建筑模型的数据构建三维棋盘模型;

采集位置数据,并将三维棋盘模型数据和位置数据进行转换;

设计相邻节点的获取函数,以优化A*算法,并将转换结果作为A*优化算法的输入,获得最短路径;

以设置的扫描的步长STEP为边长的方块对建筑模型的包围盒进行划分,根据最短路径的方块数确定路径长度;

若最短路径的方块数为0,则表示没有路径能够到达疏散出口;若人员与疏散出口的距离小于扫描的步长STEP,则视人员到达疏散出口,此时最短路径的方块数为1;

否则,疏散出口位于最短路径的另一端;

结合最短路径和疏散出口的位置,进行疏散动画模拟;

其中,建筑模型的数据为建筑物楼面、墙壁、楼梯表面坐标的集合;所述集合由地面、楼面、楼梯的上表面坐标集合与障碍物侧表面坐标集合的差集获得;

三维棋盘模型数据包括建筑模型的包围盒以及建筑模型的数据的四维数组ChessBoard(x,y,z,v);其中,四维数组的前三维度x、y、z表示空间取样点的三维坐标除以步长之后的整数值,最后一个维度v表示在空间取样点的三维坐标位置是否可通行,v=0/1,

0表示不可通行,1表示可以通行;初始状态下所有空间取样点的值都为0;

位置数据包括人员位置坐标、出口位置坐标和路径点集合;

其中,设计相邻节点的获取函数的步骤为:设当前节点的坐标为(a,b,c),由于万有引力,人员无法垂直上行,因此将节点(a,b,c+

1)删除,由于地面的阻挡,人员无法垂直下行,将节点(a,b,c‑1)删除,将剩余的24个节点作为相邻节点,并对应添加获取函数,构成相邻节点的获取函数;A*优化算法包括,初始化待遍历的相邻节点集合open_set和已遍历的相邻节点集合close_set;

将起点加入待遍历的相邻节点集合open_set中,并设置优先级为0;

若待遍历的相邻节点集合open_set不为空,则从待遍历的相邻节点集合open_set中选取优先级最高的节点n,并将当前节点作为节点n的parent节点;

若节点n为终点,则从终点开始逐步回溯parent节点,直至回到起点,并返回找到的结果路径,算法结束;

若节点n不是终点,则将节点n从待遍历的相邻节点集合open_set中删除,并加入已遍历的相邻节点集合close_set中,遍历节点n所有的邻近节点,若邻近节点m在已遍历的相邻节点集合close_set中,则选取下一个邻近节点;

若邻近节点m不在待遍历的相邻节点集合open_set和已遍历的相邻节点集合close_set中,则设置邻近节点m的parent为节点n,计算邻近节点m的优先级,并将邻近节点m加入待遍历的相邻节点集合open_set中。

2.如权利要求1所述的基于A*算法的三维空间疏散模拟方法,其特征在于:转换包括,所述三维棋盘模型数据为浮点型数据,将其转换为整数型数据;

所述人员位置坐标、出口位置坐标为浮点型数据,将其转换为整数型数据;

所述路径点集合为整数型数据,将其转换为浮点型数据。

3.如权利要求2所述的基于A*算法的三维空间疏散模拟方法,其特征在于:包括,三维棋盘模型数据、人员位置坐标、出口位置坐标为以0开始的整数。

4.如权利要求3所述的基于A*算法的三维空间疏散模拟方法,其特征在于:包括,通过下式将建筑模型的数据的四维数组ChessBoard(x,y,z,v)中的前三维度x,y,z转换为整数型维度XINDEX,YINDEX,ZINDEX:XINDEX = floor((x – MINX)/STEP)YINDEX = floor((y – MINY)/STEP)ZINDEX = floor((z – MINZ)/STEP)其中,floor表示向下取整函数,(MINX,MINY,MINZ)为建筑模型的包围盒的最小点坐标,STEP表示扫描的步长。

5.如权利要求4所述的基于A*算法的三维空间疏散模拟方法,其特征在于:包括,通过下式来计算节点的优先级:

f(i)=g(i)+h(i)

其中,g(i)表示从起点经过当前节点到节点i的距离,h(i)表示从节点i到终点的预计距离;f(i)表示从起点经过当前节点到节点i的代价与节点i到终点的预计距离之和,f(i)的值越小,优先级越高。

说明书 :

一种基于A*算法的三维空间疏散模拟方法

技术领域

[0001] 本发明涉及疏散模拟的技术领域,尤其涉及一种基于A*算法的三维空间疏散模拟方法。

背景技术

[0002] 随着社会经济的飞速发展,城市中各种高层建筑物、超大型商场以及购物中心、大型娱乐城、大规模体育运动场等一系列人员聚集场所应运而生。然而这些虽然满足了人们
的多元化需求,丰富了人们的精神文化生活,却给人们带来了很大的安全隐患。一旦在这种
场所发生突发事件,受惊的人群如何进行高效、快速的疏散就成为一个值得深入研究的问
题。对于疏散的人群,难以数学的式子来总结其行动规律。由于人群疏散过程通常涉及大量
的人员,进行过程中可能发生的各种意外和对于突发事件的不可预测性使实验难以进行。
因此,在研究人群疏散时,计算机模拟是主要的手段。
[0003] 传统的模拟方法大都采用A*算法进行路径模拟,A*算法是一种很常用的路径查找和图形遍历算法,A*算法虽在二维空间搜索方面有广泛的应用,但并不支持三维的场景。

发明内容

[0004] 本部分的目的在于概述本发明的实施例的一些方面以及简要介绍一些较佳实施例。在本部分以及本申请的说明书摘要和发明名称中可能会做些简化或省略以避免使本部
分、说明书摘要和发明名称的目的模糊,而这种简化或省略不能用于限制本发明的范围。
[0005] 鉴于上述现有存在的问题,提出了本发明。
[0006] 为解决上述技术问题,本发明提供如下技术方案:包括,根据建筑模型的数据构建三维棋盘模型;采集位置数据,并将三维棋盘模型数据和位置数据进行转换;设计相邻节点
的获取函数,以优化A*算法,并将转换结果作为A*优化算法的输入,获得最短路径;以设置
的扫描的步长STEP为边长的方块对建筑模型的包围盒进行划分,根据最短路径的方块数确
定路径长度;若最短路径的方块数为0,则表示没有路径能够到达疏散出口;若人员与疏散
出口的距离小于扫描的步长STEP,则视人员到达疏散出口,此时最短路径的方块数为1;否
则,疏散出口位于最短路径的另一端;结合最短路径和疏散出口的位置,进行疏散动画模
拟。
[0007] 作为本发明所述的基于A*算法的三维空间疏散模拟方法的一种优选方案,其中:建筑模型的数据为建筑物楼面、墙壁、楼梯表面坐标的集合;其中,所述集合由地面、楼面、
楼梯的上表面坐标集合与障碍物侧表面坐标集合的差集获得。
[0008] 作为本发明所述的基于A*算法的三维空间疏散模拟方法的一种优选方案,其中:包括,三维棋盘模型数据包括建筑模型的包围盒以及建筑模型的数据的四维数组
ChessBoard(x,y,z,v);其中,四维数组的前三维度x、y、z表示空间取样点的三维坐标除以
步长之后的整数值,最后一个维度v表示在空间取样点的三维坐标位置是否可通行,v=0/1,
0表示不可通行,1表示可以通行;初始状态下所有空间取样点的值都为0;位置数据包括人
员位置坐标、出口位置坐标和路径点集合。
[0009] 作为本发明所述的基于A*算法的三维空间疏散模拟方法的一种优选方案,其中:转换包括,所述三维棋盘模型数据为浮点型数据,将其转换为整数型数据;所述人员位置坐
标、出口位置坐标为浮点型数据,将其转换为整数型数据;所述路径点集合为整数型数据,
将其转换为浮点型数据。
[0010] 作为本发明所述的基于A*算法的三维空间疏散模拟方法的一种优选方案,其中:包括,三维棋盘模型数据、人员位置坐标、出口位置坐标为以0开始的整数。
[0011] 作为本发明所述的基于A*算法的三维空间疏散模拟方法的一种优选方案,其中:包括,通过下式将建筑模型的数据的四维数组ChessBoard(x,y,z,v)中的前三维度x,y,z转
换为整数型维度XINDEX,YINDEX,ZINDEX:
[0012] XINDEX = floor((x – MINX)/STEP)
[0013] YINDEX = floor((y – MINY)/STEP)
[0014] ZINDEX = floor((z – MINZ)/STEP)
[0015] 其中,floor表示向下取整函数,(MINX,MINY,MINZ)为建筑模型的包围盒的最小点坐标,STEP表示扫描的步长。
[0016] 作为本发明所述的基于A*算法的三维空间疏散模拟方法的一种优选方案,其中:包括,设当前节点的坐标为(a,b,c),由于万有引力,人员无法垂直上行,因此将节点(a,b,c
+1)删除,由于地面的阻挡,人员无法垂直下行,将节点(a,b,c‑1)删除,将剩余的24个节点
作为相邻节点,并对应添加获取函数,构成相邻节点的获取函数。
[0017] 作为本发明所述的基于A*算法的三维空间疏散模拟方法的一种优选方案,其中:A*优化算法包括,初始化待遍历的相邻节点集合open_set和已遍历的相邻节点集合close_
set;将起点加入待遍历的相邻节点集合open_set中,并设置优先级为0;若待遍历的相邻节
点集合open_set不为空,则从待遍历的相邻节点集合open_set中选取优先级最高的节点n,
并将当前节点作为节点n的parent节点;若节点n为终点,则从终点开始逐步回溯parent节
点,直至回到起点,并返回找到的结果路径,算法结束;若节点n不是终点,则将节点n从待遍
历的相邻节点集合open_set中删除,并加入已遍历的相邻节点集合close_set中,遍历节点
n所有的邻近节点,若邻近节点m在已遍历的相邻节点集合close_set中,则选取下一个邻近
节点;若邻近节点m不在待遍历的相邻节点集合open_set和已遍历的相邻节点集合close_
set中,则设置邻近节点m的parent为节点n,计算邻近节点m的优先级,并将邻近节点m加入
待遍历的相邻节点集合open_set中。
[0018] 作为本发明所述的基于A*算法的三维空间疏散模拟方法的一种优选方案,其中:包括,通过下式来计算节点的优先级:
[0019] f(i)=g(i)+h(i)
[0020] 其中,g(i)表示从起点经过当前节点到节点i的距离,h(i)表示从节点i到终点的预计距离;f(i)表示从起点经过当前节点到节点i的代价与节点i到终点的预计距离之和,f
(i)的值越小,优先级越高。
[0021] 本发明的有益效果:本发明通过优化A*算法,使A*算法支持3D空间的搜索,利用优化的A*算法计算出人员疏散的路线及在不同时间点的位置,能够满足路径计算的需求。

附图说明

[0022] 为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本
领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它
的附图。其中:
[0023] 图1为本发明第一个实施例所述的基于A*算法的三维空间疏散模拟方法的建筑模型结构示意图;
[0024] 图2为本发明第一个实施例所述的基于A*算法的三维空间疏散模拟方法的三维棋盘模型结构示意图;
[0025] 图3为本发明第一个实施例所述的基于A*算法的三维空间疏散模拟方法的疏散动画模拟示意图;
[0026] 图4为本发明第二个实施例所述的基于A*算法的三维空间疏散模拟方法的单人单出口路径示意图;
[0027] 图5为本发明第二个实施例所述的基于A*算法的三维空间疏散模拟方法的单人多出口路径示意图;
[0028] 图6为本发明第二个实施例所述的基于A*算法的三维空间疏散模拟方法的多人多出口路径示意图。

具体实施方式

[0029] 为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合说明书附图对本发明的具体实施方式做详细的说明,显然所描述的实施例是本发明的一部分实施例,而
不是全部实施例。基于本发明中的实施例,本领域普通人员在没有做出创造性劳动前提下
所获得的所有其他实施例,都应当属于本发明的保护的范围。
[0030] 在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是本发明还可以采用其他不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本发明内涵的
情况下做类似推广,因此本发明不受下面公开的具体实施例的限制。
[0031] 其次,此处所称的“一个实施例”或“实施例”是指可包含于本发明至少一个实现方式中的特定特征、结构或特性。在本说明书中不同地方出现的“在一个实施例中”并非均指
同一个实施例,也不是单独的或选择性的与其他实施例互相排斥的实施例。
[0032] 本发明结合示意图进行详细描述,在详述本发明实施例时,为便于说明,表示器件结构的剖面图会不依一般比例作局部放大,而且所述示意图只是示例,其在此不应限制本
发明保护的范围。此外,在实际制作中应包含长度、宽度及深度的三维空间尺寸。
[0033] 同时在本发明的描述中,需要说明的是,术语中的“上、下、内和外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而
不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此
不能理解为对本发明的限制。此外,术语“第一、第二或第三”仅用于描述目的,而不能理解
为指示或暗示相对重要性。
[0034] 本发明中除非另有明确的规定和限定,术语“安装、相连、连接”应做广义理解,例如:可以是固定连接、可拆卸连接或一体式连接;同样可以是机械连接、电连接或直接连接,
也可以通过中间媒介间接相连,也可以是两个元件内部的连通。对于本领域的普通技术人
员而言,可以具体情况理解上述术语在本发明中的具体含义。
[0035] 实施例1
[0036] 参照图1 图3,为本发明的第一个实施例,该实施例提供了一种基于A*算法的三维~
空间疏散模拟方法,包括:
[0037] S1:根据建筑模型的数据构建三维棋盘模型。
[0038] 参照图1,为建筑模型的示例,建筑模型的数据为建筑物楼面、墙壁、楼梯表面坐标的集合;其中,集合由地面、楼面、楼梯的上表面坐标集合与障碍物侧表面坐标集合的差集
获得,根据建筑模型的数据构建三维棋盘模型,如图2所示。
[0039] S2:采集位置数据,并将三维棋盘模型数据和位置数据进行转换。
[0040] 采集的位置数据包括人员位置坐标、出口位置坐标和路径点集合。
[0041] 三维棋盘模型数据包括建筑模型的包围盒以及建筑模型的数据的四维数组ChessBoard(x,y,z,v);其中,四维数组的前三维度x、y、z表示空间取样点的三维坐标除以
步长(STEP)之后的整数值,最后一个维度v表示在空间取样点的三维坐标位置是否可通行,
v=0/1,0表示不可通行,1表示可以通行;初始状态下所有空间取样点的值都为0。
[0042] 进一步的,将三维棋盘模型数据和位置数据进行转换,具体的:
[0043] (1)三维棋盘模型数据为浮点型数据,将其转换为整数型数据;
[0044] 通过下式将建筑模型的数据的四维数组ChessBoard(x,y,z,v)中的前三维度x,y,z转换为整数型维度XINDEX,YINDEX,ZINDEX:
[0045] XINDEX = floor((x – MINX)/STEP)
[0046] YINDEX = floor((y – MINY)/STEP)
[0047] ZINDEX = floor((z – MINZ)/STEP)
[0048] 其中,floor表示向下取整函数,(MINX,MINY,MINZ)为建筑模型的包围盒的最小点坐标,STEP表示扫描的步长,取值0.5米。
[0049] (2)人员位置坐标、出口位置坐标为浮点型数据,将其转换为整数型数据;
[0050] 在三维棋盘模型上选择一个点(q,w,e)作为人员的位置,根据下式将人员位置坐标(q,w,e)转换为整数型坐标(QINDEX,WINDEX,EINDEX):
[0051] QINDEX = floor((q – MINX)/STEP)
[0052] WINDEX = floor((w – MINY)/STEP)
[0053] EINDEX = floor((e – MINZ)/STEP)
[0054] 在三维棋盘模型上选择一个点(j,k,l)作为出口位置,根据下式将人员位置坐标(j,k,l)转换为整数型坐标(JINDEX,KINDEX,LINDEX):
[0055] JINDEX = floor((j – MINX)/STEP)
[0056] KINDEX = floor((k – MINY)/STEP)
[0057] LINDEX = floor((l – MINZ)/STEP)
[0058] (3)路径点集合为整数型数据,将其转换为浮点型数据。
[0059] 假设路径点集合中的某一路径点为(DINDED,GINDEX,UINDEX),根据下式将其转换为浮点型坐标(d,g,u)
[0060] d = MINX + STEP * DINDED
[0061] g = MINY + STEP * GINDEX
[0062] u = MINZ + STEP * UINDEX
[0063] S3:设计相邻节点的获取函数,以优化A*算法,并将转换结果作为A*优化算法的输入,获得最短路径。
[0064] 设当前节点的坐标为(a,b,c),由于万有引力,人员无法垂直上行,因此将节点(a,b,c+1)删除,由于地面的阻挡,人员无法垂直下行,将节点(a,b,c‑1)删除,将剩余的24个节
点(东、南、西、北、东北、西北、东南、西南、东上、南上、西上、北上、东北上、西北上、东南上、
西南上、东下、南下、西下、北下、东北下、西北下、东南下、西南下)作为相邻节点,并对应添
加获取函数,构成相邻节点的获取函数。
[0065] 相邻节点坐标如下表所示。
[0066] 表1:相邻节点坐标。
[0067]
[0068] 相邻节点的获取函数如下:
[0069] Graph.prototype.neighbors =
[0070] function(node)
[0071] {
[0072] var ret = [],
[0073] a = node.a,
[0074] b = node.b,
[0075] c = node.c,
[0076] grid = this.grid;
[0077] // 西
[0078] if(grid[a‑1] &&
[0079] grid[a‑1][b] &&
[0080] grid[a‑1][b][c])
[0081] {
[0082] ret.push(grid[a‑1][b][c]);
[0083] }
[0084] // 东
[0085] if(grid[a+1] &&
[0086] grid[a+1][b] &&
[0087] grid[a+1][b][c])
[0088] {
[0089] ret.push(grid[a+1][b][c]);
[0090] }
[0091] // 南
[0092] if(grid[a] &&
[0093] grid[a][b‑1] &&
[0094] grid[a][b‑1][c])
[0095] {
[0096] ret.push(grid[a][b‑1][c]);
[0097] }
[0098] // 北
[0099] if(grid[a] &&
[0100] grid[a][b+1] &&
[0101] grid[a][b+1][c] )
[0102] {
[0103] ret.push(grid[a][b+1][c]);
[0104] }
[0105] // 西南
[0106] if(grid[a‑1] &&
[0107] grid[a‑1][b‑1] &&
[0108] grid[a‑1][b‑1][c] )
[0109] {
[0110] ret.push(grid[a‑1][b‑1][c]);
[0111] }
[0112] // 东南
[0113] if(grid[a+1] &&
[0114] grid[a+1][b‑1] &&
[0115] grid[a+1][b‑1][c])
[0116] {
[0117] ret.push(grid[a+1][b‑1][c]);
[0118] }
[0119] // 西北
[0120] if(grid[a‑1] &&
[0121] grid[a‑1][b+1] &&
[0122] grid[a‑1][b+1][c]) {
[0123] ret.push(grid[a‑1][b+1][c]);
[0124] }
[0125] // 东北
[0126] if(grid[a+1] &&
[0127] grid[a+1][b+1] &&
[0128] grid[a+1][b+1][c] )
[0129] {
[0130] ret.push(grid[a+1][b+1][c]);
[0131] }
[0132] // 西下
[0133] if(grid[a‑1] &&
[0134] grid[a‑1][b] &&
[0135] grid[a‑1][b][c‑1]) {
[0136] ret.push(grid[a‑1][b][c‑1]);
[0137] }
[0138] if(grid[a+1] &&
[0139] grid[a+1][b] &&
[0140] grid[a+1][b][c‑1])
[0141] {
[0142] ret.push(grid[a+1][b][c‑1]);
[0143] }
[0144] // 南下
[0145] if(grid[a] &&
[0146] grid[a][b‑1] &&
[0147] grid[a][b‑1][c‑1])
[0148] {
[0149] ret.push(grid[a][b‑1][c‑1]);
[0150] }
[0151] // 北下
[0152] if(grid[a] &&
[0153] grid[a][b+1] &&
[0154] grid[a][b+1][c‑1] )
[0155] {
[0156] ret.push(grid[a][b+1][c‑1]);
[0157] }
[0158] // 西南下
[0159] if(grid[a‑1] &&
[0160] grid[a‑1][b‑1] &&
[0161] grid[a‑1][b‑1][c‑1] )
[0162] {
[0163] ret.push(grid[a‑1][b‑1][c‑1]);
[0164] }
[0165] // 东南下
[0166] if(grid[a+1] &&
[0167] grid[a+1][b‑1] &&
[0168] grid[a+1][b‑1][c‑1])
[0169] {
[0170] ret.push(grid[a+1][b‑1][c‑1]);
[0171] }
[0172] // 西北下
[0173] if(grid[a‑1] &&
[0174] grid[a‑1][b+1] &&
[0175] grid[a‑1][b+1][c‑1])
[0176] {
[0177] ret.push(grid[a‑1][b+1][c‑1]);
[0178] }
[0179] // 东北下
[0180] if(grid[a+1] &&
[0181] grid[a+1][b+1] &&
[0182] grid[a+1][b+1][c‑1])
[0183] {
[0184] ret.push(grid[a+1][b+1][c‑1]);
[0185] }
[0186] // 西上
[0187] if(grid[a‑1] &&
[0188] grid[a‑1][b] &&
[0189] grid[a‑1][b][c+1])
[0190] {
[0191] ret.push(grid[a‑1][b][c+1]);
[0192] }
[0193] // 东上
[0194] if(grid[a+1] &&
[0195] grid[a+1][b] &&
[0196] grid[a+1][b][c+1])
[0197] {
[0198] ret.push(grid[a+1][b][c+1]);
[0199] }
[0200] // 南上
[0201] if(grid[a] &&
[0202] grid[a][b‑1] &&
[0203] grid[a][b‑1][c+1])
[0204] {
[0205] ret.push(grid[a][b‑1][c+1]);
[0206] }
[0207] // 北上
[0208] if(grid[a] &&
[0209] grid[a][b+1] &&
[0210] grid[a][b+1][c+1])
[0211] {
[0212] ret.push(grid[a][b+1][c+1]);
[0213] }
[0214] // 西南上
[0215] if(grid[a‑1] &&
[0216] grid[a‑1][b‑1] &&
[0217] grid[a‑1][b‑1][c+1])
[0218] {
[0219] ret.push(grid[a‑1][b‑1][c+1]);
[0220] }
[0221] // 东南上
[0222] if(grid[a+1] &&
[0223] grid[a+1][b‑1] &&
[0224] grid[a+1][b‑1][c+1])
[0225] {
[0226] ret.push(grid[a+1][b‑1][c+1]);
[0227] }
[0228] // 西北上
[0229] if(grid[a‑1] &&
[0230] grid[a‑1][b+1] &&
[0231] grid[a‑1][b+1][c+1])
[0232] {
[0233] ret.push(grid[a‑1][b+1][c+1]);
[0234] }
[0235] // 东北上
[0236] if(grid[a+1] &&
[0237] grid[a+1][b+1] &&
[0238] grid[a+1][b+1][c+1])
[0239] {
[0240] ret.push(grid[a+1][b+1][c+1]);
[0241] }
[0242] return ret;
[0243] };
[0244] 因此,优化后的A*算法为:
[0245] (1)初始化待遍历的相邻节点集合open_set和已遍历的相邻节点集合close_set;
[0246] (2)将起点加入待遍历的相邻节点集合open_set中,并设置优先级为0;
[0247] (3)若待遍历的相邻节点集合open_set不为空,则从待遍历的相邻节点集合open_set中选取优先级最高的节点n,并将当前节点作为节点n的parent节点;
[0248] ①若节点n为终点,则从终点开始逐步回溯parent节点,直至回到起点,并返回找到的结果路径,算法结束;
[0249] ②若节点n不是终点,则将节点n从待遍历的相邻节点集合open_set中删除,并加入已遍历的相邻节点集合close_set中,遍历节点n所有的邻近节点。
[0250] 1)若邻近节点m在已遍历的相邻节点集合close_set中,则选取下一个邻近节点;
[0251] 2)若邻近节点m不在待遍历的相邻节点集合open_set和已遍历的相邻节点集合close_set中,则设置邻近节点m的parent为节点n,计算邻近节点m的优先级,并将邻近节点
m加入待遍历的相邻节点集合open_set中。
[0252] 通过下式来计算节点的优先级:
[0253] f(i)=g(i)+h(i)
[0254] 其中,g(i)表示从起点经过当前节点到节点i的距离,h(i)表示从节点i到终点的预计距离;f(i)表示从起点经过当前节点到节点i的代价与节点i到终点的预计距离之和,f
(i)的值越小,优先级越高。
[0255] S4:以设置的扫描的步长STEP为边长的方块对建筑模型的包围盒进行划分,根据最短路径的方块数确定路径长度;若最短路径的方块数为0,则表示没有路径能够到达疏散
出口;若人员与疏散出口的距离小于扫描的步长STEP,则视人员到达疏散出口,此时最短路
径的方块数为1;否则,疏散出口位于最短路径的另一端。
[0256] S5:结合最短路径和疏散出口的位置,进行疏散动画模拟。
[0257] 动画可以理解为静态画面的连续展示,每个画面称为帧,结合最短路径和疏散出口的位置,绘制画面,如图3所示。
[0258] 实施例2
[0259] 为了对本方法中采用的技术效果加以验证说明,本实施例将以科学论证的手段验证本方法所具有的真实效果。
[0260] 基于图1的建筑模型,采用本方法分别计算获得单人单出口路径、单人多出口路径和多人多出口路径,计算结果分别如图4、5、6所示,图4中,矩形表示人员,圆形表示出口,以
方块的线框对象表示路径点;图5中,最短路径用黑线表示,其他路径用方块的线框对象表
示路径点;图6中,最短路径用方块表示,方块的线框对象表示路径点;由图4、5、6可见,本方
法能够很好的满足路径计算的需求。
[0261] 应当认识到,本发明的实施例可以由计算机硬件、硬件和软件的组合、或者通过存储在非暂时性计算机可读存储器中的计算机指令来实现或实施。方法可以使用标准编程技
术‑包括配置有计算机程序的非暂时性计算机可读存储介质在计算机程序中实现,其中如
此配置的存储介质使得计算机以特定和预定义的方式操作——根据在具体实施例中描述
的方法和附图。每个程序可以以高级过程或面向对象的编程语言来实现以与计算机系统通
信。然而,若需要,该程序可以以汇编或机器语言实现。在任何情况下,该语言可以是编译或
解释的语言。此外,为此目的该程序能够在编程的专用集成电路上运行。
[0262] 此外,可按任何合适的顺序来执行本文描述的过程的操作,除非本文另外指示或以其他方式明显地与上下文矛盾。本文描述的过程(或变型和/或其组合)可在配置有可执
行指令的一个或多个计算机系统的控制下执行,并且可作为共同地在一个或多个处理器上
执行的代码(例如,可执行指令、一个或多个计算机程序或一个或多个应用)、由硬件或其组
合来实现。所述计算机程序包括可由一个或多个处理器执行的多个指令。
[0263] 进一步,所述方法可以在可操作地连接至合适的任何类型的计算平台中实现,包括但不限于个人电脑、迷你计算机、主框架、工作站、网络或分布式计算环境、单独的或集成
的计算机平台、或者与带电粒子工具或其它成像装置通信等等。本发明的各方面可以以存
储在非暂时性存储介质或设备上的机器可读代码来实现,无论是可移动的还是集成至计算
平台,如硬盘、光学读取和/或写入存储介质、RAM、ROM等,使得其可由可编程计算机读取,当
存储介质或设备由计算机读取时可用于配置和操作计算机以执行在此所描述的过程。此
外,机器可读代码,或其部分可以通过有线或无线网络传输。当此类媒体包括结合微处理器
或其他数据处理器实现上文所述步骤的指令或程序时,本文所述的发明包括这些和其他不
同类型的非暂时性计算机可读存储介质。当根据本发明所述的方法和技术编程时,本发明
还包括计算机本身。计算机程序能够应用于输入数据以执行本文所述的功能,从而转换输
入数据以生成存储至非易失性存储器的输出数据。输出信息还可以应用于一个或多个输出
设备如显示器。在本发明优选的实施例中,转换的数据表示物理和有形的对象,包括显示器
上产生的物理和有形对象的特定视觉描绘。
[0264] 如在本申请所使用的,术语“组件”、“模块”、“系统”等等旨在指代计算机相关实体,该计算机相关实体可以是硬件、固件、硬件和软件的结合、软件或者运行中的软件。例
如,组件可以是,但不限于是:在处理器上运行的处理、处理器、对象、可执行文件、执行中的
线程、程序和/或计算机。作为示例,在计算设备上运行的应用和该计算设备都可以是组件。
一个或多个组件可以存在于执行中的过程和/或线程中,并且组件可以位于一个计算机中
以及/或者分布在两个或更多个计算机之间。此外,这些组件能够从在其上具有各种数据结
构的各种计算机可读介质中执行。这些组件可以通过诸如根据具有一个或多个数据分组
(例如,来自一个组件的数据,该组件与本地系统、分布式系统中的另一个组件进行交互和/
或以信号的方式通过诸如互联网之类的网络与其它系统进行交互)的信号,以本地和/或远
程过程的方式进行通信。
[0265] 应说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术
方案进行修改或者等同替换,而不脱离本发明技术方案的精神和范围,其均应涵盖在本发
明的权利要求范围当中。