Advertisement
Guest User

Untitled

a guest
Jun 7th, 2018
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.79 KB | None | 0 0
  1. #!/usr/bin/env python3
  2.  
  3. from sys import stderr,argv
  4. import numpy as np
  5. from numpy import ones,zeros,fill_diagonal,max,mean,triu_indices
  6. from numpy.random import choice
  7.  
  8. pop_size    = int(argv[1])
  9. steps_total = int(argv[2])
  10. steps_skip  = int(argv[3]) #после этого числа поколений в stdout идёт печать возраста предка.
  11.  
  12. twochilds = list(range(pop_size))
  13. twochilds = twochilds + twochilds
  14.  
  15. parents   = ones(pop_size, dtype=np.int) #сначала все индивиды братья
  16. distances = ones((pop_size,pop_size), dtype=np.int) #поэтому общий предок каждой их пары жил 1 поколение назад
  17. fill_diagonal(distances,0) #кроме пары с самим собой :)
  18. ndx = triu_indices(pop_size,1)
  19. print(max(distances))
  20.  
  21. for step in range(steps_total):
  22.     if step % 100 == 0:
  23.         print(step,file=stderr)
  24.         #print(distances)
  25.         d = distances[ndx]
  26.         #d.sort()
  27.         print(d,file=stderr)
  28.     parents = choice(pop_size,size=pop_size) #случайное, неограниченное порождение потомков
  29.     #parents = choice(twochilds,size=pop_size,replace=False) #строго 2 потомка
  30.     #parents.sort()
  31.     distances_new = zeros((pop_size,pop_size), dtype=np.int)
  32.     for i in range(pop_size):
  33.         for j in range(i+1,pop_size):
  34.             pi = parents[i]
  35.             pj = parents[j]
  36.             if pi > pj:
  37.                 pi,pj = pj,pi
  38.             distances_new[i,j] = distances[pi,pj]+1 #общий предок пары жил на одно поколеие раньшеб чем общих предок подителей пары
  39.     distances=distances_new
  40.     if step >= steps_skip:
  41.         print(step,max(distances),mean(distances[ndx]))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement