[Tutor] sorry, another update bug
Vincent Wan
wan at walrus.us
Thu Jan 13 06:59:20 CET 2005
sorry to inflict another dumb bug on you all so soon...
I have written a program to replicated simulate the evolution of
species and their genomes based on David Raup and Stephen Jay Gould's
1974 paper in systematic zoology 23: 305-322. The program correctly
evolves species and keeps track of relationships. The genome of the
species is mutated correctly (shown by the debug write lines) but all
species in the genomes in the living_species are updated to the last
mutated genome.
sample output:
parent species genome: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
species 1 genome after mutation: [1, 1, 1, 1, 0, 1, 1, 0, 1, 1]
parent species genome: [1, 1, 1, 1, 0, 1, 1, 0, 1, 1]
species 2 genome after mutation: [2, 1, 2, 1, 1, 1, 1, 0, 2, 2]
parent species genome: [2, 1, 2, 1, 1, 1, 1, 0, 2, 2]
species 3 genome after mutation: [2, 2, 3, 1, 2, 1, 2, 0, 3, 2]
parent species genome: [2, 2, 3, 1, 2, 1, 2, 0, 3, 2]
species 4 genome after mutation: [2, 2, 3, 2, 3, 1, 3, 0, 4, 2]
parent species genome: [2, 2, 3, 2, 3, 1, 3, 0, 4, 2]
species 2 genome after mutation: [2, 2, 3, 2, 3, 2, 3, 1, 5, 3]
parent species genome: [2, 2, 3, 2, 3, 2, 3, 1, 5, 3]
species 2 genome after mutation: [2, 3, 3, 2, 3, 3, 3, 2, 6, 4]
parent species genome: [2, 3, 3, 2, 3, 3, 3, 2, 6, 4]
species 2 genome after mutation: [2, 3, 3, 2, 4, 4, 3, 3, 6, 5]
parent species genome: [2, 3, 3, 2, 4, 4, 3, 3, 6, 5]
species 3 genome after mutation: [2, 4, 4, 2, 5, 4, 3, 4, 6, 5]
parent species genome: [2, 4, 4, 2, 5, 4, 3, 4, 6, 5]
species 4 genome after mutation: [3, 4, 4, 2, 5, 4, 4, 4, 7, 5]
parent species genome: [3, 4, 4, 2, 5, 4, 4, 4, 7, 5]
species 4 genome after mutation: [3, 4, 5, 2, 5, 5, 4, 4, 8, 6]
parent species genome: [3, 4, 5, 2, 5, 5, 4, 4, 8, 6]
species 4 genome after mutation: [3, 5, 6, 2, 5, 6, 5, 4, 9, 7]
parent species genome: [3, 5, 6, 2, 5, 6, 5, 4, 9, 7]
species 5 genome after mutation: [3, 6, 6, 2, 5, 7, 6, 5, 10, 7]
parent species genome: [3, 6, 6, 2, 5, 7, 6, 5, 10, 7]
species 5 genome after mutation: [4, 7, 7, 3, 6, 7, 7, 6, 11, 7]
parent species genome: [4, 7, 7, 3, 6, 7, 7, 6, 11, 7]
species 6 genome after mutation: [4, 8, 8, 4, 6, 8, 8, 6, 11, 8]
parent species genome: [4, 8, 8, 4, 6, 8, 8, 6, 11, 8]
species 7 genome after mutation: [4, 9, 8, 5, 7, 8, 8, 6, 12, 8]
parent species genome: [4, 9, 8, 5, 7, 8, 8, 6, 12, 8]
species 6 genome after mutation: [5, 10, 8, 6, 8, 9, 9, 7, 13, 9]
15 species evolved
living_species:
species: 6 born time: 18 died time: 0 genome: [5, 10, 8, 6, 8, 9, 9,
7, 13, 9]
species: 8 born time: 29 died time: 0 genome: [5, 10, 8, 6, 8, 9, 9,
7, 13, 9]
species: 10 born time: 31 died time: 0 genome: [5, 10, 8, 6, 8, 9, 9,
7, 13, 9]
species: 14 born time: 39 died time: 0 genome: [5, 10, 8, 6, 8, 9, 9,
7, 13, 9]
species: 15 born time: 41 died time: 0 genome: [5, 10, 8, 6, 8, 9, 9,
7, 13, 9]
species: 16 born time: 43 died time: 0 genome: [5, 10, 8, 6, 8, 9, 9,
7, 13, 9]
dead_species:
species: 4 born time: 3 died time: 5 genome: [5, 10, 8, 6, 8, 9,
9, 7, 13, 9]
species: 3 born time: 1 died time: 8 genome: [5, 10, 8, 6, 8, 9,
9, 7, 13, 9]
species: 2 born time: 1 died time: 9 genome: [5, 10, 8, 6, 8, 9,
9, 7, 13, 9]
species: 1 born time: 1 died time: 17 genome: [5, 10, 8, 6, 8, 9,
9, 7, 13, 9]
species: 5 born time: 13 died time: 20 genome: [5, 10, 8, 6, 8, 9,
9, 7, 13, 9]
species: 0 born time: 0 died time: 30 genome: [5, 10, 8, 6, 8, 9,
9, 7, 13, 9]
species: 7 born time: 27 died time: 32 genome: [5, 10, 8, 6, 8, 9,
9, 7, 13, 9]
species: 9 born time: 30 died time: 36 genome: [5, 10, 8, 6, 8, 9,
9, 7, 13, 9]
species: 12 born time: 36 died time: 41 genome: [5, 10, 8, 6, 8, 9,
9, 7, 13, 9]
species: 11 born time: 33 died time: 42 genome: [5, 10, 8, 6, 8, 9,
9, 7, 13, 9]
species: 13 born time: 37 died time: 43 genome: [5, 10, 8, 6, 8, 9,
9, 7, 13, 9]
tree:
(((0,((6,9),((7,((10,((13,16),14)),(11,(12,15)))),8))),4),((1,5),(2,3)))
code:
import random
debug = 1
living_species = [[0, 0, 0, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]]
dead_species = []
tree = "*0*"
current_time = 0
current_species_counter = 0
max_species = 16 # the number of species to be evolved + 1
branching_probablity = .1
extinction_probablity = .1
mutation_rate = .5
def mutate_genome(a_genome, rate):
"For each base in a genome there is a rate chance it is set to 1"
current_base = 0
while current_base < len(a_genome):
if random.random() <= rate:
a_genome[current_base] = a_genome[current_base]+ 1
current_base += 1
return a_genome
while current_species_counter < max_species:
counter = 0
while counter < len(living_species):
if random.random() < branching_probablity:
current_species_counter += 1
current_species = [current_species_counter, current_time,
0, living_species[counter][3]]
if debug: print 'parent species genome:',
living_species[counter][3]
living_species.append(current_species)
living_species[len(living_species)-1][3] =
mutate_genome(current_species[3], mutation_rate)
if debug: print 'species ', len(living_species)-1, 'genome
after mutation:', living_species[len(living_species)-1][3]
# updates species tree
target = '*' + str(living_species[counter][0]) + '*'
replacement = '(' + target + ',*' + str(current_species[0])
+ '*)'
tree = tree.replace(target, replacement)
counter += 1
# if debug: print 'at time ', current_time, ' living_species: ',
[row[0] for row in living_species]
print 'at time ', current_time, ' living_species: ',
living_species
counter = 0
while counter < len(living_species):
if random.random() < extinction_probablity:
newly_dead = living_species[counter]
newly_dead[2] = current_time
dead_species.append(newly_dead)
living_species.remove(living_species[counter])
if len(living_species) == 0: # when the last
living_species goes extinct exit
break
counter += 1
# if debug: print 'at time ', current_time, ' dead_species : ',
[row[0] for row in dead_species]
if len(living_species) == 0: # when the last living_species goes
extinct exit
break
current_time += 1
if current_species_counter < max_species:
print '\nall extinct with only ', current_species_counter + 1, '
species of ', max_species
else:
print max_species - 1, ' species evolved'
print 'living_species:'
for each in living_species:
print 'species:', each[0], 'born time: ', each[1], 'died time: ',
each[2]
print 'genome:', each[3]
print '\ndead_species: '
for each in dead_species:
print 'species:', each[0], 'born time: ', each[1], 'died time: ',
each[2]
print 'genome:', each[3]
tree = tree.replace('*','')
print 'tree: ', tree
Vincent
------------------------------------------------------------------------
--------------
PhD Candidate
Committee on the Conceptual and Historical Studies of Science
University of Chicago
PO Box 73727
Fairbanks, AK 99707
wan AT walrus DOT us (change CAPS to @ and . )
More information about the Tutor
mailing list