A *使用潇洒技工寻路

时间:2016-01-15 15:40:55

标签: path-finding a-star

如果我有一个可以向四个方向移动的2D环境,但除了那些方向之外,我可以冲向一个方向,直到我撞到一堵墙,我将如何计算一个可接受的启发式?无论是移动还是破折号,每个都有一个G成本为1,所以冲刺和行走的权重相等。我应该使用A *吗?如果在某些情况下,多次冲刺会比移动更快地到达目的地,即使在某些时候你在冲刺后离目的地更远,哪种寻路方式能够计算最佳路径?

1 个答案:

答案 0 :(得分:0)

启发式:如果从不过度估算达到目标的成本,则可以接受启发式。由于您使用了四个基本方向,因此允许的启发式方法是在起点和终点之间采用曼哈顿距离(L1-Norm),称之为dist。然后将dist除以单个短划线中的切片数量。使用这种启发式方法,你无法高估它。

计算最佳路径:如果使用可接受的启发式算法,则可以使用A-Star计算最佳路径。关键是你的node.getNeighbors()方法返回与当前节点相邻的邻居,即返回(N)orth,(S)outh,(E)ast和(W)est,以及那些可到达的邻居从当前节点开始的短划线(即dashDist - 瓦片到N / S / E / W)。该方法可能如下所示:

public List<Node> getNeighbors(){
    List<Node> neighbors = new LinkedList<Node>();
    neighbors.addAll(this.getAdjacentNeighbors());
    neighbors.addAll(this.getDashableNeighbors());
    return neighbors;
}

private List<Node> getAdjacentNeighbors(){
    //implement code to get the adjacent neighbors
}

private List<Node> getDashableNeighbors(){
    //implement code to get the neighbors 1-dash away
}

另一个考虑因素:我认为短划线是直线发生的......在这种情况下,我建议调查JumpPointSearch algorithm。它利用了世界上的对称性来减少开集中的节点数。