两条路径的最短会合点

时间:2016-02-20 19:29:08

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

Example image

说明:

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

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

圆圈可以一步移动到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 个答案:

答案 0 :(得分:0)

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

1)从目标开始。   从绿球开始。查找(并跟踪)从绿色位置到红色节点位置的最短路径。这个就自己不会减少搜索但是如果你将搜索的深度限制为移动数字(即移动0搜索到0的深度移动1搜索到1的深度...移动n搜索到n的深度)它会减少你花在搜索上的时间,因为你只会搜索相关的深度,过去那些没有价值且不需要检查的东西。

2)如果你不需要,不要搜索。给你的搜索一个深度,你已经有每个节点的开始和结束的x,y位置,所以在你做A *搜索之前检查移动数和直线距离 例如:0,5(绿色当前位置)和0,0(红色开始位置)之间的最短距离是5,所以如果绿色物体处于移动状态,则移动4或更少,你知道即使它没有办法到达那里没有什么阻碍的方式。但是如果它移动了5个或更多你知道可能有一种方法可以及时到达那个位置,所以值得搜索一下路径实际需要多长时间。