-
Notifications
You must be signed in to change notification settings - Fork 0
/
Training.py
101 lines (84 loc) · 3.38 KB
/
Training.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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
from GameData import GameData
import numpy as np
from NeuralNetwork import AI_2048
import matplotlib.pyplot as plt
class Trainer:
def __init__(self, generations=1, drawing=False):
self.generations = generations
self.Mutations = np.linspace(-1, 1, 17)
self.drawing = drawing
if drawing:
self.X = [i for i in range(generations)]
self.Y = []
def start(self):
bots = []
bots.append((AI_2048(name='bot_-1', file_name='bot_-1_195weights'), GameData()))
bots.append((AI_2048(name='bot_-1', file_name='bot_7_804weights'), GameData()))
bots.append((AI_2048(name='bot_-1', file_name='bot_7_862weights'), GameData()))
bots.append((AI_2048(name='bot_-1', file_name='bot_8_490weights'), GameData()))
for _ in range(4):
bots.append((AI_2048(training=True, name='bot_-1'), GameData()))
for generation in range(self.generations):
print('Generation №{}'.format(generation))
average = 0
for bot, data in bots:
for _ in range(30):
self.bot_play(bot, data)
average += bot.average_score
average = round(average / 10)
print(' average = {}'.format(average))
if self.drawing:
self.Y.append(average)
bots = self.next_generation(bots, generation)
bots.sort(key=lambda x: x[0].average_score, reverse=True)
for bot, data in bots[:4]:
bot.save()
if self.drawing:
plt.plot(self.X, self.Y)
plt.axis([0, self.generations, 0, 10000])
plt.grid()
plt.show()
@staticmethod
def bot_play(bot, data):
game_over = False
while not game_over:
predict = bot.predict(data)
moves = predict.tolist()
moves = list(enumerate(moves))
moves.sort(key=lambda x: x[1], reverse=True)
for move in moves:
check = data.move(move[0])
if check:
break
data.crt_progress = 0
data.rand_cell()
game_over = data.check_GameOver()
bot.crt_moves = data.moves
bot.games_played += 1
bot.progress = data.progress
bot.average_score = round(((bot.games_played - 1) * bot.average_score + bot.progress) / bot.games_played)
data.refresh()
def next_generation(self, bots, generation):
bots.sort(key=lambda x: x[0].average_score, reverse=True)
bots = bots[:4]
for bot, data in bots:
print(' {} av_score = {}'.format(bot, bot.average_score))
for i in range(3):
bot = bots[0][0].mutation(self.Mutations)
bot.change_name('bot_{}'.format(generation))
bot.when_born = generation
data = GameData()
bots.append((bot, data))
for i in range(2):
bot = bots[1][0].mutation(self.Mutations)
bot.change_name('bot_{}'.format(generation))
bot.when_born = generation
data = GameData()
bots.append((bot, data))
bot = bots[2][0].mutation(self.Mutations)
bot.change_name('bot_{}'.format(generation))
bot.when_born = generation
data = GameData()
bots.append((bot, data))
return bots
Trainer(generations=300, drawing=True).start()