大N时[1,2,3,...,N]的排列抽样

7 投票
1 回答
914 浏览
提问于 2025-04-17 11:19

我需要用一个遗传算法来解决一个叫做旅行商问题的作业。

这个问题涉及到52个城市,所以可能的组合有很多,实际上是52!(52的阶乘)。我需要随机生成大约1000种不同的城市排列,作为我遗传算法的初始种群。

为此,我尝试了:

>>> random.sample(itertools.permutations(range(1, 53)), 1000)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/random.py", line 314, in sample
    n = len(population)
TypeError: object of type 'itertools.permutations' has no len()

所以我试过

>>> random.sample(list(itertools.permutations(range(1, 53))), 1000)

但是,由于52!的数字非常大,我的电脑内存和交换空间都快用完了。我不能仅仅选择itertools.permutations生成的前1000个排列,因为这样会很有规律,可能会影响我的遗传算法的效果。

有没有更好的方法来实现这个随机抽样呢?

1 个回答

7

你根本不需要进行排列。只需调用 random.sample(range(52), 52) 这个命令1000次就可以了。

补充一下:在你所有的工作中,最好使用从零开始的索引(也就是用 range(52) 而不是 range(1, 53))。这样通常会更顺利。

撰写回答