Psychic bug
Gerard Flanagan
grflanagan at yahoo.co.uk
Thu Feb 23 08:53:51 EST 2006
Jennifer Hallinan wrote:
> Hi,
>
> I have a mutate function for a genetic algorithm which is giving me
> odd results. I suspect I'm missing somthing really simple, so I'd be
> grateful for any suggestions. Basically, when I comment out the line
> which is commented out below, it works fine (although of course it
> doesn't change the genome). When I uncomment it gen[letter]
> automagically gets the value base in the print statements, before the
> assignment has been made. And it still doesn't update the genome.
> Genome is a string of integers in the range 0- 3, hence the
> conversion.
>
> def Mutate(self, mrate):
> g = Random(rseed)
> # If no mutation rate specified, use 1 per genome
> if mrate == -1:
> mrate = 1.0/len(self.genome)
> print "mrate is ", mrate
>
> print "original genome: "
> print self.genome
> # convert genome to a list
> gen = [ord(letter)-48 for letter in self.genome]
>
> for letter in range(len(gen)):
> rnum = g.random()
> if rnum < mrate:
> base = g.randint(0,3)
> print "base is ", base
> print "pos ", letter, gen[letter], " to ", base
> # gen[letter] = base
>
> # convert list back to a string
> self.genome = ''.join([str(x) for x in gen])
> print "final genome"
> print self.genome
>
[...]
>
> Thanks,
>
> Jen
Jen
how about storing the genome data as a list, then converting to a
string if needs be?
import random
class Genome(object):
def __init__(self, genome):
self.genome = list(genome)
self.mrate = 1.0/len(genome)
def __str__(self):
return ''.join(self.genome)
def Mutate(self):
for i in range(len(self.genome)):
if random.random() < self.mrate:
self.genome[i] = str(random.randint(0,2))
print
G = Genome( '10021010212021110' )
print G
G.Mutate()
print G
G.mrate = 0.8
G.Mutate()
print G
Gerard
More information about the Python-list
mailing list