【问题标题】:Permutations of list in Python without shifted arrangementPython中列表的排列没有移位排列
【发布时间】:2018-12-11 02:46:50
【问题描述】:

假设我有一个列表:[1, 2, 3]

这样一个列表的排列将是 [1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2] , 和 [3, 2, 1]

(Group 1) 但是,假设我们看一下排列 [1, 2, 3]。如果我们将它移一位,我们得到 [3, 1, 2]。再次执行此操作,我们得到 [2, 3, 1]。

(Group 2) 如果我们查看排列 [1, 3, 2] 并将其移一位,我们得到 [2, 1, 3]。再多一个,我们得到 [3, 2, 1]。

这两个排列组构成了列表的排列。

我的问题是,是否可以利用它来制作比来自 itertools 的排列更快的排列生成器。

我不介意我为每个组获得哪种列表排列,但我想减少生成排列所花费的时间。

(注意:我知道如果列表只有三个项目,这将没有用,但列表可以是各种大小,例如 25 或 100)。

【问题讨论】:

  • 您可以随时尝试并为每种方法计时,但我敢打赌,六包您不会做出明显更快的方法。从根本上说,它必须做几乎相同数量的工作,你只是改变它创建它们的顺序。
  • 生成两组三人组所花费的时间与生成一组六人组所花费的时间相同。代码可能更简单,但速度并不明显。
  • @CoryKramer 我知道三人一组的速度不会那么快,但我打算将它用于各种列表大小。我会将这些信息添加到我的问题中。
  • 正如@CoryKramer 已经指出的那样,您可能不会比python 内置实现快得多。但是,可能还有其他方法可以优化程序的执行时间。你能给我们更多的背景信息吗?你最终想要达到什么目的?你用这些排列做什么?
  • @chepner 更清楚地说,我并不是要生成给定的组。我想从每个组中生成任何一个给定的项目。所以,我正在寻找排列,但不认为移动了 n 次的列表与移动了 m 次的列表有任何不同。

标签: python permutation


【解决方案1】:

我不知道您是否有计算机科学背景,但您所描述的称为Travelling Salesman Problem

您提出的解决方案是“蛮力”算法,并且不会扩展到超过几个点。有更有效的替代算法。如果您需要计算确切的最优值,请查看链接文章中的Exact Algorithms 部分。如果一个好的解决方案“足够好”,您还可以使用启发式方法来缩短执行时间。

【讨论】:

  • 是的。我创建了一个遗传算法来近似最佳路线,并且可以选择计算确切的路线,以便比较遗传算法与实际结果相比的效果。我正在研究使用一种变体保持卡普算法,该算法对旅行商问题的对称版本进行了更好的优化。我找到了一个来源;但是,我对 CS 的理论知识几乎没有,所以我什至不知道如何从给定的论文中开始编写代码:link.springer.com/content/pdf/10.1007%2FBF01585505.pdf
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多