如何保留可变长度

如何保留可变长度

问题描述:

我有兴趣在Python中使用使用DEAP的遗传算法。 knapasack can be seen here的示例实现。我试图创建自己的交叉功能,我想保留父母的长度如下:如何保留可变长度

# Crossover 
def crossover(ind1, ind2): 
    print len(ind1), len(ind2) #<------ length at the beginning 
    temp1 = copy.deepcopy(set(ind1)) 
    temp2 = copy.deepcopy(set(ind2)) 
    uniform = list(temp1.union(temp2)) 
    while len(ind1) > 0: 
     ind1.pop() 
    while len(ind2) > 0: 
     ind2.pop() 
    for i in range(max_no): 
     ind1.add(random.choice(uniform)) 
     ind2.add(random.choice(uniform)) 
    print len(ind1), len(ind2) #<---- length at the end 
    return ind1, ind2 

然而,IND1和IN2的在函数开头的长度从长度不同ind1和ind2结尾。开头的ind1和ind2的长度应该等于max_no。我希望有人能给我一个暗示,为什么会这样。我很难过。

谢谢,任何帮助将不胜感激。

编辑:这是我的变异函数。我也想保持的个人在这里的变长,你可以看到

def mutation(individual): 
    if len(individual) > 0: 
     individual.remove(random.choice(list(individual))) 
     individual.add(random.choice(nodes)) 
    return individual, 
+0

什么类型是个人?它好像是一个'set'?如果操作数已经存在,'.add'将会成为空操作。 –

+0

是的,个人功能作为一个集合。你是什​​么意思,没有操作? – meraxes

您的代码大多是相同的:

import random 

ind1 = set(range(100)) 
ind2 = set(range(100)[::-1]) 
uniform = list(ind1.union(ind2)) 
max_no = 100 
while len(ind1) > 0: 
     ind1.pop() 
while len(ind2) > 0: 
    ind2.pop() 
for i in range(max_no): 
    ind1.add(random.choice(uniform)) 
    ind2.add(random.choice(uniform)) 

结果

>>> print(len(ind1),len(ind2)) 
(64, 61) 

因为你的个人是集合,当你添加随机数时,每隔一段时间就会发生一次你添加两次的事情。然后,每次运行结果集的长度都会有所不同,因为如果它已经在个人中,则不会添加任何内容。

解决你的问题,你可以使用random.sample代替:

import random 

ind1 = set(range(100)) 
ind2 = set(range(-100,0,-1)[::-1]) 
uniform = list(ind1.union(ind2)) 
max_no = 100 
while len(ind1) > 0: 
    ind1.pop() 
while len(ind2) > 0: 
    ind2.pop() 
for x in random.sample(uniform,max_no): 
    ind1.add(x) 
for x in random.sample(uniform,max_no): 
    ind2.add(x) 

结果

>>> print(len(ind1),len(ind2)) 
(100, 100) 

话虽如此,set个人证明我痛苦万分。 sequence个人是迄今为止最好的支持。从documentation它是显而易见的是,dictset作为dict一个特例是not considered sequence types:

序列

可迭代经由的GetItem()特殊方法和定义了使用整数 索引支持高效的元素访问a len() 返回序列长度的方法。一些内置序列 类型是list,str,tuple和bytes。请注意,字典也支持 getitem()和len(),但被认为是映射而不是序列,因为查找使用任意不可变的键而不是整数。

+0

谢谢,这很完美! – meraxes