Advertisement
Guest User

Untitled

a guest
Sep 24th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.35 KB | None | 0 0
  1. import random
  2. import math
  3.  
  4. class Neural_net:
  5. """docstring for Neural_net"""
  6. def __init__(self, complexity):
  7. self.complexity = complexity
  8. self.nodes = self.generate_nodes()
  9. self.genes = self.generate_genes(32)
  10.  
  11. def generate_genes(self, amount):
  12. genes = []
  13. while len(genes) < amount:
  14. trans = self.random_transformation()
  15. performance = 0
  16. for a in range(1000):
  17. number_1 = random.randint(0, 10)
  18. number_2 = random.randint(0, 10)
  19. result = self.get_answer(trans, [number_1, number_2])
  20. if (number_1 + number_2) >= 5:
  21. if result == 1:
  22. performance += 1
  23. else:
  24. performance -= 1
  25. else:
  26. if result == 1:
  27. performance -= 1
  28. else:
  29. performance += 1
  30.  
  31. if performance > 500:
  32. genes.append([trans, performance])
  33.  
  34. return genes
  35.  
  36. def generate_nodes(self):
  37. nodes = []
  38. for i in range(len(self.complexity)):
  39. node_row = list(x for x in range(self.complexity[i]))
  40. nodes.append(node_row)
  41.  
  42. return nodes
  43.  
  44. def random_transformation(self):
  45. transformation = []
  46. for i in range(1, len(self.complexity)):
  47. transformation.append([])
  48. connections = self.complexity[i] * self.complexity[i-1]
  49. for _ in range(connections):
  50. transformation[i-1].append(random.uniform(-1.0, 1.0))
  51.  
  52. return transformation
  53.  
  54. def get_answer(self, transformation, param):
  55. # The first nodes are input data
  56. for i in range(len(self.nodes[0])):
  57. self.nodes[0][i] = param[i]
  58.  
  59.  
  60. for a in range(1, len(self.nodes)):
  61. for b in range(len(self.nodes[a])):
  62. self.nodes[a][b] = 0
  63. for c in range(len(self.nodes[a-1])):
  64. self.nodes[a][b] += self.nodes[a-1][c] * transformation[a-1][b+1]
  65.  
  66. # Normalize the value
  67. self.nodes[a][b] = math.tanh(self.nodes[a][b])
  68.  
  69. # Choose output by looking at which of the two output
  70. # nodes has the highest value
  71. result = 0.0
  72. output = 0
  73. for i in range(len(self.nodes[-1])):
  74. if self.nodes[-1][i] > result:
  75. output = i
  76. result = self.nodes[-1][i]
  77.  
  78. return output
  79.  
  80. def train(self, iterations):
  81. for a in range(iterations):
  82. # Kill the worst genes
  83. self.genes = sorted(self.genes, key=lambda x: x[1], reverse=True)
  84. self.genes = self.genes[:(len(self.genes) // 2)]
  85.  
  86. print("AAA")
  87. for gene in self.genes:
  88. print(gene[1], end=", ")
  89.  
  90. print("\n")
  91. # Breed new genes
  92. random.shuffle(self.genes)
  93. for g in range(len(self.genes)):
  94. new_gene = self.combine_transformations(self.genes[g][0], self.genes[g+1][0])
  95. self.genes.append([new_gene, 0])
  96.  
  97. # Test the genes
  98. for b in range(len(self.genes)):
  99. performance = 0
  100. for c in range(1000):
  101. number_1 = random.randint(0, 10)
  102. number_2 = random.randint(0, 10)
  103. result = self.get_answer(self.genes[b][0], [number_1, number_2])
  104. if (number_1 + number_2) >= 5:
  105. if result == 1:
  106. performance += 1
  107. else:
  108. performance -= 1
  109. else:
  110. if result == 1:
  111. performance -= 1
  112. else:
  113. performance += 1
  114. self.genes[b][1] = performance
  115.  
  116. def combine_transformations(self, trans_one, trans_two):
  117. new_trans = []
  118. for a in range(len(trans_one)):
  119. new_trans.append([])
  120. # TODO Use zip
  121. for b in range(len(trans_one[a])):
  122. # Alternate choosing connections between trans_one and trans_two
  123. if b % 2 == 0:
  124. connection = trans_one[a][b]
  125. else:
  126. connection = trans_two[a][b]
  127. new_trans[a].append(connection)
  128. return new_trans
  129.  
  130.  
  131. nn = Neural_net([2,8,8,2])
  132. nn.train(1000)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement