private void ImproveFromLastGeneration()
    {
        NuralData bestData = m_birds[0].data;
        float     bestTime = 0;

        for (int i = 0; i < birdCount; i++)
        {
            if (m_birdResults[i] > bestTime)
            {
                bestData = m_birds[i].data;
                bestTime = m_birdResults[i];
            }
            Destroy(m_birds[i].gameObject);
        }

        SavingSystem.SaveData(bestData, string.Format("generation-{0}.json", m_generationCount));

        m_birds[0]      = Instantiate <NuralControlBird>(birdPrefab);
        m_birds[0].data = bestData;

        for (int i = 1; i < birdCount; i++)
        {
            m_birds[i]      = Instantiate <NuralControlBird>(birdPrefab);
            m_birds[i].data = EvolveFromBaseData(bestData);
        }
    }
    void Update()
    {
        Transform upGround   = NuralGameControl.ins.cloestGround.transform.GetChild(0);
        Transform downGround = NuralGameControl.ins.cloestGround.transform.GetChild(1);

        float[] inputs = new float[] {
            transform.position.x,
            transform.position.y,
            rigidbody2D.velocity.y,
            upGround.position.x,
            upGround.position.y,
            downGround.position.y,
        };

        // float[] inputs = new float[] {
        //     transform.position.y,
        //     rigidbody2D.velocity.y,
        //     upGround.position.x - transform.position.x,
        //     downGround.position.y,
        //     upGround.position.y - downGround.position.y,
        // };

        float jump = NuralData.Proccess(data, inputs);

        if (jump > 0)
        {
            Jump();
        }
    }
        static public float Proccess(NuralData data, float[] inputs)
        {
            float[,] metricInputs = new float[1, inputs.Length];

            for (int i = 0; i < inputs.Length; i++)
            {
                metricInputs[0, i] = inputs[i];
            }

            return(Math.Matrices.Sum(Math.Matrices.DotProduct(metricInputs, data.weights)) + data.bias);
        }
Beispiel #4
0
        public static void Test()
        {
            NuralData data = NuralData.Random(3, 3);

            DebugPrint(data.weights);

            SavingSystem.SaveData(data, "test.json");

            data = SavingSystem.GetData("test.json");

            DebugPrint(data.weights);
        }
        static public NuralData Add(NuralData data1, NuralData data2)
        {
            if (data1.weights.GetLength(0) != data2.weights.GetLongLength(0))
            {
                throw new System.ArgumentException("");
            }
            if (data1.weights.GetLength(1) != data2.weights.GetLongLength(1))
            {
                throw new System.ArgumentException("");
            }

            return(new NuralData(Math.Matrices.Add(data1.weights, data2.weights), data1.bias + data2.bias));
        }
    public void PrepareNewGeneration()
    {
        if (m_birds != null)
        {
            ImproveFromLastGeneration();
        }
        else
        {
            m_birds = new NuralControlBird[birdCount];

            if (preloadNuralData != "")
            {
                NuralData preloadData = SavingSystem.GetData(preloadNuralData);

                m_birds[0]      = Instantiate <NuralControlBird>(birdPrefab);
                m_birds[0].data = preloadData;

                for (int i = 1; i < birdCount; i++)
                {
                    m_birds[i]      = Instantiate <NuralControlBird>(birdPrefab);
                    m_birds[i].data = EvolveFromBaseData(preloadData);
                }
            }
            else
            {
                for (int i = 0; i < birdCount; i++)
                {
                    m_birds[i]      = Instantiate <NuralControlBird>(birdPrefab);
                    m_birds[i].data = NuralData.Random(6, 2);
                }
            }
        }

        m_generationCount       += 1;
        generationCountText.text = m_generationCount.ToString();
    }
 private NuralData EvolveFromBaseData(NuralData data)
 {
     return(NuralData.Add(data, NuralData.Random(6, 2, weightRange: evolveVariant, biasRange: evolveVariant)));
 }