0

如何修改 STRIPS 以避免进入循环或重复操作?假设我们有 A - B - C - D - E 作为区域(遍历问题),它们都是双向的。初始状态是我们处于 At(A),目标是我们需要处于 At(E)。结果可能是

`Travel(A, B) - Travel(B, C) - Travel(C, D) - Travel(D, C) - 

Travel(C, B) - Travel(B, C) - Travel(C, D) - Travel(D, E).

简而言之,它走 A - B - C - D - C - B - C - D - E。在中间,它来回走动。我需要一个关于如何解决这个问题的想法,以及你是否可以提供一个更好的伪代码。谢谢!

4

1 回答 1

2

您面临的问题是您的算法返回的是“答案”而不是最佳答案。您应该看看搜索算法以及它们如何保证找到最短路径,因为问题是同构的。

您获得这些结果的原因有很多,但总的来说,它应该与您使用的搜索方法有关。您的算法在直接“前进到 E”之前尝试“回到 C”,因为节点之间存在某种隐式排序偏好。

请注意,您只能从 A 到 B;从B 你可以去C 或A - 你要去C。为什么不能再A?如果您的算法没有进入从 A 到 B 到 A (...) 的无限循环,那么您很可能没有应用简单的深度优先搜索。这里的关键是理解为什么算法在到达 D 时决定返回 C。


除了深入了解您的算法和输入之外,这里还有一些想法:

如果您有一个已经访问过的节点列表并优先考虑未访问过的节点,也许您会找到更好/最佳的答案。如果它们之间的连接不改变,是否有必要访问一个节点两次?

或者,您是否限制了达到答案的步骤数?如果您事先知道达到目标所需的最大步数,那么将您的答案限制在该步数应该会产生最佳答案。

简单地继续搜索 - 而不是在达到第一个结果时停止 - 然后比较替代解决方案也是一种可能性。这可能会非常糟糕,但也不可避免地取决于上下文。

于 2014-11-12T10:29:56.927 回答