1
0

76_dna.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import random
  2. import builtins
  3. builtins.print = lambda *x: None
  4. def f(x):
  5. return -x**2+10
  6. def create_init_DNA():
  7. # out: DNA
  8. ret = random.randint(-100,100)
  9. return int_to_bin(ret)
  10. def int_to_bin(x):
  11. # in: int_DNA
  12. # out: DNA
  13. ret = []
  14. if x >= 0:
  15. ret.append(0)
  16. else:
  17. ret.append(1)
  18. x = -x
  19. for i in [4096,2048,1024,512,256,128,64,32,16,8,4,2,1] :
  20. if x>=i :
  21. ret.append(1)
  22. x -= i
  23. else :
  24. ret.append(0)
  25. return ret
  26. def bin_to_int(x):
  27. # in: DNA
  28. # out: int_DNA
  29. ret = 0
  30. new_x = x[:]
  31. flag = -(new_x[0]*2-1)
  32. mul = 1
  33. new_x = reversed(new_x)
  34. new_x.pop()
  35. for i in new_x :
  36. ret += flag * i * mul
  37. mul *= 2
  38. return ret
  39. def reversed(x):
  40. ret = []
  41. for i in range(0,len(x)):
  42. ret.append(x[-i-1])
  43. return ret
  44. def create_DNAs(num):
  45. # in: int
  46. # out: DNAs
  47. ret = []
  48. for i in range(num):
  49. ret.append(create_init_DNA())
  50. return ret
  51. def bins_to_ints(x):
  52. # in: DNAs
  53. # out: int_DNAs
  54. ret = []
  55. for i in x:
  56. ret.append(bin_to_int(i))
  57. return ret
  58. def create_probabilitys(x):
  59. # in: DNAs
  60. # out: probabilitys
  61. scores = survival_scores(x)
  62. mid = []
  63. ret = []
  64. sum = 0
  65. for i in scores:
  66. sum+=i
  67. for i in scores:
  68. mid.append(1/(i/sum))
  69. sum = 0
  70. for i in mid:
  71. sum+=i
  72. for i in mid:
  73. ret.append(i/sum)
  74. return ret
  75. def survival_scores(x):
  76. # in: DNAs
  77. # out: survival_scores
  78. ret = []
  79. for i in x:
  80. ret.append(f(bin_to_int(i)))
  81. return ret
  82. def choose_DNA(DNAs,probabilitys):
  83. # in: DNAs,probabilitys
  84. # out: DNA
  85. # probabilitys是由若干(0,1)之间的浮点数组成的数组,这些浮点数的和为1
  86. i = 0 # i记录取出元素的位置
  87. ran = random.random()
  88. # a=0
  89. for max in probabilitys :
  90. if i != 0 :
  91. min = probabilitys[i-1]
  92. else :
  93. min = 0
  94. if ran < max and ran >= min :
  95. return DNAs[i]
  96. def next_gen_DNAs(DNAs,num=None):
  97. num = num or len(DNAs)
  98. ret = []
  99. for i in range(num) :
  100. ret.append(choose_DNA(DNAs,create_probabilitys(DNAs)))
  101. a = create_DNAs(10)
  102. print(a)
  103. print(bins_to_ints(a))
  104. print(survival_scores(a))
  105. print(create_probabilitys(a))