Anytime Dynamic A*算法中‘visited’节点的含义咨询
关于Anytime Dynamic A*中"visited"节点的定义与实现细节
1. "visited"的具体含义
在Anytime Dynamic A的ComputePath流程里,第19行提到的"visited"指的是该节点是否已经被从优先队列中取出并处理过(即扩展过其邻接节点)。这和传统A里的"closed列表"概念一致——当节点被弹出优先队列、完成邻接节点遍历后,就被视为"已访问"。
2. 是否需要添加visited布尔属性?
是的,你需要为每个节点添加visited布尔属性(或者单独维护哈希集合/数组记录已访问节点,不过节点自带属性在Java中更直观)。算法需要快速判断节点是否已被处理,避免重复扩展造成资源浪费和逻辑错误。
3. 标记"已访问"和"未访问"的时机
- 标记为已访问:当你从优先队列(AD*的OPEN列表)中取出节点
s,准备处理它的邻接节点s′之前,即可将s标记为visited = true;也可以在完成s的所有邻接节点处理后标记,核心是确保节点被处理后不会再被重复取出处理。 - 标记为未访问:当环境发生动态变化(比如节点代价更新),需要重新规划路径时,要将受影响节点的
visited属性重置为false,同时把这些节点重新加入OPEN列表,让算法重新处理它们。另外,每次启动新的ComputePath流程时,也要根据场景重置相关节点的visited状态,避免上次的状态干扰新路径计算。
Java 21实现提示
你可以给节点类(比如Node)添加private boolean visited;字段,配合isVisited()和setVisited(boolean)方法操作。如果节点数量较多,用HashSet<Node>记录已访问节点也可行,但节点需要正确重写equals()和hashCode()方法。
内容的提问来源于stack exchange,提问作者Elijah Crum
相关产品推荐
相关产品推荐

