-
Notifications
You must be signed in to change notification settings - Fork 1
/
world.js
112 lines (102 loc) · 3.2 KB
/
world.js
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
102
103
104
105
106
107
108
109
110
111
112
class World {
constructor(amountOfSnakes, gen, width, height) {
this.size = amountOfSnakes;
this.gen = gen;
this.width = width;
this.height = height;
this.boards = [];
for (var i = 0; i < amountOfSnakes; i++) {
this.boards.push(new Board(width, height, 10, false));
this.boards[i].maxMoves = 50 * (this.gen + 1);
}
}
getBest() {
var best = this.boards[0];
for (var i = 1; i < this.boards.length; i++) {
if (this.boards[i].score > best.score) {
best = this.boards[i];
}
}
return best;
}
getIndexWorstOf(arr) {
var worst = arr[0];
var index = 0
for (var i = 1; i < arr.length; i++) {
if (arr[i].score < worst.score) {
worst = arr[i];
index = i
}
}
return index;
}
isOneAlive() {
for (var i = 0; i < this.boards.length; i++) {
if (this.boards[i].snake.alive) {
return true;
}
}
return false;
}
start() {
console.log(`Starting generation ${this.gen}`)
for (var i = 0; i < this.boards.length; i++) {
console.log(`Species ${i}`)
while (this.boards[i].snake.alive) {
this.boards[i].update();
}
}
}
getBest10() {
var best10 = [];
for (var i = 0; i < 20; i++) {
best10.push(this.boards[i]);
}
for (var i = 2; i < this.boards.length; i++) {
var index = this.getIndexWorstOf(best10)
if (best10[index].score < this.boards[i].score) {
best10[index] = this.boards[i];
}
}
return best10;
}
reproduce() {
var best10 = this.getBest10();
var children = [];
for (var i = 0; i < best10.length; i++) {
var newBoard = best10[i].crossover(best10[(i + 1) % best10.length]);
children.push(newBoard);
}
for (var i = 0; i < best10.length; i++) {
for (var j = 0; j < floor(this.boards.length / best10.length); j++) {
children.push(best10[i].clone());
}
}
children = this.getRandomSubarray(children, this.size);
for (var i = 0; i < children.length; i++) {
children[i].mutate(0.2);
}
var newWorld = new World(1, this.gen + 1, this.width, this.height);
newWorld.boards = children;
newWorld.size = children.length;
return newWorld;
}
getRandomSubarray(arr, size) {
var shuffled = arr.slice(0),
i = arr.length,
temp, index;
while (i--) {
index = Math.floor((i + 1) * Math.random());
temp = shuffled[index];
shuffled[index] = shuffled[i];
shuffled[i] = temp;
}
return shuffled.slice(0, size);
}
saveBest() {
var best = this.getBest();
var saveString = best.brain.NetForSave();
var url = `http://127.0.0.1:5000/api/save/`;
httpPost(`${url}?json={"gen":${this.gen}, "net":${saveString}, "score":${best.score}}`);
}
}