2017-10-09 67 views
1

这似乎是一个简单的问题,但实际上将它实现到代码中给我带来了很多麻烦。我正在寻找在Python中编写循环遍历所有可能的长度为L的不同路径。使用给定的开始点和结束点生成所有路径

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

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

例如,如果n = 4L = 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] 

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

  1. 遍历所有数字0到(n - 1)^(L-3)
  2. 转换这些数字到基座n - 1
  3. 转换回一个字符串,追加0至左侧,直至它是长度L - 3的。
  4. 对于这些数字中的每一个,遍历所有数字[0, n-2]并将这些数字追加到右边。把这些我们path_ids
  5. 先从第一个节点的新路径[0]
  6. 对于在path_id每个数字,但最后创建列表x = range(n),删除一个节点,从x路径,并追加x[ digit]到您的路径
  7. 对于路径ID中的最后一位数字创建x = range(n)删除路径中的最后一个节点,并从x中删除n-1,将x[ digit]附加到您的路径。
  8. n-1附加到路径的末尾。

对于我的问题,这看起来像是一个非常复杂的过程,最终可能导致我的代码变慢,导致它无法使用。我正在寻找一种简单的方法来做到这一点。这个过程将在所有可能的路径长度的迭代之内,并且我将遍历每个生成的路径并检查它是否符合某些条件,如果是,我将存储它。然后,我将遍历每条满足这些条件的路径,并检查其他条件以获取最佳条件。可能会有很多'最好'的路径,所以我必须对它们进行排序。正如你可以想象的那样,低效地编写这个函数会极大地减慢我的整个程序。

对于屠宰格式我很抱歉,我一直在潜伏,但这是我问自己的第一个问题。

+1

你尝试过什么码? – APerson

+0

'但实际上将它实现为代码给我带来了很多麻烦'你试过了什么,你面临什么麻烦?这太宽泛了,没有人会提交你的代码。 –

+0

@greenkraken您是否可以将您的代码/策略编辑到您的问题中,而不是将它放入评论中,因此更容易提供帮助? – APerson

回答

0

你想要itertools.product(range(n-1), repeat=L-2)。然后计算每个组合模块n(从1开始)的累计和。这样可以避免所有重复内容,只是在最后检查完毕后才能检查。

(我看到这个建议时,提问者想不重复的随机数,但它工作在这里。我会发布一个链接,如果我能再次找到它。)

相关问题