我正在研究此处描述的 Anytime Dynamic A* 算法的实现。我完成了初始基本实现的约 50%,但停留在以下行:
在该程序的ComputePath
第 19 行中
如果 s′ 在此之前没有被访问过
这是我能找到的唯一一行提到“访问”节点的内容。“访问”是什么意思?我是否需要为每个节点添加一个visited
布尔值?如果需要,我什么时候才能使节点被访问或未被访问?
我确信这没关系,但我用 Java 21 编写了这个实现
我正在研究此处描述的 Anytime Dynamic A* 算法的实现。我完成了初始基本实现的约 50%,但停留在以下行:
在该程序的ComputePath
第 19 行中
如果 s′ 在此之前没有被访问过
这是我能找到的唯一一行提到“访问”节点的内容。“访问”是什么意思?我是否需要为每个节点添加一个visited
布尔值?如果需要,我什么时候才能使节点被访问或未被访问?
我确信这没关系,但我用 Java 21 编写了这个实现
在图搜索算法中,“访问”通常意味着计算某个节点的属性、子节点或以其他方式评估某个节点。人们会问,“我之前看过这个吗?”在你引用的论文(第 2 节)的稍早部分,它说:
看起来
v(s)
,、g(s)
和bp(s)
的值都保证在第 15 行之后的代码中设置,所以我会s
在那里标记为“已访问”,并确保所有节点都以未访问状态开始。至于如何将节点标记为已访问,布尔值可能是最简单的方法,但有很多选择。然而:
更务实地说,在我看来,检查一个节点是否曾经被访问过的唯一原因是确保
v(s)
、g(s)
和的值bp(s)
都初始化为某些起始值,所以如果你将状态表示为对象,你可能只需在构造函数中设置这些值,而完全忽略“访问”的废话。检查节点是否已被访问的两个 if 语句都只是初始化这些值,因此只要您在创建新状态时在构造函数中设置它们,您就应该能够安全地删除这些 if 语句。