Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 修改*以查找矩形网格上多个目标中最近目标的路径_Algorithm_Search_Linked List_A Star - Fatal编程技术网

Algorithm 修改*以查找矩形网格上多个目标中最近目标的路径

Algorithm 修改*以查找矩形网格上多个目标中最近目标的路径,algorithm,search,linked-list,a-star,Algorithm,Search,Linked List,A Star,问题是:在有障碍物的矩形网格上找到多个目标中最近的一个目标的路径。只允许上/下/左/右移动,不允许使用对角线。除其他外,我确实看到了。我没有看到任何人使用或建议我的特殊方法。我的方法有重大错误吗 这里我最重要的限制是,如果您愿意,将路径或任何列表表示为堆栈或单链接列表对我来说非常便宜。也就是说,固定时间访问顶部元素,打开以进行反转 对我来说显而易见的解决方案是使用曼哈顿距离启发式搜索从任何目标到起点的路径。从目标到起点的第一条路径将是到最近目标的最短路径,可能是许多路径中的一条,我不需要在遵循它

问题是:在有障碍物的矩形网格上找到多个目标中最近的一个目标的路径。只允许上/下/左/右移动,不允许使用对角线。除其他外,我确实看到了。我没有看到任何人使用或建议我的特殊方法。我的方法有重大错误吗

这里我最重要的限制是,如果您愿意,将路径或任何列表表示为堆栈或单链接列表对我来说非常便宜。也就是说,固定时间访问顶部元素,打开以进行反转

对我来说显而易见的解决方案是使用曼哈顿距离启发式搜索从任何目标到起点的路径。从目标到起点的第一条路径将是到最近目标的最短路径,可能是许多路径中的一条,我不需要在遵循它之前反转路径,它将是正确的顺序,起点在顶部,目标在末端

在伪代码中:

A*(start, goals) :
    init_priority_queue(start, goals, p_queue)
    return path(start, p_queue)

init_priority_queue(start, goals, q_queue) :
    for (g in goals) :
        h = manhattan_distance(start, g)
        insert(h, g, q_queue)

path(start, p_queue) :
    h, path = extract_min(q_queue)
    if (top(path) == start) :
        return path
    else :
        expand(start, path, q_queue)
        return path(start, q_queue)

expand(start, path, q_queue) :
    this = top(path)
    for (n in next(this)) :
        h = mahnattan_distance(start, n)
        new_path = push(n, path)
        insert(h, new_path, p_queue)
对我来说,以这种方式扭转搜索似乎很自然。这里有智囊团吗


还有另一个问题:假设我的优先级队列在具有相同优先级的元素上是稳定的,如果两个元素具有相同的优先级,则稍后插入的元素将出现得更早。我故意不定义上面的下一个:随机选择矩形网格上可能的下一个瓷砖的返回顺序似乎是一种非常廉价的方法,可以找到一条不可预测的、相当曲折的路径,穿过没有障碍物的矩形区域,在统计上,锯齿形路径的可能性更大,而不是沿着两条边。这是正确的吗?

就我所能看到的N log N而言,在大O中是正确和有效的,只要启发式是可接受和一致的,其中N=网格的单元数,假设您使用的优先级队列的操作在log N中工作。锯齿形也会工作

p、 对于这类问题,有一个在O1中工作的更有效的优先级队列。这类问题的意思是,在这个问题中,每对节点之间的有效距离是一个非常小的常数3

编辑:根据注释中的要求,以下是此问题的固定时间优先级队列的详细信息

首先,将图转换为以下图:让图中节点的潜力(即网格中的单元)为节点到目标(即启发式)的曼哈顿距离。我们称节点i的势为Pi。以前,相邻单元格之间有一条边,其权重为1。在修改后的图中,权重wi,j变为wi,j-Pi+Pj。这与证明A*是最优的图完全相同,并且在启发式允许且一致的情况下终止于多项式时间。注意,这个问题的曼哈顿距离启发法是可容许的和一致的

第一个关键的观察结果是原始图中的A*与修改图中的Dijkstra完全相同。这是因为修改后的图中节点i的值正好是到原点节点的距离加上Pi。第二个关键的观察结果是,在我们的变换图中,每条边的权重为0或2。因此,我们可以使用deque或双向链表而不是普通队列来模拟A*:每当我们遇到权重为0的边时,将其推到队列的前面;每当我们遇到权重为2的边时,将其推到队列的末尾


因此,该算法模拟A*并在最坏情况下以线性时间工作。

谢谢您的输入!但是,使用更高效的优先级队列意味着什么?什么样的实施?当时我正计划使用配对堆。