Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python3
- from sys import stderr,argv
- import numpy as np
- from numpy import ones,zeros,fill_diagonal,max,mean,triu_indices
- from numpy.random import choice
- pop_size = int(argv[1])
- steps_total = int(argv[2])
- steps_skip = int(argv[3]) #после этого числа поколений в stdout идёт печать возраста предка.
- twochilds = list(range(pop_size))
- twochilds = twochilds + twochilds
- parents = ones(pop_size, dtype=np.int) #сначала все индивиды братья
- distances = ones((pop_size,pop_size), dtype=np.int) #поэтому общий предок каждой их пары жил 1 поколение назад
- fill_diagonal(distances,0) #кроме пары с самим собой :)
- ndx = triu_indices(pop_size,1)
- print(max(distances))
- for step in range(steps_total):
- if step % 100 == 0:
- print(step,file=stderr)
- #print(distances)
- d = distances[ndx]
- #d.sort()
- print(d,file=stderr)
- parents = choice(pop_size,size=pop_size) #случайное, неограниченное порождение потомков
- #parents = choice(twochilds,size=pop_size,replace=False) #строго 2 потомка
- #parents.sort()
- distances_new = zeros((pop_size,pop_size), dtype=np.int)
- for i in range(pop_size):
- for j in range(i+1,pop_size):
- pi = parents[i]
- pj = parents[j]
- if pi > pj:
- pi,pj = pj,pi
- distances_new[i,j] = distances[pi,pj]+1 #общий предок пары жил на одно поколеие раньшеб чем общих предок подителей пары
- distances=distances_new
- if step >= steps_skip:
- print(step,max(distances),mean(distances[ndx]))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement