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); }
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))); }