一个二进制字符串上的突变(遗传算法)-python-3.x

问题描述:

我正在使用python-3.x,并且我正尝试在一个二进制字符串上进行突变,这个二进制字符串将从0翻转为1的元素或通过随机1比0,我尝试了一些方法,但没有工作,我不知道问题出在哪里:一个二进制字符串上的突变(遗传算法)-python-3.x

x=[0, 0, 0, 0, 0] 

def mutation (x, muta): 
    for i in range(len(x)): 
     if random.random() < muta: 
      x[i] = type(x[i])(not x[i]) 
    return x, 
print (x) 

例如输出应该是X = [0,0,0,1, 0]或x = [1,0,0,0,0]等....

另外,我试图这样一个:

MUTATION_RATE = 0.5 
CHROMO_LEN = 6 
def mutate(x): 
    x = "" 
    for i in range(CHROMO_LEN): 
     if (random.random() < MUTATION_RATE): 
      if (x[i] == 1): 
       x += 0 
      else: 
       x += 1 
     else: 
      x += x[i] 
    return x 
print(x) 

请任何建议或意见可以理解

+0

用'类型是什么(X [1])(不是X [1])'...? –

+0

x [i] – azeez

+0

的值但是你为什么要'type(x [i])(...)'? –

你确定你在打印之前x正在调用该函数:

def mutation(x): 
    # your code without the trailing comma 

mutation(x) 
print(x) 

在Python中,创建一个新的列表通常优选突变旧的。我会写你的第一个功能是这样的(我转换的整数布尔值,因为你只是翻转它们:通过再次分配给它

x = [False, False, False, False] 


def mutation(x, muta): 
    return [not e if random.random() < muta else e 
      for e in x] 

更改x

x = mutation(x, .5) 

您的原始功能工作如果您删除return后面的逗号:

def mutation(x, muta): 
    for i in range(len(x)): 
     if random.random() < muta: 
      x[i] = type(x[i])(not x[i]) 
    return x 
x = [False, False, False, False] 


mutation(x, .5) 
Out[8]: [False, False, True, False] 

mutation(x, .5) 
Out[9]: [True, True, True, False] 
+0

我不会说最好创建一个新的列表,而不是改变一个旧的列表......完全取决于你的用例。 –

+0

是的,但没有任何变化 – azeez

+0

@ juanpa.arrivillaga我认为这更多的是一种观点,但除非性能是一个问题,否则我真的很感谢函数,而不是在我调用函数时没有明确赋值的值。 – Ben

你也可以使用Python的XOR operator翻转位,这将 '1' 和 '0' 之间翻转:

x[1] = x[1]^1

参见:Python XOR preference: bitwise operator vs. boolean operators

+0

伟大的想法谢谢, – azeez