寻找路径组合的算法?

时间:2013-01-03 16:28:42

标签: algorithm math graph linear-algebra

想象一下,你在n - 维度欧几里德空间中有一个舞蹈机器人,从原点P_0 = (0,0,...,0)开始。

机器人可以进行m种类型的舞蹈动作D_1, D_2, ..., D_m

D_i是一个n - 整数向量(D_i_1, D_i_2, ..., D_i_n)

如果机器人使舞动i比其位置改变D_i

P_{t+1} = P_t + D_i

机器人可以按照自己的意愿和任何顺序进行任何次数的舞蹈动作。

k-dance 定义为k舞蹈动作的序列。

显然,有m^k可能的k-dances。

我们有兴趣知道k-dance的可能结束位置的集合,并且对于每个结束位置,有多少k-dances在该位置结束。

执行此操作的一种方法如下:

P0 = (0, 0, ..., 0);

S[0][P0] = 1

for I in 1 to k
    for J in 1 to m
        for P in S[I-1]
            S[I][P + D_J] += S[I][P]

现在S[k][Q]会告诉你有多少k-dances在Q位置结束

假设nm|D_i|较小(小于5)且k小于40。

有更快的方法吗?我们可以用某种线性代数相关技巧以某种方式直接计算S[k][Q]“?或其他一些方法?

3 个答案:

答案 0 :(得分:1)

您可以创建一个邻接矩阵,其中包含空间中的舞蹈移动过渡(它在k中可以到达的部分移动,否则它将是无限的)。然后,该矩阵的第n个幂的P_0行包含S [k]值。

有问题的矩阵很快变得庞大,类似于(k*(max(D_i_j)-min(D_i_j)))^n(如果Q接近原点,每个维度可以减半),但对于S矩阵也是如此

答案 1 :(得分:1)

由于1维问题与subset sum problem密切相关,你可能采取类似的方法 - 找到所有加在一起的舞蹈矢量组合,以获得正确的第一个坐标,恰好是k个动作;然后获取组合的子集并检查其中哪一个具有第二个的正确总和,并采用与两者匹配的子集并检查第三个,依此类推。

通过这种方式,您至少只需要为非常痛苦的O(n ^ k)步骤执行非常简单的添加。它确实会找到所有会达到给定值的向量。

答案 2 :(得分:1)

由于舞蹈动作是可互换的,你可以假设对于i < j,机器人首先在D_i移动之前进行所有D_j动作,从而减少实际计算的组合数量。

如果你跟踪每次舞蹈动作的次数,计算组合的总数应该很容易。