コード例 #1
0
 public static void SaveRun(GeneticAlgorithm.Genome genome, int generationNumber, int genomeNumber)
 {
     FindScriptableObject();
     bestAIRun.genomeToSave     = genome;
     bestAIRun.generationNumber = generationNumber;
     bestAIRun.genomeNumber     = genomeNumber;
     EditorUtility.SetDirty(bestAIRun);
 }
コード例 #2
0
    private void Start()
    {
        m_carControl = FindObjectOfType <UnityStandardAssets.Vehicles.Car.CarUserControl> ();
        m_waypoints  = FindObjectsOfType <Waypoint> ().ToList();
        m_raycaster  = m_carControl.GetComponent <Eyes> ();

        SceneManager.sceneLoaded += OnSceneChanged;

        if (m_geneticAlg == null)
        {
            m_geneticAlg = new GeneticAlgorithm();

            int totalWeights = 0;
            for (int i = 0; i < m_neuralTopology.Length - 1; i++)
            {
                totalWeights += m_neuralTopology [i] * m_neuralTopology [i + 1];
            }
            m_geneticAlg.GeneratePopulation(m_populationCount, totalWeights);

            m_neuralNet = new NeuralNetwork();
            if (loadBestGenome == false)
            {
                GeneticAlgorithm.Genome genome = m_geneticAlg.GetNextGenome();
                m_currentGenomeIndex = m_geneticAlg.GetCurrentGenomeIndex();
                m_neuralNet.CreateNetFromGenome(genome, m_neuralTopology);
            }
            else
            {
                BestAIRun bestRun = SaveLoad.LoadRun();
                GeneticAlgorithm.Genome genome = bestRun.genomeToSave;
                if (genome.weights.Count == 0)
                {
                    Debug.LogError("There are nothing to load. Uncheck 'Load Best Genome' option.");
                    Debug.Break();
                    return;
                }
                m_neuralNet.CreateNetFromGenome(genome, m_neuralTopology);

                m_currentGenerationIndex = bestRun.generationNumber;
                m_currentGenomeIndex     = bestRun.genomeNumber;
                m_bestFitness            = (int)genome.fitness;
            }

            m_defaultPosition = transform.position;
            m_defaultRotation = transform.rotation;
        }

        StartCoroutine(WaitGenomeStart());
    }
コード例 #3
0
    public void NextTestSubject()
    {
        m_currentFitness = 0;

        GeneticAlgorithm.Genome genome = m_geneticAlg.GetNextGenome();
        m_neuralNet.CreateNetFromGenome(genome, m_neuralTopology);
        m_neuralNet.ClearFailure();

        transform.position = m_defaultPosition;
        transform.rotation = m_defaultRotation;

        foreach (Waypoint waypoint in m_waypoints)
        {
            waypoint.gameObject.SetActive(true);
        }
    }
コード例 #4
0
    public void CreateNetFromGenome(GeneticAlgorithm.Genome genome, int[] neuralMap)
    {
        m_network.Clear();
        m_network.AddRange(GetInputNeurons());

        int hiddenLayersCount = neuralMap.Length - 2;
        int synapseIndex      = 0;

        for (int layer = 1; layer <= hiddenLayersCount; layer++)
        {
            int neuronsInCurrentLayer = neuralMap [layer];
            for (int i = 0; i < neuronsInCurrentLayer; i++)
            {
                Neuron hiddenNeuron           = new Neuron(Neuron.NeuronType.HIDDEN, layer);
                int    neuronsInPreviousLayer = neuralMap [layer - 1];
                for (int j = 0; j < neuronsInPreviousLayer; j++)
                {
                    hiddenNeuron.m_weights.Add(genome.weights [synapseIndex]);
                    synapseIndex++;
                }
                m_network.Add(hiddenNeuron);
            }
        }

        int numOfHiddenNeurons = neuralMap [neuralMap.Length - 2];
        int numOfOutputNeurons = neuralMap [neuralMap.Length - 1];

        for (int i = 0; i < numOfOutputNeurons; i++)
        {
            Neuron outputNeuron = new Neuron(Neuron.NeuronType.OUTPUT, neuralMap.Length - 1);

            for (int j = 0; j < numOfHiddenNeurons; j++)
            {
                outputNeuron.m_weights.Add(genome.weights[synapseIndex]);
                synapseIndex++;
            }
            m_network.Add(outputNeuron);
        }
    }