这似乎是一个简单的问题,但实际上将它实现到代码中给我带来了很多麻烦。我希望在Python中编写一个循环,遍历所有可能的长度为L
的不同路径。
此路径中的第一个节点必须为0,最后一个节点必须为整数n - 1
。第一个节点和最后一个节点之间的每个节点都可以是[0 , n-1]
中的任何整数,但必须与其前面的一个节点和后面的一个节点不同。
n
可以是[2, 7]
中的任意整数,L
可以是任意整数> = 3.
例如,如果n = 4
和L = 3
,循环应该遍历
[ 0, 1, 3]
[ 0, 2, 3]
对于n = 4
和L = 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]
我想要生成此路径的过程如下。
( n - 1)^(L-3)
。 n - 1
L - 3
。 [0, n-2]
并将这些数字附加到右侧。请将这些称为path_ids
path_id
中的每个数字,但最后一个数字创建列表x = range(n)
,请移除x
路径中的上一个节点,并将x[ digit]
附加到您的路径x = range(n)
删除路径中的最后一个节点,并从n-1
移除x
,将x[ digit]
添加到您的路径中。 n-1
附加到路径的末尾。 对于我的问题,这似乎是一个非常复杂的过程,最终可能会使我的代码速度降低到无法使用的程度。我正在寻找一种简单的方法来做到这一点。这个过程将在所有可能路径长度的迭代中进行,我将迭代生成的每个路径并检查它是否满足某些条件,如果是,我将存储它。然后,我将遍历满足这些条件的每条路径,并检查其他条件以获得最佳条件。可能会有很多最好的'路径,所以我必须对它们进行排序。你可以想象,低效地编写这个函数会大大减慢我的整个程序。
我为屠杀格式而道歉,我已经潜伏了一段时间,但这是我问过自己的第一个问题。
答案 0 :(得分:0)
你想要itertools.product(range(n-1), repeat=L-2)
。然后计算每个组合模块 n 的累积总和(从1开始)。这样可以避免所有重复,除了最后,你只需要检查它。
(当问话者想要不重复的随机数时,我看到了这个建议,但它也适用于此。如果我能再次找到它,我会发布一个链接。)