(这不完全是我遇到的问题,但它是同构的,我认为这种解释对其他人来说最容易理解。)
假设我在n维空间中有一组点。以 3 个维度为例:
A : [1,2,3]
B : [4,5,6]
C : [7,8,9]
我还有一组向量来描述这个空间中可能的运动:
V1 : [+1,0,-1]
V2 : [+2,0,0]
现在,给定一个点dest,我需要找到一个起点p和一组矢量移动,它们将以最有效的方式将我带到dest 。效率被定义为“最少的移动次数”,不一定是“最小的线性距离”:如果移动集可以让您以更少的移动到达那里,则允许选择比其他候选者更远离dest的p 。move 中的向量必须是可用向量的严格子集;您不能多次使用同一个向量,除非它在输入集中出现多次。
我的输入包含约 100 个起点和约 10 个向量,我的维数为约 20。起点和可用向量将在应用程序的生命周期内固定,但我会为许多不同的终点寻找路径。我想优化速度,而不是内存。算法失败是可以接受的(找不到到dest的可能路径)。
使用已接受的解决方案进行更新
我采用了一种与下面标记为“已接受”的解决方案非常相似的解决方案。我遍历所有点和向量,并构建所有可到达点的列表以及到达它们的路线。我将此列表转换为 < dest , p+vectors > 的散列,为每个目标点选择最短的向量集。(还有一点对哈希大小的优化,这里不相关。)随后的dest查找在恒定时间内发生。