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() 

Au-dessus est une version simplifiée de ce que j'ai en termes d'un code de l'algorithme génétique en Python 3.5, quand je lance ce que je reçois une erreur qui dit: profondeur de récursivité maximale dépassée, je J'essaie de l'obtenir pour faire la fonction initiale une fois, puis boucle entre la remise en forme et l'appariement pour un certain nombre d'itérations, le problème est, appariement() crée une nouvelle génération, et fitness doit prendre cette nouvelle génération et déterminer son aptitude , puis il envoie cela à l'appariement, et une autre nouvelle génération est créée ... etc. vous avez eu l'idée. Merci d'avance pour votre aide!Python 3.5 - algorithme génétique en boucle

+0

'appariement()' a appelé 'condition physique (i)' et 'condition physique()' appelé 'appariement() 'retour sans jugement conditionnel. C'est une boucle morte. –

+0

Et évitez d'utiliser 'global'. Au lieu de cela, passez 'transfer' dans' paring' – pylang

+0

Ne faites pas 'de pylab import *' si vous essayez de faire un travail reproductible. Cela va taper votre espace de noms. – pylang

Répondre

0

Voici le problème:

permet donc marcher dans votre programme ...

  • D'abord, vous appelez initial()
  • Ensuite, vous appelez fitness(i)
  • dans la fonction fitness vous appelez paring
  • à l'intérieur dufonctionvous appelez fitness
  • dans la fonction fitness vous appelez paring ....

Qu'est-ce que vous avez ici est une boucle infinie, parce que fitness et paring continuent d'appeler les uns des autres

Voilà la solution:

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 

J'ai pris quelques-uns li inutile nes de votre fonction éplucher, le programme fonctionne maintenant comme il devrait

Voici la sortie:

[[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]]