使用给定的起点和终点生成所有路径

时间:2017-10-09 01:28:05

标签: python loops graph iteration

这似乎是一个简单的问题,但实际上将它实现到代码中给我带来了很多麻烦。我希望在Python中编写一个循环,遍历所有可能的长度为L的不同路径。

此路径中的第一个节点必须为0,最后一个节点必须为整数n - 1。第一个节点和最后一个节点之间的每个节点都可以是[0 , n-1]中的任何整数,但必须与其前面的一个节点和后面的一个节点不同。

n可以是[2, 7]中的任意整数,L可以是任意整数> = 3.

例如,如果n = 4L = 3,循环应该遍历

[ 0, 1, 3]
[ 0, 2, 3]

对于n = 4L = 4,循环应该遍历

[ 0, 1, 0, 3]
[ 0, 1, 2, 3]
[ 0, 2, 0, 3]
[ 0, 2, 1, 3]
[ 0, 3, 0, 3]
[ 0, 3, 1, 3]
[ 0, 3, 2, 3]

我想要生成此路径的过程如下。

  1. 遍历所有数字0到( n - 1)^(L-3)
  2. 将这些数字转换为基数n - 1
  3. 将其转换回字符串,向左追加0,直到其长度为L - 3
  4. 对于这些数字中的每一个,遍历所有数字[0, n-2]并将这些数字附加到右侧。请将这些称为path_ids
  5. 使用第一个节点[0]
  6. 开始新路径
  7. 对于path_id中的每个数字,但最后一个数字创建列表x = range(n),请移除x路径中的上一个节点,并将x[ digit]附加到您的路径
  8. 对于路径ID中的最后一位数,请创建x = range(n)删除路径中的最后一个节点,并从n-1移除x,将x[ digit]添加到您的路径中。
  9. n-1附加到路径的末尾。
  10. 对于我的问题,这似乎是一个非常复杂的过程,最终可能会使我的代码速度降低到无法使用的程度。我正在寻找一种简单的方法来做到这一点。这个过程将在所有可能路径长度的迭代中进行,我将迭代生成的每个路径并检查它是否满足某些条件,如果是,我将存储它。然后,我将遍历满足这些条件的每条路径,并检查其他条件以获得最佳条件。可能会有很多最好的'路径,所以我必须对它们进行排序。你可以想象,低效地编写这个函数会大大减慢我的整个程序。

    我为屠杀格式而道歉,我已经潜伏了一段时间,但这是我问过自己的第一个问题。

1 个答案:

答案 0 :(得分:0)

你想要itertools.product(range(n-1), repeat=L-2)。然后计算每个组合模块 n 的累积总和(从1开始)。这样可以避免所有重复,除了最后,你只需要检查它。

(当问话者想要不重复的随机数时,我看到了这个建议,但它也适用于此。如果我能再次找到它,我会发布一个链接。)