【问题标题】:Generate All Paths With a Given Start and End Point生成具有给定起点和终点的所有路径
【发布时间】:2018-03-20 03:30:37
【问题描述】:

这似乎是一个简单的问题,但实际上将其实现到代码中给我带来了很多麻烦。我正在寻找用 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. 对于path_id 中的每个数字,但最后创建一个列表x = range(n),从x 中删除路径中的前一个节点,并将x[ digit] 附加到您的路径中
  7. 对于路径 ID 中的最后一个数字,创建 x = range(n) 删除路径中的最后一个节点并从 x 中删除 n-1,将 x[ digit] 附加到路径中。
  8. n-1 附加到路径的末尾。

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

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

【问题讨论】:

  • 你试过什么代码?
  • but actually implementing it into code is giving me a lot of trouble 你尝试了什么,遇到了什么麻烦?这太笼统了,没人会给你代码。
  • @greenkraken 您能否将您的代码/策略编辑到您的问题中,而不是将其放入 cmets,以便更容易提供帮助?
  • @potential close voters OP 正在询问执行此操作的正确算法。这远非“过于宽泛”。

标签: python loops graph iteration


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    相关资源
    最近更新 更多