public Calculator(Genome g) { data_structures.RandomHashSet <NodeGene> nodes = g.Nodes; data_structures.RandomHashSet <ConnectionGene> cons = g.Connections; Dictionary <int, Node> nodeHashMap = new Dictionary <int, Node>(); foreach (NodeGene n in nodes.Data) { Node node = new Node(n.X); nodeHashMap[n.Innovation_number] = node; if (n.X <= 0.1) { input_nodes.Add(node); } else if (n.X >= 0.9) { output_nodes.Add(node); } else { hidden_nodes.Add(node); } } hidden_nodes.Sort((x, y) => x.CompareTo(y)); foreach (ConnectionGene c in cons.Data) { NodeGene from = c.From; NodeGene to = c.To; Node node_from = nodeHashMap[from.Innovation_number]; Node node_to = nodeHashMap[to.Innovation_number]; Connection con = new Connection(node_from, node_to); con.Weight = c.Weight; con.Enabled = c.Enabled; node_to.Connections.Add(con); } }
public virtual void mutate_link() { for (int i = 0; i < 100; i++) { NodeGene a = nodes.random_element(); NodeGene b = nodes.random_element(); if (a == null || b == null) { continue; } if (a.X == b.X) { continue; } ConnectionGene con; if (a.X < b.X) { con = new ConnectionGene(a, b); } else { con = new ConnectionGene(b, a); } if (connections.contains(con)) { continue; } con = neat.getConnection(con.From, con.To); con.Weight = (GlobalRandom.NextDouble * 2 - 1) * neat.WEIGHT_RANDOM_STRENGTH; data_structures.RandomHashSet <Gene> hi = new data_structures.RandomHashSet <Gene>(); hi.add_sorted(connections, con); return; } }