【问题标题】:Shortest meeting point of two paths两条路径的最短交汇点
【发布时间】:2016-06-02 08:44:25
【问题描述】:

解释:

在上面的示例图片中,任意路径后面都有一个绿色圆圈。

我希望红色圆圈以尽可能小的步骤与绿色圆圈相遇,如图所示。

圆圈可以一步移动到 8 个相邻单元格中的任何一个,黑色单元格不能被遍历。

路径表示为坐标列表。在这种情况下,绿色路径 是 [(0,3),(0,2),(0,1)...(5,0)].

为了找到最短的交汇点,我可以遍历绿色路径列表中的每个坐标,并使用 A* 算法找到从红色圆圈到该坐标的最短路径。如果返回的路径长度等于绿色圆圈到达该坐标所需的步数,则找到最短的会合点路径。

这当然是一种蛮力方法,Java 代码看起来像这样:

List<Coord> minMeetingPointPath(Coord redLoc, List<Coord> greenPath) {
    for (int step = 0; step < greenPath.size(); step++) {
        Coord greenLoc = greenPath.get(step);
        List<Coord> redPath = shortestPathAStar(redLoc, greenLoc);
        if (redPath.size() == step)
            return redPath;
    }
    return null;
}

问题

所以我的问题是:

  1. 是否有一种更有效的方法可以在不使用蛮力方法的情况下解决此问题?

【问题讨论】:

  • 一般来说这实际上有点棘手,因为最佳路径可能包括一个“等待”步骤(考虑起点相邻并且绿色向红色移动的情况,如果红色走到任何地方,它们将迟于时间=1)。
  • 另外,一般来说,在绿色到达网格边界之前,它们有时甚至不是解决方案。
  • 我认为这在这个特定的程序中不会有问题,因为他们会轮流迈出一步。
  • 好的,在这种情况下略有不同,但仍然很有趣:这意味着有时您的目标是领先绿色一步,然后让它在下一步中抓住您(但无需等待)。请注意,A* 不要求目标是空间中的固定位置,终止可以是任何条件,困难主要在于启发式,我将不得不考虑这一点。切比雪夫距离显然不起作用,也许如果你减半?

标签: language-agnostic shortest-path path-finding


【解决方案1】:

我有两种方法可以提高效率

1) 从目标开始。 从绿球开始。查找(并跟踪)从绿色位置到红色节点位置的最短路径。这本身不会减少搜索,但如果您将搜索深度限制为移动编号(即移动 0 搜索到深度 0 移动 1 搜索到深度 1 ...移动 n 搜索到深度 n ) 它将减少您花费在搜索上的时间,因为您只会搜索到相关深度,超过该点的任何内容都没有价值,也不需要检查。

2) 如果不需要,请不要搜索。给你的搜索一个深度,你已经有了每个节点的开始和结束的 x,y 位置,所以在你进行 A* 搜索之前检查移动编号和直线距离 例如:0,5(绿色当前位置)和 0,0(红色起始位置)之间的最短距离是 5,所以如果绿色物体正在移动,则移动 4 或更少,即使没有什么挡路。但是,如果它是移动 5 或更多,您知道可能有办法及时到达该位置,因此值得搜索以查看路径实际需要多长时间。

【讨论】:

  • 非常有用的答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
  • 2018-09-18
  • 2021-12-18
  • 2017-02-06
  • 2021-11-17
  • 1970-01-01
相关资源
最近更新 更多