Пример #1
0
        public void TestNetworkSumOutputPort()
        {
            var multipliers = new Dictionary <int, IReceptiveField>();

            multipliers[0] = new MulReceptiveField(0.0, 1.0);
            multipliers[1] = new MulReceptiveField(1.0, 1.0);
            multipliers[2] = new MulReceptiveField(2.0, 1.0);
            multipliers[3] = new MulReceptiveField(3.0, 1.0);
            multipliers[4] = new MulReceptiveField(4.0, 1.0);
            multipliers[5] = new MulReceptiveField(5.0, 1.0);
            multipliers[6] = new MulReceptiveField(6.0, 1.0);
            multipliers[7] = new MulReceptiveField(7.0, 1.0);
            multipliers[8] = new MulReceptiveField(8.0, 1.0);
            multipliers[9] = new MulReceptiveField(9.0, 1.0);
            // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
            // 0, 1, 0, 1, 0, 1, 0, 1, 0, 1

            var arr = Enumerable.Range(0, 10)
                      .Select(i => (double)(i % 2) * 30.0)
                      .ToArray();

            Assert.AreEqual(arr.Length, multipliers.Count);

            var port = new NetworkSumOutputPort(arr, multipliers);
            var sum  = port.Get();

            Assert.AreEqual(25.0, sum);
        }
        public void TestNetworkSumOutputPort()
        {
            var multipliers = new Dictionary<int, IReceptiveField>();
              multipliers[0] = new MulReceptiveField(0.0, 1.0);
              multipliers[1] = new MulReceptiveField(1.0, 1.0);
              multipliers[2] = new MulReceptiveField(2.0, 1.0);
              multipliers[3] = new MulReceptiveField(3.0, 1.0);
              multipliers[4] = new MulReceptiveField(4.0, 1.0);
              multipliers[5] = new MulReceptiveField(5.0, 1.0);
              multipliers[6] = new MulReceptiveField(6.0, 1.0);
              multipliers[7] = new MulReceptiveField(7.0, 1.0);
              multipliers[8] = new MulReceptiveField(8.0, 1.0);
              multipliers[9] = new MulReceptiveField(9.0, 1.0);
              // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
              // 0, 1, 0, 1, 0, 1, 0, 1, 0, 1

              var arr = Enumerable.Range(0, 10)
            .Select(i => (double)(i % 2) * 30.0)
            .ToArray();
              Assert.AreEqual(arr.Length, multipliers.Count);

              var port = new NetworkSumOutputPort(arr, multipliers);
              var sum = port.Get();

              Assert.AreEqual(25.0, sum);
        }
