2017-03-01 38 views
0

我正在使用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])(...)'? –

回答

0

你確定你在打印之前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