//Constructor public DecisionTreeNode(int p_input_index, float p_min_input, float p_max_input, float[] p_output_values) { m_input_index = p_input_index; m_min_input = p_min_input; m_max_input = p_max_input > p_min_input ? p_max_input : p_min_input; m_output_values = ArrayCalc.shallowClone(p_output_values); }
//Private constructor for cloning private NeuralNetDNA(int p_id, DInputFactory <T>[] p_inputs, DOutputFactory <T>[] p_outputs, Range <float> p_mutation_multiplier) { m_id = p_id; m_inputs = ArrayCalc.shallowClone(p_inputs); m_outputs = ArrayCalc.shallowClone(p_outputs); m_mutation_multiplier = p_mutation_multiplier; }
public DecisionNetDNA(int p_id, DInputFactory <T>[] p_inputs, DOutputFactory <T>[] p_outputs, Matrix <float> p_weights, Range <float> p_mutation_multiplier) { if (!MatrixCalc.isSize(p_weights, p_inputs.Length, p_outputs.Length)) { Debug.LogError("DecisionNetDNA requires Matrix input size inputs by outputs"); } m_id = p_id; m_inputs = ArrayCalc.shallowClone(p_inputs); m_outputs = ArrayCalc.shallowClone(p_outputs); m_weights = MatrixCalc.shallowClone(MatrixCalc.columnNormalize(p_weights)); m_mutation_multiplier = p_mutation_multiplier; }
public DecisionTreeDNANode mutate(int p_num_inputs, Range <float> p_mutation_mult) { int mut_input_index = RandomCalc.Rand(new Range <int>(0, p_num_inputs - 1)); float mut_min_input = m_min_input * RandomCalc.Rand(p_mutation_mult); float mut_max_input = m_max_input * RandomCalc.Rand(p_mutation_mult); if (mut_max_input < mut_min_input) { mut_max_input = mut_min_input; } float[] mut_output_values = ArrayCalc.shallowClone(m_output_values); for (int i = 0; i < mut_output_values.Length; i++) { mut_output_values[i] *= RandomCalc.Rand(p_mutation_mult); } return(new DecisionTreeDNANode(mut_input_index, mut_min_input, mut_max_input, mut_output_values)); }
public NeuralNetDNA(int p_id, DInputFactory <T>[] p_inputs, DOutputFactory <T>[] p_outputs, int p_hidden_number, int p_hidden_size, Range <float> p_weight_range, Range <float> p_mutation_multiplier) { m_id = p_id; m_inputs = ArrayCalc.shallowClone(p_inputs); m_outputs = ArrayCalc.shallowClone(p_outputs); m_weights = new Matrix <float> [p_hidden_number + 1]; m_weights[0] = Matrix <float> .Build.Dense(m_inputs.Length, p_hidden_size, (i, j) => { return(RandomCalc.Rand(p_weight_range)); }); for (int i = 1; i < m_weights.Length - 1; i++) { m_weights[i] = Matrix <float> .Build.Dense(p_hidden_size, p_hidden_size, (x, y) => { return(RandomCalc.Rand(p_weight_range)); }); } m_weights[m_weights.Length - 1] = Matrix <float> .Build.Dense(p_hidden_size, m_outputs.Length, (i, j) => { return(RandomCalc.Rand(p_weight_range)); }); m_mutation_multiplier = p_mutation_multiplier; }
//Mutation public DecisionTreeDNA <T> mutate() { return(new DecisionTreeDNA <T>(recMutate(Root), ArrayCalc.shallowClone(m_inputs), ArrayCalc.shallowClone(m_outputs), m_mutation_mult)); }
//Crossover public DecisionTreeDNA <T> crossover(DecisionTreeDNA <T> p_crossover_object) { return(new DecisionTreeDNA <T>(recCrossover(Root, p_crossover_object.Root), ArrayCalc.shallowClone(m_inputs), ArrayCalc.shallowClone(m_outputs), m_mutation_mult)); }