Пример #3
0
    public static NetworkPorts FromGenotype(NEAT.Genotype genotype)
    {
        var neuronGenes  = genotype.NeuronGenes.ToList();
        var synapseGenes = genotype.SynapseGenes.ToList();

        var network = new Neural.Network(20ul);

        var upperNeurons    = new Dictionary <int, IReceptiveField>();
        var lowerNeurons    = new Dictionary <int, IReceptiveField>();
        var positionNeurons = new Dictionary <int, IReceptiveField>();
        var speedNeurons    = new Dictionary <int, IReceptiveField>();

        foreach (var neuronGene in neuronGenes)
        {
            float a = NumberHelper.Scale(neuronGene.a, 0.02f, 0.1f);    // 0.1
            float b = NumberHelper.Scale(neuronGene.b, 0.2f, 0.25f);    // 0.2
            float c = NumberHelper.Scale(neuronGene.c, -65.0f, -50.0f); // -65.0
            float d = NumberHelper.Scale(neuronGene.d, 0.05f, 8.0f);    // 2.0

            try {
                var id = (int)network.AddNeuron(Neural.IzhikevichConfig.Of(a, b, c, d));

                var mean  = 0.0f;
                var sigma = 0.0f;
                switch (neuronGene.type)
                {
                case NeuronType.UpperNeuron:
                    mean             = NumberHelper.Scale(neuronGene.mean, -180.0f, 180.0f);
                    sigma            = NumberHelper.Scale(neuronGene.sigma, 0.0f, 180.0f);
                    upperNeurons[id] = new SignReceptiveField(mean, sigma);
                    break;

                case NeuronType.LowerNeuron:
                    mean             = NumberHelper.Scale(neuronGene.mean, -180.0f, 180.0f);
                    sigma            = NumberHelper.Scale(neuronGene.sigma, 0.0f, 180.0f);
                    lowerNeurons[id] = new SignReceptiveField(mean, sigma);
                    break;

                case NeuronType.PositionNeuron:
                    mean  = NumberHelper.Scale(neuronGene.mean, -12.0f, 12.0f);
                    sigma = NumberHelper.Scale(neuronGene.sigma, 0.0f, 12.0f);
                    positionNeurons[id] = new SignReceptiveField(mean, sigma);
                    break;

                case NeuronType.SpeedNeuron:
                    mean             = NumberHelper.Scale(neuronGene.mean, -1.0f, 1.0f);
                    sigma            = NumberHelper.Scale(neuronGene.sigma, 0.0f, 1000.0f);
                    speedNeurons[id] = new MulReceptiveField(mean, sigma);
                    break;
                }
            } catch (Exception e) {
                Debug.LogException(e);
            }
        }

        // Connect each input neuron to the output neuron.
        foreach (var synapseGene in synapseGenes)
        {
            if (!synapseGene.isEnabled)
            {
                continue;
            }

            var fromNeuronId = neuronGenes.FindIndex(n => n.InnovationId == synapseGene.fromNeuronId);
            var toNeuronId   = neuronGenes.FindIndex(n => n.InnovationId == synapseGene.toNeuronId);

            Assert.AreNotEqual(fromNeuronId, -1, "Must find from-neuron id");
            Assert.AreNotEqual(toNeuronId, -1, "Must find to-neuron id");

            float weight = NumberHelper.Scale(synapseGene.weight, -40.0f, 40.0f);

            try {
                network.AddSynapse((ulong)fromNeuronId, (ulong)toNeuronId, Neural.STDPConfig.Of(weight, -40.0f, 40.0f));
            } catch (Exception e) {
                Debug.LogException(e);
            }
        }

        return(new NetworkPorts(network, upperNeurons, lowerNeurons, positionNeurons, speedNeurons));
    }
    public static NetworkPorts FromGenotype(NEAT.Genotype genotype)
    {
        var neuronGenes = genotype.NeuronGenes.ToList();
        var synapseGenes = genotype.SynapseGenes.ToList();

        var network = new Neural.Network(20ul);

        var upperNeurons = new Dictionary<int, IReceptiveField>();
        var lowerNeurons = new Dictionary<int, IReceptiveField>();
        var positionNeurons = new Dictionary<int, IReceptiveField>();
        var speedNeurons = new Dictionary<int, IReceptiveField>();

        foreach (var neuronGene in neuronGenes) {
          float a = NumberHelper.Scale(neuronGene.a, 0.02f, 0.1f); // 0.1
          float b = NumberHelper.Scale(neuronGene.b, 0.2f, 0.25f); // 0.2
          float c = NumberHelper.Scale(neuronGene.c, -65.0f, -50.0f); // -65.0
          float d = NumberHelper.Scale(neuronGene.d, 0.05f, 8.0f); // 2.0

          try {
          var id = (int)network.AddNeuron(Neural.IzhikevichConfig.Of(a, b, c, d));

        var mean = 0.0f;
        var sigma = 0.0f;
        switch (neuronGene.type) {
          case NeuronType.UpperNeuron:
            mean = NumberHelper.Scale(neuronGene.mean, -180.0f, 180.0f);
            sigma = NumberHelper.Scale(neuronGene.sigma, 0.0f, 180.0f);
            upperNeurons[id] = new SignReceptiveField(mean, sigma);
            break;
          case NeuronType.LowerNeuron:
            mean = NumberHelper.Scale(neuronGene.mean, -180.0f, 180.0f);
            sigma = NumberHelper.Scale(neuronGene.sigma, 0.0f, 180.0f);
            lowerNeurons[id] = new SignReceptiveField(mean, sigma);
            break;
          case NeuronType.PositionNeuron:
            mean = NumberHelper.Scale(neuronGene.mean, -12.0f, 12.0f);
            sigma = NumberHelper.Scale(neuronGene.sigma, 0.0f, 12.0f);
            positionNeurons[id] = new SignReceptiveField(mean, sigma);
            break;
          case NeuronType.SpeedNeuron:
            mean = NumberHelper.Scale(neuronGene.mean, -1.0f, 1.0f);
            sigma = NumberHelper.Scale(neuronGene.sigma, 0.0f, 1000.0f);
            speedNeurons[id] = new MulReceptiveField(mean, sigma);
            break;
        }
          } catch (Exception e) {
        Debug.LogException(e);
          }
        }

        // Connect each input neuron to the output neuron.
        foreach (var synapseGene in synapseGenes) {
          if (!synapseGene.isEnabled) {
        continue;
          }

          var fromNeuronId = neuronGenes.FindIndex(n => n.InnovationId == synapseGene.fromNeuronId);
          var toNeuronId = neuronGenes.FindIndex(n => n.InnovationId == synapseGene.toNeuronId);

          Assert.AreNotEqual(fromNeuronId, -1, "Must find from-neuron id");
          Assert.AreNotEqual(toNeuronId, -1, "Must find to-neuron id");

          float weight = NumberHelper.Scale(synapseGene.weight, -40.0f, 40.0f);

          try {
        network.AddSynapse((ulong)fromNeuronId, (ulong)toNeuronId, Neural.STDPConfig.Of(weight, -40.0f, 40.0f));
          } catch (Exception e) {
        Debug.LogException(e);
          }
        }

        return new NetworkPorts(network, upperNeurons, lowerNeurons, positionNeurons, speedNeurons);
    }