让我们考虑一个简单的网格,其中任何点与最多4个其他点(东北 - 西 - 南邻域)相连。
我必须编写程序,计算从所选初始点到任何目标点的最小路线,这些目标点是连接的(在任意两个目标之间存在由目标点组成的路线)。当然网格上可能存在障碍。
我的解决方案非常简单:我正在使用具有可变启发函数h(x)的A *算法 - 从x到最近目标点的曼哈顿距离。为了找到最接近的目标点,我必须进行线性搜索(在O(n)中,其中n - 目标点数)。这是我的问题:是否有更有效的解决方案(启发式函数)来动态找到最近的目标点(时间< O(n))?
或许A *不是解决这个问题的好方法吗?
答案 0 :(得分:7)
有多少个目标,几十个或几千个?如果您的方式可以正常工作,那么如果成千上万,那么nearest neighbor search将为您提供有关设置数据以便快速搜索的建议。
权衡是显而易见的,空间组织您的数据进行搜索将需要时间,而在小型集合上,暴力更容易维护。由于您经常进行评估,我认为在非常低的点数下构建数据是值得的。
另一种方法是修改洪水填充算法,该算法在洪水期间到达目的地点时停止。
答案 1 :(得分:1)
首先,决定是否需要进行优化,因为任何优化都会使代码复杂化,而对于少数目标,您当前的解决方案可能适用于像曼哈顿距离这样的简单启发式。
在迈出第一步之前,计算每个目标的启发式算法。记住最近的目标作为当前选择的目标,然后朝着它移动,但是从所有其他距离中减去朝向任何目标的最大可能进度。您可以将此第二个值视为“元启发式”;它是对其他目标的启发式的乐观估计。
在后续步骤中,计算当前目标的启发式算法,以及任何小于或等于启发式的“元启发式”目标。其他目标不可能有更好的启发式,因此您不需要计算它们。最近的目标成为新的目标;走向它,从其他人中减去最大可能的进展。重复直到你到达目标。
答案 2 :(得分:0)
使用Dijkstra的算法,该算法输出所有可到达点的最小成本。然后你只需从输出中选择目标点。
答案 3 :(得分:0)
你可以考虑this article如果你的目标不是太多并且想要简单的方法
<块引用>如果要搜索多个目标中的任何一个,请构建启发式 h'(x) 是 h1(x), h2(x), h3(x), ... 的最小值,其中 h1, h2, h3 是对附近每个点的启发式。
一种思考方式是我们可以添加一个新的零成本优势 从每个目标到一个新的图节点。新节点的路径 必定会经过其中一个目标节点。
如果您想搜索所有多个目标的路径,您最好 选项可能是 Dijkstra 算法,当您找到所有 目标。可能有 A* 的变体可以计算这些 路径;我不知道。
如果您想搜索单个目标附近的位置,请使用 A* 搜索 找到通往目标区域中心的路径。处理节点时 从 OPEN 集合中,当你拉一个足够近的节点时退出。