处理2D网格世界中A-star的基于时间的约束

时间:2016-09-03 09:30:01

标签: algorithm search graph-algorithm path-finding a-star

我从2D网格世界的图形开始,指定节点和边缘;并获得了一个开始和目标。我能够使用A *找到最短的路径。

现在问题略有修改,因为引入了时间概念,允许在当前节点等待。给出的问题可以考虑如下:

假设线性世界中的节点以阵列a(1:6)的形式存在。 代理必须从2开始并转到6.如前所述,我能够使用A *来计划。最佳路径是:2-> 3-> 4-> 5-> 6。

但是假设现在时间进入图片。像3> 4的每个转换意味着已经过了1个时间单位。代理在时间t = 0开始移动并且被告知它不能在时间t = 3时到达节点5。所以现在最佳路径是:2-> 3-> 4-> 4-> 5-> 6

但我无法思考如何使用A *来制定这个计划。我的想法是:我将计划3维=(x,y,t)而不仅仅是(x,y)。只要保留图形结构,A *就可以处理任何维度。

但是,我很困惑,因为我知道以(2,0)开始使用约定(节点,时间)。但目标是什么?我知道它是这样的:(6,t)。但我不知道是什么?所以任何时候我想从当前节点到目标计算我的启发式,我很难过,因为我不知道目标是什么?如何使用A *处理此问题。此示例仅具有代表性且高度简化。我在2D世界工作,但问题与示例中描述的相同。

引用一些研究论文来解决这些问题会非常有帮助,但请尽量避免引用对这个问题显然有点过分的研究。如果有人能给出最好的伪代码。

1 个答案:

答案 0 :(得分:0)

由于您的模型不是完全动态的,并且您事先知道更改,您可以通过对A *算法的这些简单更改找到您的路径:
首先,当您展开状态时,您始终认为可以留在那个节点。
第二,当你将一个州的邻居添加到你的边缘列表时,你应该检查你在问题中提到的时间和地点的限制:

state: position, time, h

current_state = priority_queue.top
priority_queue.add( state( current_state.position, current_state.time+1, new_h) )
for each neighbor of current state:
   if possible to be at neighbor.position at current_state.time+1
        priority_queue.add( state(neighbor.position, current_state.time+1, h) )

但是,如果你的世界是完全动态的,你应该实现类似D *的动态A *算法。或者您可以在初始模型上运行A *,然后每当您在路径中间遇到障碍物时,您会尝试在相对于障碍物更改地图时找到带有A *的新路径。