-
Notifications
You must be signed in to change notification settings - Fork 0
/
GAnnMutators.py
113 lines (95 loc) · 3.99 KB
/
GAnnMutators.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 numpy
from random import randint as rand_randint, gauss as rand_gauss, uniform as rand_uniform
from random import choice as rand_choice
from random import sample as rand_sample
from pyevolve import Consts
from pyevolve import Util
from pyfann import libfann
import GAnnConsts
#def MutationCriterion(criterion)
# if criterion == 'gaussian':
# return criterion
def G1DConnUnbiasedMutateWeights(genome, **args):
## args['mutation_conns'] takes the list of indices of connections to be mutated
if not args.get('mutation_conns',0):
mutation_conn_indices=rand_sample(numpy.arange(len(genome)),int(args['pmut']*len(genome)))
# print "Indices of mutation weights:"
# print mutation_conn_indices
else:
mutation_conn_indices = args['mutation_conns']
# print "Indices of mutation weights:"
# print mutation_conn_indices
mu = genome.getParam("gauss_mu",0)
sigma = genome.getParam("gauss_sigma",1)
#new_mutation_list=[]
for it in mutation_conn_indices:
final_value=rand_gauss(mu, sigma)
genome['weight'][it] = final_value
# new_mutation_list.append(rand_uniform(genome.getParam("rangemin", Consts.CDefRangeMin),genome.getParam("rangemax", Consts.CDefRangeMax)))
mutations = len(mutation_conn_indices)
#numpy.put(genome['weight'],mutation_conn_indices,new_mutation_list)
return int(mutations)
def G1DConnBiasedMutateWeights(genome, **args):
## args['mutation_conns'] takes the list of indices of connections to be mutated
if not args.get('mutation_conns',0):
mutation_conn_indices=rand_sample(numpy.arange(len(genome)-1),int(args['pmut']*len(genome)))
# print "Indices of mutation weights:"
# print mutation_conn_indices
else:
mutation_conn_indices = args['mutation_conns']
# print "Indices of mutation weights:"
# print mutation_conn_indices
mu = genome.getParam("gauss_mu",0)
sigma = genome.getParam("gauss_sigma",1)
#new_mutation_list=[]
for it in mutation_conn_indices:
final_value=genome['weight'][it] + rand_gauss(mu, sigma)
genome['weight'][it] = final_value
#genome['weight'][it] = min(final_value, genome.getParam("rangemax", Consts.CdefRangeMax))
#genome['weight'][it] = max(final_value, genome.getParam("rangemin", Consts.CdefRangeMin))
#new_mutation_list.append(final_value)
mutations = len(mutation_conn_indices)
#numpy.put(genome['weight'],[mutation_conn_indices],[new_mutation_list])
return int(mutations)
def G1DConnMutateNodes(genome, **args):
## args['mutation_nodes'] takes the list of node numbers to be mutated
pmut = args['pmut']
if not args.get('mutation_nodes',0):
mutations=int(pmut*len(numpy.unique(genome['to'])))
mutation_node_numbers = rand_sample(numpy.unique(genome['to']), mutations)
# print "randomly chosen mutation nodes:"
# print mutation_node_numbers
else:
mutation_node_numbers = list(args['mutation_nodes'])
# print "selected mutation nodes:"
# print mutation_node_numbers
mutations = len(arg['mutation_nodes'])
for it in mutation_node_numbers:
mutation_nodes = genome.getnode(it)
# print "connections of mutation nodes"
# print mutation_nodes
mutation_conn_indices=getMutateConnIndex(genome, mutation_nodes)
G1DConnBiasedMutateWeights(genome, mutation_conns=mutation_conn_indices, pmut=1)
return int(mutations)
def getMutateConnIndex(genome, connections):
# returns list of indecies of given connections in genome.
conn_index = []
for conn in connections:
toIndex = numpy.nonzero(numpy.equal(genome['to'],conn['to']))
toIndex = toIndex[0]
#print 'test'
#print toIndex
#print genome[toIndex]
#print genome['from'][toIndex]
index = numpy.searchsorted(genome['from'][toIndex],conn['from'])
#print "index:%i" % index
#print toIndex[index]
conn_index.append(toIndex[index])
return conn_index
def getMutateNodeIndex(num_neurons,layer_num,node_num):
# num_neurons is a list which contains number of neurons at each layer.',' separation is used.
# last neuron in each layer is bias neuron
num_hidden_neurons = num_neurons[1:-1]
#for neurons in num_neurons:
#node_index =
return node_index