-
Notifications
You must be signed in to change notification settings - Fork 0
/
new_genetic.py
64 lines (54 loc) · 1.81 KB
/
new_genetic.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
import math
from time import clock
from functions_ast import *
class CodeGenerator:
def check_var_size(self, __code, score):
variables = get_variables(__code)
if variables == "Error":
return -10000000000000
for i in range(len(variables)):
variable = int(variables[i].split("=")[1])
score += 20 - math.fabs(variable)
return score
def fitness(self, code):
score = 0
score = self.check_var_size(self, code, score)
return score
def random_line(self, code):
if code == "":
return term_rand()
all_functions = [add_if(code), term_rand(get_variables(code), False),
add_while(code), add_for(code)]
for_return = random.choice(all_functions)
return for_return
def new_generation(self, code):
codes = []
for i in range(25):
codes.append(code)
if not code:
for i in range(25):
codes.append(term_rand())
else:
len_code = len(codes)
d = 0
while d < len_code:
random_line_for_code = self.random_line(self, codes[d])
if random_line_for_code != "Error":
codes[d] += random_line_for_code
d += 1
else:
codes.pop(d)
len_code -= 1
d += 1
code_score = {}
for i in range(len(codes)):
code_score[self.fitness(self, codes[i])] = codes[i]
best_code = code_score[max(code_score.keys())]
return best_code
CodeGen = CodeGenerator
t = clock()
code = CodeGen.new_generation(CodeGen, "")
for i in range(4):
code = CodeGen.new_generation(CodeGen, code)
print(">>>" + str(clock()-t))
print(code)