public static IList <Neuron> GetNeurons(
     INeuralGenome genome,
     ENeurType neurType)
 {
     return(genome.NeuronLst
            .Where(x => x.neurType == neurType)
            .ToArray());
 }
        protected float GetNetworkOutputAsNb(INeuralGenome genome, int inNb)
        {
            var    outputs = genome.FeedNetwork(ToBits(inNb));
            double result  = 0;

            for (int i = 0; i < outputs.Count(); i++)
            {
                result += outputs[i] * Mathf.Pow(2, i);
            }
            return((float)result);
        }
Beispiel #3
0
 public override void Init(INeuralGenome targetGenome)
 {
     base.Init(targetGenome);
     lastActivation       = 0;
     columns              = 0;
     distToNextColOnDeath = Vector2.zero;
     isDead = false;
     foreach (var neuron in genome.Neurons)
     {
         neuron.Value.Val = 0;
     }
 }
Beispiel #4
0
        private double ParityFitness(INeuralGenome genome)
        {
            float error = 0;

            for (int i = 0; i < 8; i++)
            {
                var expected = (i % 2 == 0) ? 1 : 0;
                var output   = (float)genome.FeedNetwork(ToBits(i))[0];
                error += Mathf.Abs(expected - output);
            }
            genome.Fitness = 8 - error;
            return(error);
        }
        private double CountingFitness(INeuralGenome genome)
        {
            float error = 0;

            for (int i = 0; i < 7; i++)
            {
                var next3Bit = i + 1;
                if (next3Bit >= 8)
                {
                    next3Bit = 0;
                }
                error += Mathf.Abs(next3Bit - GetNetworkOutputAsNb(genome, i));
            }
            //genome.Fitness = Mathf.Pow(8 - error + 1, fitenssPower);
            genome.Fitness = 8 - error;
            return(error);
        }
Beispiel #6
0
        protected override double ComputeFitness(INeuralGenome genome)
        {
            float error = 0;

            for (int i = 0; i < 2; i++)
            {
                for (int j = 0; j < 2; j++)
                {
                    var targetOutput = i ^ j;
                    var output       = genome.FeedNetwork(new double[2] {
                        i, j
                    })[0];
                    error += Mathf.Abs((float)(targetOutput - output));
                }
            }
            genome.Fitness = Mathf.Pow(4 - error + 1, fitenssPower);
            return(error);
        }
        protected override double ComputeFitness(INeuralGenome genome)
        {
            double error = 0;

            for (int i = 0; i < MaxCount; i++)
            {
                var bits     = ToBits(i, MaxCount);
                var expected = OppositeBits(bits);
                var outputs  = genome.FeedNetwork(bits);

                for (int j = 0; j < bits.Length; j++)
                {
                    error += Mathf.Abs((float)(expected[j] - outputs[j]));
                }
            }

            genome.Fitness = -error;
            return(error);
        }
Beispiel #8
0
        private void ConnectNode(
            RectTransform target,
            Neuron targetNeuron,
            INeuralGenome genome)
        {
            var outNeurons = genome.Network[targetNeuron]
                             .Select(x => x.receiver);

            foreach (var neuronInnov in outNeurons)
            {
                var neuron = genome.Neurons[neuronInnov];
                if (neuron == targetNeuron)
                {
                    continue;
                }

                var conn = ConnectionManager.CreateConnection(
                    target,
                    nodes[neuron]);

                conn.points[0].weight     = 0.6f;
                conn.points[1].weight     = 0.6f;
                conn.line.widthMultiplier = connectionWidth;
                conn.points[0].direction  =
                    ConnectionPoint.ConnectionDirection.East;
                conn.points[1].direction =
                    ConnectionPoint.ConnectionDirection.West;

                var synapse = genome.Network[targetNeuron]
                              .First(x => x.receiver == neuronInnov);
                var gene = NeuralUtils.FindGene(genome.Genes, synapse);

                var color = GetColor(gene);
                conn.points[0].color = color;
                conn.points[1].color = color;

                if (!synapse.isEnabled)
                {
                    conn.line.widthMultiplier *= 0.3f;
                }
            }
        }
Beispiel #9
0
        public void DrawGenome(INeuralGenome genome)
        {
            RemoveAllNodes();

            if (autoAdjustMaxWeight)
            {
                maxWeight = GetAverageWeight(genome.Genes);
            }

            int count = 0;

            foreach (var neuron in genome.NeuronLst)
            {
                var newNode = Instantiate(nodePrefab, nodesParent)
                              .GetComponent <RectTransform>();
                newNode.name = "Node " + count;

                var nodeText = neuron.innovNb.ToString();
                if (neuron.neurType == ENeurType.bias)
                {
                    nodeText = "bias" + nodeText;
                }
                else if (neuron.neurType == ENeurType.input)
                {
                    nodeText = "in" + nodeText;
                }
                else if (neuron.neurType == ENeurType.output)
                {
                    nodeText = "out" + nodeText;
                }

                newNode.GetChild(0).GetComponent <Text>().text = nodeText;

                nodes.Add(neuron, newNode);
                count++;
            }

            var inputNeurons = NeuralUtils.GetNeurons(
                genome, ENeurType.input);
            var outputNeurons = NeuralUtils.GetNeurons(
                genome, ENeurType.output);
            var bias = NeuralUtils.GetBias(genome);

            foreach (var kv in nodes)
            {
                ConnectNode(kv.Value, kv.Key, genome);
                if (inputNeurons.Contains(kv.Key))
                {
                    int i = inputNeurons.IndexOf(kv.Key) + 1;
                    kv.Value.localPosition =
                        inputNodesPos.localPosition +
                        Vector3.down * distBetweenNodes * i;
                }
                else if (outputNeurons.Contains(kv.Key))
                {
                    int i = outputNeurons.IndexOf(kv.Key);
                    kv.Value.localPosition =
                        outputNodesPos.localPosition +
                        Vector3.down * distBetweenNodes * i;
                }
                else if (bias == kv.Key)
                {
                    kv.Value.localPosition = inputNodesPos.localPosition;
                }
                else
                {
                    kv.Value.localPosition = GetPosOfNewNode();
                }
            }
        }
Beispiel #10
0
 protected override double ComputeFitness(INeuralGenome genome)
 {
     return(ParityFitness(genome));
 }
Beispiel #11
0
 public virtual void Init(INeuralGenome targetGenome)
 {
     genome = targetGenome;
 }
Beispiel #12
0
 public void Init(INeuralGenome genome_, Transform target_)
 {
     genome = genome_;
     target = target_;
 }
 public static Neuron GetBias(INeuralGenome genome)
 {
     return(genome.NeuronLst
            .FirstOrDefault(x => x.neurType == ENeurType.bias));
 }
Beispiel #14
0
 protected abstract double ComputeFitness(INeuralGenome genome);
 protected override double ComputeFitness(INeuralGenome genome)
 {
     return(CountingFitness(genome));
 }