-
Notifications
You must be signed in to change notification settings - Fork 1
/
generations.py
65 lines (63 loc) · 2.16 KB
/
generations.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# bio_generations
# 45 seconds for (65536,100) = 145k/s
# 20 seconds for (30000,100) = 152k/s
# 6.73 seconds for (10000,100) = 148k/s
# 62 seconds for (5000,300) = 24k/s
# 208 seconds for (5000,6000) = 144k/s
# 192 seconds for (3000,7000) = 109k/s
import random
import math
import matplotlib.pyplot as plt
from IPython import embed
def get_organism():
return [random.randint(0,1),random.randint(0,1)]
def mate(a,b):
return [random.choice(a),random.choice(b)]
def generate_types(num_generations):
a_a = []
a_b = []
b_b = []
for generation in num_generations:
a_a_num = 0
a_b_num = 0
b_b_num = 0
for organism in generation:
if organism == [0,0]:
a_a_num += 1
elif organism == [0,1] or organism == [1,0]:
a_b_num += 1
else:
b_b_num += 1
a_a.append(a_a_num)
a_b.append(a_b_num)
b_b.append(b_b_num)
total = (a_a[0] + b_b[0] + a_b[0])/100
a_a = [a/total for a in a_a]
a_b = [a/total for a in a_b]
b_b = [a/total for a in b_b]
return a_a,a_b,b_b
def backplot(generations=None,others=[]):
if generations:
a_a,a_b,b_b = generate_types(generations)
else:
a_a,a_b,b_b = others
line_first, = plt.plot(a_a,label='AA genome')
line_second, = plt.plot(a_b,label='AB genome or BA genome')
line_third, = plt.plot(b_b,label='BB genome')
plt.legend([line_first,line_second,line_third],["AA genome","AB or BA genome","BB genome"])
def plot_generations(generations):
backplot(generations)
plt.show()
def savefig(generations,name):
backplot(generations)
plt.savefig(name)
def get_generations(num_individuals,num_generations):
generations = []
last_gen = [get_organism() for a in range(num_individuals)]
while len(generations) < num_generations:
newgen = [mate(random.choice(last_gen),random.choice(last_gen)) for a in range(num_individuals)]
generations.append(newgen)
last_gen = newgen
if len(generations) % 1000 == 0:
print("Currently at generation {0} out of {1}".format(len(generations),num_generations))
return generations