如果我有一个可以向四个方向移动的2D环境,但除了那些方向之外,我可以冲向一个方向,直到我撞到一堵墙,我将如何计算一个可接受的启发式?无论是移动还是破折号,每个都有一个G成本为1,所以冲刺和行走的权重相等。我应该使用A *吗?如果在某些情况下,多次冲刺会比移动更快地到达目的地,即使在某些时候你在冲刺后离目的地更远,哪种寻路方式能够计算最佳路径?
答案 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。它利用了世界上的对称性来减少开集中的节点数。