2016-12-14 4 views
0
from pylab import * 
import numpy as np 
import sys 
def initial(): 
    generation = [0,0,1,1,1,1,1,1,1,0,0,0,0,0] 
    generation = generation 
    return generation 
def fitness(flag): 
    global transfer 
    transfer = [] 
    newgeneration1 = pairing() 
    scores = [1,2,3,7,6,5,3] 
    if flag < 1: 
     generation = initial() 
    else: 
     generation = newgeneration1 
    transfer.append(generation) 
    transfer.append(scores) 
    print(transfer) 
    return transfer 
def pairing(): 
    transfer = fitness(i) 
    scores = transfer[1] 
    generation1 = transfer[0] 
    newgeneration = [1,0,1,0,0,0,0,0,1,0,1,1,1,1] 
    return newgeneration 

initial() 
for i in range(3): 
    fitness(i) 
    pairing() 
    if i == 3: 
     scores = fitness(i) 
     print("The following is the final generation: ") 
     print(pairing(i-1)) 
     print("Here are the scores: ") 
     print(scores) 
     sys.exit() 

выше упрощенная версия того, что у меня есть с точкой зрения генетического кода алгоритма в питоне 3.5, когда я запускаю это я получаю сообщение об ошибке, которая говорит: максимальная глубина рекурсии превышена, я я пытаюсь заставить его сделать начальную функцию один раз, а затем петлю между фитнесом и спариванием для определенного количества итераций, проблема в том, что спаривание() создает новое поколение, а фитнес должен принимать это новое поколение и определять его пригодность , то он отправляет это на сопряжение, и создается новое новое поколение. вы получаете идею. Заранее благодарю за любую помощь!Python 3.5 - генетический алгоритм зацикливание

+0

'спаривание()' называется 'фитнес (я) и' фитнес() 'называется' спаривание() "без каких-либо условных суждений. Это мертвая петля. –

+0

И избегайте использования 'global'. Вместо этого передайте 'transfer' в' paring' – pylang

+0

Не делайте 'из импорта pylab *', если вы пытаетесь выполнить воспроизводимую работу. Это скроет ваше пространство имен. – pylang

ответ

0

Вот проблема:

Так позволяет пройти через вашу программу ...

  • Сначала вы звоните initial()
  • Далее вы звоните fitness(i)
  • внутри функции fitness вы называете paring
  • внутри paring функция вы звоните fitness
  • внутри функции fitness вы называете paring ....

То, что вы получили здесь бесконечный цикл, потому что fitness и paring продолжают называть друг друга

Вот решение:

def pairing(): 
    global transfer # transfer is a global variable, you don't need to call a function to get it 
    #transfer = fitness(i) 
    #scores = transfer[1] # you've already defined these variables, no need to define them again 
    #generation1 = transfer[0] 
    newgeneration = [1,0,1,0,0,0,0,0,1,0,1,1,1,1] 
    return newgeneration 

Я вынимаю некоторые ненужные Ли указанные в другом месте от вашей функции напорным, программа теперь работает, как это должно

Вот результат:

[[0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0], [1, 2, 3, 7, 6, 5, 3]] 
[[1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1], [1, 2, 3, 7, 6, 5, 3]] 
[[1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1], [1, 2, 3, 7, 6, 5, 3]]