public static void SaveRun(GeneticAlgorithm.Genome genome, int generationNumber, int genomeNumber) { FindScriptableObject(); bestAIRun.genomeToSave = genome; bestAIRun.generationNumber = generationNumber; bestAIRun.genomeNumber = genomeNumber; EditorUtility.SetDirty(bestAIRun); }
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()); }
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); } }
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); } }