Sto provanto a realizzare il programma spiegato in questa pagina: http://en.wikipedia.org/wiki/Weasel_program, ma ho riscontrato un problema che non riesco a spiegarmi; il codice sorgente è questo:
Il succo del problema è che l'istruzione "mutatore(bos)" mi restituisce sotto array sempre uguali fra loro, che si uniformano (non capisco perché) con l'istruzione "madre[x][n]=tot_Chars[random.randint(0,len(tot_Chars)-1)]"; una cosa che ho trovato anche più strana è che se dopo la riga "bos[x]=bos[0]" inserisco, a capo e quindi non dipendente da "range", questa istruzionecodice:def main (frase,gen,mut): #'frase' è la frase di arrivo, 'gen' il numero di "figli", 1/mut la probabilità di mutazione def StrToArr (string): #trasforma una stringa in un array i cui elementi sono le lettere della parola arr=[] i=0 for n in string: #percorre 'string' e mette ogni lettera alla fine dell'array arr[i:]=n i=i+1 return arr tot_Chars=StrToArr(" qwertyuiopasdfghjklzxcvbnm") arr=StrToArr(frase) boss=range(gen) #si crea un array contenitore, in modo che ad ogni numero di 'boss' si possa sostituire un array formato da len(arr) lettere ###Crea l'array madre, sul quale poi si lavorerà for x in boss: #non c'è bisogno di un contatore in quanto x è un numero caso=[] #N.B.: 'caso' e 'i' si riazzerano ogni volta che x aumenta di 1, ovvero ad ogni giro (infatti ogni elemento di 'boss' è maggiore di uno del precedente) i=0 while i<(len(arr)): #crea un array della lunghezza di 'frase' in cui ogni elemento è un carattere casuale dell'alfabeto o uno spazio caso[i:]=tot_Chars[random.randint(0,len(tot_Chars)-1)] i=i+1 boss[x]=caso #########################1 def mutatore (madre): global data data={} #ogni array è indicato da una chiave che è uguale, per comodità, alla sua posizione in "madre", e a cui corrisponde un valore che indica le lettere che ha in comune e nella stessa posizione con "arr" for x in range(len(madre)): #scorre ogni array contenuto in 'madre' data[x]=0 for n in range(len(madre[x])): #all'interno di ogni array c'è il "1/mut" di probabilità che ogni carattere muti a=random.randint(0,mut-1) ##""" if a==0: #se a=0 (c'è 1/mut di probabilità che sia così) il carattere muta madre[x][n]=tot_Chars[random.randint(0,len(tot_Chars)-1)] if madre[x][n]==arr[n]: #se il carattere che occupa la posizione "n" nell'array che occupa la posizione "x" in "madre" è uguale a quello che occupa la posizione "n" in "arr", il valore di "data" corrispondente all'array aumenta di uno data[x]=data[x]+1 print madre return madre boss=mutatore(boss) valori=data.values() #crea un array a cui corrispondono i valori di "data", ovvero gli indici di somiglianza valori.sort() #mette in ordine i valori in modo che l'ultimo sia il più alto coppie=data.items() for x in range(len(coppie)-1): #all'intero dell'array di turple nella forma (chiave,valore) ricerca le turple in cui il secondo termine, ovvero il valore, è uguale all'ultimo elemento di "valori", ovvero il valore più alto; una volta fatto ciò individua la chiave corrispondente per poi aggiungerla al termine di "boss" if coppie[x][1]==valori[-1]: boss.append(boss[coppie[x][0]]) boss[0]=boss[-1] #gli array più simili ad "arr" sono quelli che seguono "arr[gen-1]"; anche nel caso ci siano più array con un punteggio identico, si preleva l'ultimo per comodità (e per simulare la presenza del caso) del boss[1:] #con l'istruzione "boss=boss[-1]" non si ottengono sotto-array boss=[["k","l","d"]] #parte non funzionale al prgramma, inserita come test bos=range(gen) for x in range(gen): bos[x]=boss[0] print mutatore(bos) c="met" main(c,5,5)tutto funziona come mi aspetto.codice:bos=[["k","l","d"],["k","l","d"],["k","l","d"],["k","l","d"],["k","l","d"]]

Rispondi quotando