问题描述
这是我的代码,我稍微翻转一下,跨越两个列表并选择列表的随机元素:
def selRandom(individuals,k):
return [random.choice(individuals) for i in range(k)]
def cxOnePoint(ind1,ind2):
size = min(len(ind1),len(ind2))
cxpoint = random.randint(1,size - 1)
ind1[cxpoint:],ind2[cxpoint:] = ind2[cxpoint:],ind1[cxpoint:]
return ind1,ind2
def mutFlipBit(individual,indpb):
for i in range(len(individual)):
if random.random() < indpb:
individual[i] = type(individual[i])(not individual[i])
return individual,def operators(selection,crossover,mutation,parent,k,indvpb):
select = ['randomSelection']
cx = ['OnePoint']
mutate = ['flipBitMutate']
if selection not in select:
return "invalid"
else:
if selection == 'randomSelection':
(parent) = selRandom(parent,k)
if crossover not in cx:
return "invalid"
else:
if crossover == 'OnePoint':
ind = cxOnePoint(parent[0],parent[1])
if mutation not in mutate:
return "not valid"
else:
if mutation == 'flipBitMutate':
mutatedindvidual = mutFlipBit(ind[0],indvpb)
return parent,ind,mutatedindvidual
我运行它来执行代码:
indv = ([1,1,1],[0,0],[1,1])
selection = 'randomSelection'
crossover = 'OnePoint'
mutation = 'flipBitMutate'
selected_parent,mutatedindvidual = operators(selection = selection,crossover = crossover,mutation = mutation,parent = indv,k = 3,indvpb = 0.1 )
print("Parents:\n",indv)
print("Selected parent to reproduce:\n",selected_parent)
print("Crossover offsprings:\n",ind)
print("Mutated offsprings",mutatedindvidual)
并得到结果:
Parents:
([1,1])
Selected parent to reproduce:
[[1,0]]
Crossover offsprings:
([1,1])
Mutated offsprings ([1,)
所以代码正在执行但没有运行。它从元组中随机选择,然后它不会交叉(混合来自两个列表的位)或翻转位。如果我单独测试运行代码(在操作符方法之外),它可以工作:
a = [1,1]
b = [0,0]
c = [1,1]
d= (a,b,c)
print("selecting randomely:\n",selRandom(d,1))
print("TESTING CROSSOVER\n",cxOnePoint(a,b))
print("Mutate:\n",mutFlipBit(a,0.4))
并得到正确的结果:
selecting randomely:
[[0,0]]
TESTING CROSSOVER
([1,1])
Mutate:
([0,)
谢谢!
解决方法
回答我自己的问题:
-
我已在
mutFlipBit()
和cxOnePoint
中分配了原始列表,并将“mutFlipBit()”更改为:def mutation(individual,indp): return [not ind if random.random() < indp else ind for ind in individual]
这对我有用