コード例 #1
0
    private void instantiateAgents()
    {
        for (int i = 0; i < numClones; i++)
        {
            agents[i] = Instantiate(agentPrefab);
            MeshRenderer pendulumMesh = agents[i].GetComponent <MeshRenderer>();
            if (pendulumMesh != null)
            {
                pendulumMesh.material.color = Random.ColorHSV(0f, 1f, 1f, 1f, 0.5f, 1f);//colours[i];//Random.Range(0, 1) * 255, Random.Range(0, 1) * 255, Random.Range(0, 1) * 255, 1);
            }

            AgentTrainer trainer = agents[i].GetComponent <AgentTrainer>();
            trainer.Initialize(newTrainers[i].getNeuralNetwork(), Random.Range(-15, 15));
            //Debug.Log("Fitness: " + trainer.fitness);
        }
    }
コード例 #2
0
    void Start()
    {
        //Note: Different instances are set to not collide given Edit>ProjectSettings>Physics>LayerCollisionMatrix settings
        Debug.Log("Starting! Godspeed");
        Time.timeScale = timeScale;

        //TODO: Make random neural networks or read in NNs from file
        NeuralNetwork[] initNetworks = new NeuralNetwork[numClones];
        for (int i = 0; i < initNetworks.Length; i++)
        {
            initNetworks[i] = new NeuralNetwork(topology);
            initNetworks[i].SetRandomWeights(-10.0, 10.0);
        }

        for (int i = 0; i < numClones; i++)
        {
            newTrainers[i] = new AgentTrainer(initNetworks[i]);
        }

        instantiateAgents();
    }
コード例 #3
0
    public AgentTrainer[] evolve(AgentTrainer[] trainers)
    {
        if (trainers.Length < 2)
        {
            throw new System.Exception("Not enough trainers passed to Evolver.evolve(). Cannot breed.");
        }
        trainers = trainers.OrderByDescending(t => t.fitness).ToArray <AgentTrainer>();
        NeuralNetwork mother = trainers[0].getNeuralNetwork();
        NeuralNetwork father = trainers[1].getNeuralNetwork();

        NeuralNetwork[] childrenNetworks = new NeuralNetwork[trainers.Length];

        if (!validateNetworks(mother, father))
        {
            throw new System.Exception("Invalid parents");
        }

        //////////////////////////////////////////////////////

        for (int i = 0; i < childrenNetworks.Length; i++)
        {
            childrenNetworks[i] = new NeuralNetwork(mother.Topology);
        }

        foreach (NeuralNetwork childNetwork in childrenNetworks)
        {
            for (int layer = 0; layer < childNetwork.Layers.Length; layer++)
            {
                NeuralLayer Layer = childNetwork.Layers[layer];
                for (int weightRow = 0; weightRow < Layer.Weights.GetLength(0); weightRow++)
                {
                    for (int weightCol = 0; weightCol < Layer.Weights.GetLength(1); weightCol++)
                    {
                        if (!mutate())
                        {
                            double parentWeight = Mathf.RoundToInt(Random.Range(0, 1)) >= biasTowardsMother ? mother.Layers[layer].Weights[weightRow, weightCol] : father.Layers[layer].Weights[weightRow, weightCol];
                            childNetwork.Layers[layer].Weights[weightRow, weightCol] = parentWeight;
                        }
                        else
                        {
                            childNetwork.Layers[layer].Weights[weightRow, weightCol] = Random.Range(-mutationRange, mutationRange);
                            Debug.Log("MUTATED!");
                        }
                    }
                }
            }
        }

        NeuralNetwork[] randomChildren = childrenNetworks.Take((int)(percentRandomChildren * childrenNetworks.Length)).ToArray();
        foreach (NeuralNetwork randomChild in randomChildren)
        {
            randomChild.SetRandomWeights(-mutationRange, mutationRange);
        }

        //////////////////////////////////////////////////////

        AgentTrainer[] newTrainers = new AgentTrainer[trainers.Length];
        for (int trainer = 0; trainer < newTrainers.Length; trainer++)
        {
            newTrainers[trainer] = new AgentTrainer(childrenNetworks[trainer]);
        }

        return(newTrainers);
    }