对大N的[1,2,3,...,N]的采样排列

ins*_*get 7 python large-data sample-data genetic-algorithm

我必须使用遗传算法来解决旅行推销员问题,我将不得不为家庭作业写作.

问题包括52个城市.因此,搜索空间是52!.我需要随机抽样(比方说)1000个range(1, 53)遗传算法初始种群的个体排列.

为了做到这一点,我试过:

>>> 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()
Run Code Online (Sandbox Code Playgroud)

所以我试过了

>>> random.sample(list(itertools.permutations(range(1, 53))), 1000)
Run Code Online (Sandbox Code Playgroud)

但是,鉴于它52!非常大,list操作最大化了我的计算机上的内存和交换空间.我不能只选择产生的前1000个排列itertools.permutations因为它是非常确定的并且会偏向我的遗传算法.

有没有更好的方法来实现这种抽样?

Mar*_*tos 7

你根本不需要置换.拨打random.sample(range(52), 52)1000次电话.

PS:你真的应该在你的所有工作中使用从零开始的索引(range(52)而不是range(1, 53)).事情通常会以这种方式变得更好.

  • 根据我的经验,你应该按照自己的方式去做,然后在你的输出语句中将它转换成教授的蹩脚惯例. (6认同)
  • @senderle random.sample工作*没有*替换它确实产生了排列.当样本大小与总体大小相同时,它相当于总体上的random.shuffle()(除了在原位随机播放的shuffle和样本将保持原始大小不变). (3认同)