-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathxor_example.py
111 lines (88 loc) · 3.18 KB
/
xor_example.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
102
103
104
105
106
107
108
109
110
111
import random
import torch
import numpy as np
from classes.NEAT import *
random.seed(14)
torch.manual_seed(14)
np.random.seed(14)
n_networks = 150
# Fitness:
c1 = 1
c2 = 1
c3 = 0.4
distance_delta = 6
weight_magnitude = 2.5 # std of weight mutation
# Mutation
mutate_weight_prob = 0.8
mutate_weight_perturb = 0.8
mutate_weight_random = 1 - mutate_weight_perturb
mutate_add_node_prob = 0.02
mutate_add_link_prob_large_pop = 0.08
mutate_add_link_prob = 0.02
offspring_without_crossover = 0.25
interspecies_mate_rate = 0.001
fitness_survival_rate = 0.2
interspecies_mate_rate = 0.001
node_gene_history = Node_Gene_History()
connection_gene_history = Connection_Gene_History()
genotypes = []
for _ in range(n_networks):
node_genes = [
Node_Gene(None, None, node_gene_history, add_initial=True, add_initial_node_level=0, initial_node_id=0),
Node_Gene(None, None, node_gene_history, add_initial=True, add_initial_node_level=0, initial_node_id=1),
Node_Gene(None, None, node_gene_history, add_initial=True, add_initial_node_level=0, initial_node_id=2),
Node_Gene(None, None, node_gene_history, add_initial=True, add_initial_node_level=1, initial_node_id=3)
]
connection_genes = [
Connection_Gene(0, 3, np.random.normal(), False, connection_gene_history), # bias
Connection_Gene(1, 3, np.random.normal(), False, connection_gene_history), # input 1
Connection_Gene(2, 3, np.random.normal(), False, connection_gene_history), # input 2
]
genotype = Genotype(
node_genes, connection_genes, node_gene_history, connection_gene_history,
mutate_weight_prob, mutate_weight_perturb, mutate_weight_random, mutate_add_node_prob, mutate_add_link_prob, weight_magnitude,
c1, c2, c3)
genotypes.append(genotype)
# %%
# xor
inputs = [
{0:torch.tensor([1.0]),1:torch.tensor([0.0]),2:torch.tensor([0.0])},
{0:torch.tensor([1.0]),1:torch.tensor([1.0]),2:torch.tensor([0.0])},
{0:torch.tensor([1.0]),1:torch.tensor([0.0]),2:torch.tensor([1.0])},
{0:torch.tensor([1.0]),1:torch.tensor([1.0]),2:torch.tensor([1.0])}
# xor:
# bias 1, 00, 01, 10, 11
]
targets = [
torch.tensor([0.0]),
torch.tensor([1.0]),
torch.tensor([1.0]),
torch.tensor([0.0])
]
# %%
len(genotypes)
# %%
def xor_fitness(network:NeuralNetwork, inputs, targets, print_fitness=False):
#error = 0
fitness = 4
for input, target in zip(inputs, targets):
output = network.forward(input)[0]
if output is None:
return torch.tensor([0]) # if network has no connected nodes (all are disabled)
fitness -= (output - target)**2
return fitness
initial_species = Species(np.random.choice(genotypes), genotypes, distance_delta)
evolved_species, solutions = evolve(
features=inputs,
target=targets,
fitness_function=xor_fitness,
stop_at_fitness=3.85,
n_generations=1000,
species=[initial_species],
fitness_survival_rate=fitness_survival_rate,
interspecies_mate_rate=interspecies_mate_rate,
distance_delta=distance_delta,
largest_species_linkadd_rate=mutate_add_link_prob_large_pop,
eliminate_species_after_n_generations=20
)
print(solutions)