【问题标题】:A* Pathfinding with dashing mechanicA* 带冲刺机制的寻路
【发布时间】:2016-04-21 06:16:48
【问题描述】:

如果我有一个 2D 环境,我可以在其中向四个方向移动,但除了这些方向之外,我还可以向一个方向冲刺直到撞到墙,我将如何为此计算可接受的启发式?无论是移动还是冲刺,每个的 G 成本都为 1,因此冲刺和步行的权重相等。我什至应该使用 A* 吗?如果在某些情况下,多次冲刺比移动更快地到达目的地,即使在某个点冲刺后距离目的地更远,什么样的寻路能够计算出最佳路径?

【问题讨论】:

  • 是的,您可以使用 A*,只需在将可破折号的地方添加到开放集时将它们视为邻居
  • 安德鲁,你能解释一下 A* 是如何工作的吗?我不知道算法的名称。
  • @LajosArpad A* or A-Star 是一种常见的(也许是最常见的?)通用寻路算法。
  • @BeyelerStudios 然而,如果一个破折号让你比目的地更远,它的估计距离会更高,很可能不会被考虑,因为它的 F 成本会很高,即使它可能是更理想的路径。
  • 是的,启发式方法会很痛苦(像往常一样),例如,尝试将总可能的短跑距离(在任何方向)合并到 f 分数中

标签: path-finding a-star


【解决方案1】:

启发式:如果启发式永远不会高估实现目标的成本,则它是可以接受的。由于您使用四个基本方向,因此可以采用的启发式方法是取起点和目的地之间的曼哈顿距离(L1-Norm),称之为dist。然后将dist 除以单个破折号中的瓷砖数量。使用这种启发式方法,您绝对不会高估。

计算最优路径:只要使用可接受的启发式算法,您就可以使用 A-Star 计算最优路径。关键是您的 node.getNeighbors() 方法返回与当前节点相邻的邻居,即 (N)orth、(S)outh、(E)ast 和 (W)est,以及可以通过破折号到达的那些从当前节点开始(即dashDist-tiles 到 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。它利用世界上的对称性来减少开放集中的节点数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多