寻路算法难度

时间:2012-04-14 21:12:36

标签: algorithm shortest-path a-star

问题:

  

修改我们优化的A *算法以减少转弯次数。该算法现在将找到一个       从(a,b)到ANY TILE ADJACENT到(x,y)的路径,其中(x + 1,y)或(x-1,y)是有利的       如果可能的话。

我的尝试解决方案:

  1. 将原始A *算法从(a,b)运行到(x,y)。
  2. 查找路径中的最后一个坐标(x-1,)或(x + 1,),如果有的话。
  3. 如果在该坐标平面中存在从*到y的直线可访问垂直线,请修改该路径以跟随该线。
  4. 视觉演示:(从S到E的路径,其中X不可访问)

    ......S           .....S  
    .     X           .    X
    .          =>     .     
    .                 .
    E                E.
    

    但是我不确定我的解决方案在某些情况下会起作用,即:

    ......S            .....S  
    .     X            .    X
    .X        ???     X.     
    .                  .
    E                E..
    

    有人能想到这个问题的解决方案吗?

    注意:A *算法是通用的,除了考虑方向变化的数量,以便在结果路径中减少转弯。

2 个答案:

答案 0 :(得分:2)

A *实际上是Dijkstra's algorithm的通知版本,因此实际设计[使用admissible heuristic函数]来找到所有顶点的最短路径 [来自单一来源]

您可以将(x,y)附近的所有切片定义为目标顶点[A *可以整齐地处理多个目标],您还需要修改启发式函数,为任意<提供一个允许值/ em>目标节点。这可以通过简单地修改h'(tile) = max { h(tile) - 1 , 0}来完成 - 但在某些情况下,您可能有更好的方法来执行此操作。

建立上述内容后,我们可以对原始A *进行以下修改:

  1. 运行A *,直到找到目标图块的路径[在目标图块扩展后, 如上所述]。设路径的长度为d
  2. 现在,继续以当前状态运行A*,直至最小值 开放节点的f(tile)值严格大于d你是 保证找到所有可通过长度为d 的路径从源访问的切片,具体而言 - 您将找到所有具有来自长度d源的路径的目标切片。 [假设允许的启发式功能]。
  3. 从所有这些瓷砖中,您可以选择“首选”并返回 他们的路径。如果找不到首选的tile,则返回一个路径 任意目标图块。
  4. 我希望有所帮助!

答案 1 :(得分:0)

修改您的启发式功能,以略微提升积分(x+1,y)(x-1,y)。然后,如果距离完成路径只有两步,则会打破关系以支持这两点。