예제 #1
0
    private AgentBodyGenomeTemplate GetDefaultTemplateAgentGenome(Challenge.Type challengeType)
    {
        AgentBodyGenomeTemplate templateGenome;

        switch (challengeType)
        {
        case Challenge.Type.Test:
            templateGenome = Resources.Load("Templates/Agents/TemplateSnakeA") as AgentBodyGenomeTemplate;
            //templateGenome = ((AgentGenomeTemplate)AssetDatabase.LoadAssetAtPath("Assets/Templates/Agents/TemplateTelevisionWalker.asset", typeof(AgentGenomeTemplate)));
            break;

        case Challenge.Type.Racing:
            //Debug.Log("Loaded DogCar!");
            templateGenome = Resources.Load("Templates/Agents/TemplateDogCar") as AgentBodyGenomeTemplate;
            //templateGenome = ((AgentGenomeTemplate)AssetDatabase.LoadAssetAtPath("Assets/Templates/Agents/TemplateDogCar.asset", typeof(AgentGenomeTemplate)));
            break;

        case Challenge.Type.Combat:
            templateGenome = Resources.Load("Templates/Agents/TemplateCombat2") as AgentBodyGenomeTemplate;
            //templateGenome = ((AgentGenomeTemplate)AssetDatabase.LoadAssetAtPath("Assets/Templates/Agents/TemplateCombatBot.asset", typeof(AgentGenomeTemplate)));
            break;

        default:
            Debug.LogError("ChallengeType Not Found! " + challengeType.ToString());
            templateGenome = null;
            break;
        }
        return(templateGenome);
    }
예제 #2
0
    private void SetUpDefaultFitnessComponents(Challenge.Type challengeType, FitnessManager fitnessManager)
    {
        switch (challengeType)
        {
        case Challenge.Type.Test:
            FitnessComponentDefinition newComponent = new FitnessComponentDefinition(FitnessComponentType.Random, FitnessComponentMeasure.Avg, 1f, true);
            fitnessManager.fitnessComponentDefinitions.Add(newComponent);
            break;

        case Challenge.Type.Racing:
            FitnessComponentDefinition newComponentRacing = new FitnessComponentDefinition(FitnessComponentType.Random, FitnessComponentMeasure.Avg, 1f, true);
            fitnessManager.fitnessComponentDefinitions.Add(newComponentRacing);
            break;

        case Challenge.Type.Combat:
            FitnessComponentDefinition newComponentCombat = new FitnessComponentDefinition(FitnessComponentType.Random, FitnessComponentMeasure.Avg, 1f, true);
            fitnessManager.fitnessComponentDefinitions.Add(newComponentCombat);
            break;

        default:
            Debug.LogError("ChallengeType Not Found! " + challengeType.ToString());
            break;
        }

        fitnessManager.SetPendingFitnessListFromMaster(); // make pending list a copy of the primary
    }
예제 #3
0
    public TeamsConfig(int numPlayers, Challenge.Type challengeType, int numEnvironmentReps, int numPlayerReps)
    {
        this.challengeType = challengeType;
        // Challenges might have required modules for environment (& agent?) genomes:
        // for example, go-to-target would REQUIRE having a target object in the environment
        Debug.Log("TeamsConfig() " + this.challengeType.ToString());
        // Teams:
        // Environment
        EnvironmentGenome templateEnvironmentGenome = GetDefaultTemplateEnvironmentGenome(challengeType);

        environmentPopulation = new EnvironmentPopulation(challengeType, templateEnvironmentGenome, numEnvironmentGenomes, numBaselineGenomes, numEnvironmentReps);

        // Players:
        playersList = new List <PlayerPopulation>();
        for (int i = 0; i < numPlayers; i++)
        {
            // Might have to revisit how to pass agent templates per population...
            AgentBodyGenomeTemplate templateAgentGenome = GetDefaultTemplateAgentGenome(challengeType);
            Debug.Log("TEMPLATE: " + templateAgentGenome.bodyGenome.ToString());
            // List of Agent Genomes
            PlayerPopulation player = new PlayerPopulation(challengeType, templateAgentGenome.bodyGenome, numAgentGenomesPerPlayer, numBaselineGenomes, numPlayerReps);

            playersList.Add(player);
        }
    }
예제 #4
0
    /*public void ReloadAgentTemplates() {
     *  // Players:
     *  for (int i = 0; i < playersList.Count; i++) {
     *      // Might have to revisit how to pass agent templates per population...
     *      AgentGenomeTemplate templateAgentGenome = GetDefaultTemplateAgentGenome(challengeType);
     *      playersList[i].templateGenome = templateAgentGenome.templateGenome;
     *  }
     * }*/

    private EnvironmentGenome GetDefaultTemplateEnvironmentGenome(Challenge.Type challengeType)
    {
        EnvironmentGenome templateGenome;

        switch (challengeType)
        {
        case Challenge.Type.Test:
            templateGenome = (Resources.Load("Templates/Environments/TemplateTestDefault2") as EnvironmentGenomeTemplate).templateGenome;
            //templateGenome = ((EnvironmentGenomeTemplate)AssetDatabase.LoadAssetAtPath("Assets/Templates/Environments/TemplateTestDefault.asset", typeof(EnvironmentGenomeTemplate))).templateGenome;
            break;

        case Challenge.Type.Racing:
            templateGenome = (Resources.Load("Templates/Environments/TemplateRacingDefault") as EnvironmentGenomeTemplate).templateGenome;
            //templateGenome = ((EnvironmentGenomeTemplate)AssetDatabase.LoadAssetAtPath("Assets/Templates/Environments/TemplateRacingDefault.asset", typeof(EnvironmentGenomeTemplate))).templateGenome;
            break;

        case Challenge.Type.Combat:
            templateGenome = (Resources.Load("Templates/Environments/TemplateCombatDefault") as EnvironmentGenomeTemplate).templateGenome;
            //templateGenome = ((EnvironmentGenomeTemplate)AssetDatabase.LoadAssetAtPath("Assets/Templates/Environments/TemplateCombatDefault.asset", typeof(EnvironmentGenomeTemplate))).templateGenome;
            break;

        default:
            Debug.LogError("ChallengeType Not Found! " + challengeType.ToString());
            templateGenome = null;
            break;
        }
        return(templateGenome);
    }
예제 #5
0
    public static Vector3 GetChallengeArenaBounds(Challenge.Type challengeType)
    {
        Vector3 arenaBounds = new Vector3(10f, 10f, 10f);

        switch (challengeType)
        {
        case Challenge.Type.Test:
            arenaBounds.x = 40f;
            arenaBounds.y = 40f;
            arenaBounds.z = 40f;

            break;

        case Challenge.Type.Racing:
            arenaBounds.x = 40f;
            arenaBounds.y = 40f;
            arenaBounds.z = 40f;

            break;

        case Challenge.Type.Combat:
            arenaBounds.x = 40f;
            arenaBounds.y = 40f;
            arenaBounds.z = 40f;

            break;

        default:
            //print("default");
            break;
        }

        return(arenaBounds);
    }
예제 #6
0
    public void CopyGenomeFromTemplate(EnvironmentGenome templateGenome)
    {
        //Debug.Log("CopyGenomeFromTemplate BEFORE startPosCount: " + templateGenome.agentStartPositionsList.Count.ToString());
        // This method creates a clone of the provided ScriptableObject Genome - should have no shared references!!!
        this.challengeType = templateGenome.challengeType;
        arenaBounds        = new Vector3(templateGenome.arenaBounds.x, templateGenome.arenaBounds.y, templateGenome.arenaBounds.z);

        agentStartPositionsList = new List <StartPositionGenome>();
        for (int i = 0; i < templateGenome.agentStartPositionsList.Count; i++)
        {
            //Debug.Log("CopyGenomeFromTemplate DURING i: " + i.ToString());
            StartPositionGenome genomeCopy = new StartPositionGenome(templateGenome.agentStartPositionsList[i]);
            agentStartPositionsList.Add(genomeCopy);
        }
        //Debug.Log("CopyGenomeFromTemplate AFTER startPosCount: " + agentStartPositionsList.Count.ToString());

        useTerrain = templateGenome.useTerrain;
        if (useTerrain)
        {
            terrainGenome = new TerrainGenome(templateGenome.terrainGenome);
            //terrainGenome.InitializeRandomGenome();
        }
        useBasicObstacles = templateGenome.useBasicObstacles;
        if (useBasicObstacles)
        {
            basicObstaclesGenome = new BasicObstaclesGenome(templateGenome.basicObstaclesGenome, this);
            //basicObstaclesGenome.InitializeRandomGenome();
        }
        useTargetColumn = templateGenome.useTargetColumn;
        if (useTargetColumn)
        {
            targetColumnGenome = new TargetColumnGenome();
            //targetColumnGenome.InitializeRandomGenome();
        }
        useAtmosphere = templateGenome.useAtmosphere;
        if (useAtmosphere)
        {
            atmosphereGenome = new AtmosphereGenome(templateGenome.atmosphereGenome);
            //basicObstaclesGenome.InitializeRandomGenome();
        }
        useMeteorites = templateGenome.useMeteorites;
        if (useMeteorites)
        {
            meteoritesGenome = new MeteoritesGenome(templateGenome.meteoritesGenome);
            //basicObstaclesGenome.InitializeRandomGenome();
        }

        // For now this is fine -- but eventually might want to copy brainGenome from saved asset!
        //brainGenome = new BrainGenome();  // creates neuron and axonLists
        //InitializeRandomBrainGenome();
    }
예제 #7
0
    private void SetUpDefaultFitnessComponents(Challenge.Type challengeType, FitnessManager fitnessManager)
    {
        switch (challengeType)
        {
        case Challenge.Type.Test:
            //FitnessComponentDefinition fitTest1 = new FitnessComponentDefinition(FitnessComponentType.WinLoss, FitnessComponentMeasure.Last, 1f, true);
            //fitnessManager.fitnessComponentDefinitions.Add(fitTest1);
            //FitnessComponentDefinition fitTest2 = new FitnessComponentDefinition(FitnessComponentType.DistanceToTargetSquared, FitnessComponentMeasure.Avg, 1f, false);
            //fitnessManager.fitnessComponentDefinitions.Add(fitTest2);
            FitnessComponentDefinition fitTest1 = new FitnessComponentDefinition(FitnessComponentType.ContactHazard, FitnessComponentMeasure.Avg, 1f, false);
            fitnessManager.fitnessComponentDefinitions.Add(fitTest1);
            FitnessComponentDefinition fitTest2 = new FitnessComponentDefinition(FitnessComponentType.DistToOrigin, FitnessComponentMeasure.Avg, 1f, true);
            fitnessManager.fitnessComponentDefinitions.Add(fitTest2);
            FitnessComponentDefinition fitTest3 = new FitnessComponentDefinition(FitnessComponentType.Velocity, FitnessComponentMeasure.Avg, 1f, true);
            fitnessManager.fitnessComponentDefinitions.Add(fitTest3);
            break;

        case Challenge.Type.Racing:
            FitnessComponentDefinition fitCompRacing1 = new FitnessComponentDefinition(FitnessComponentType.ContactHazard, FitnessComponentMeasure.Avg, 1f, false);
            fitnessManager.fitnessComponentDefinitions.Add(fitCompRacing1);
            FitnessComponentDefinition fitCompRacing2 = new FitnessComponentDefinition(FitnessComponentType.Velocity, FitnessComponentMeasure.Avg, 1f, true);
            fitnessManager.fitnessComponentDefinitions.Add(fitCompRacing2);
            break;

        case Challenge.Type.Combat:
            FitnessComponentDefinition fitCompCombat1 = new FitnessComponentDefinition(FitnessComponentType.Random, FitnessComponentMeasure.Avg, 0.1f, true);
            fitnessManager.fitnessComponentDefinitions.Add(fitCompCombat1);
            FitnessComponentDefinition fitCompCombat2 = new FitnessComponentDefinition(FitnessComponentType.Health, FitnessComponentMeasure.Avg, 0.5f, true);
            fitnessManager.fitnessComponentDefinitions.Add(fitCompCombat2);
            FitnessComponentDefinition fitCompCombat3 = new FitnessComponentDefinition(FitnessComponentType.DamageInflicted, FitnessComponentMeasure.Avg, 1f, true);
            fitnessManager.fitnessComponentDefinitions.Add(fitCompCombat3);
            FitnessComponentDefinition fitCompCombat4 = new FitnessComponentDefinition(FitnessComponentType.WinLoss, FitnessComponentMeasure.Avg, 1f, true);
            fitnessManager.fitnessComponentDefinitions.Add(fitCompCombat4);
            break;

        default:
            Debug.LogError("ChallengeType Not Found! " + challengeType.ToString());
            break;
        }

        fitnessManager.SetPendingFitnessListFromMaster(); // make pending list a copy of the primary
    }
예제 #8
0
    // First-time Initialization -- triggered through gameManager & GUI
    public void NewTrainingMode(Challenge.Type challengeType)
    {
        this.challengeType = challengeType;
        // Initialize
        int numPlayers = 1;

        switch (this.challengeType)
        {
        case Challenge.Type.Test:
            Debug.Log("Switch: Test");
            numPlayers = 1;
            break;

        case Challenge.Type.Racing:
            Debug.Log("Switch: Racing");
            numPlayers = 1;
            break;

        case Challenge.Type.Combat:
            Debug.Log("Switch: Combat");
            numPlayers = 2;
            break;

        default:
            Debug.Log("Switch: Default");
            break;
        }
        // environment is evolvable, 1 player:
        teamsConfig = new TeamsConfig(numPlayers, this.challengeType, 1, 1);

        playingCurGen = 0;

        evaluationManager = new EvaluationManager();
        // Need to make sure all populations have their representatives set up before calling this:
        // Right now this is done through the teamsConfig Constructor
        evaluationManager.InitializeNewTraining(teamsConfig, challengeType); // should I just roll this into the Constructor?

        isTraining = true;
        //cameraEnabled = true;

        gameManager.uiManager.panelTraining.moduleViewUI.SetPendingGenomesFromData(this);
    }
예제 #9
0
    // Representative system will be expanded later - for now, just defaults to Top # of performers
    public PlayerPopulation(Challenge.Type challengeType, BodyGenome bodyTemplate, int numGenomes, int numBaseline, int numReps)
    {
        bodyGenomeTemplate = new BodyGenome();
        bodyGenomeTemplate.CopyBodyGenomeFromTemplate(bodyTemplate);

        graphKing = new TheGraphKing();

        popSize          = numGenomes;
        this.numBaseline = numBaseline;

        // Create blank AgentGenomes for the standard population
        agentGenomeList    = new List <AgentGenome>();
        historicGenomePool = new List <AgentGenome>();
        baselineGenomePool = new List <AgentGenome>();

        for (int j = 0; j < numGenomes; j++)
        {
            AgentGenome agentGenome = new AgentGenome(j);
            agentGenome.InitializeBodyGenomeFromTemplate(bodyGenomeTemplate);
            agentGenome.InitializeRandomBrainFromCurrentBody(0.0f);
            agentGenomeList.Add(agentGenome);
        }
        RepopulateBaselineGenomes();
        AppendBaselineGenomes();

        // Representatives:
        numPerformanceReps = numReps;
        ResetRepresentativesList();
        historicGenomePool.Add(agentGenomeList[0]); // init

        fitnessManager = new FitnessManager();
        SetUpDefaultFitnessComponents(challengeType, fitnessManager);
        fitnessManager.ResetHistoricalData();
        fitnessManager.ResetCurrentHistoricalDataLists();
        fitnessManager.InitializeForNewGeneration(agentGenomeList.Count);

        trainingSettingsManager = new TrainingSettingsManager(0.01f, 0.8f, 0.2f, 0.005f);
    }
예제 #10
0
    public EnvironmentPopulation(Challenge.Type challengeType, EnvironmentGenome templateGenome, int numGenomes, int numBaseline, int numReps)
    {
        this.templateGenome = templateGenome;
        popSize             = numGenomes;
        this.numBaseline    = numBaseline;

        environmentGenomeList = new List <EnvironmentGenome>();
        historicGenomePool    = new List <EnvironmentGenome>();
        baselineGenomePool    = new List <EnvironmentGenome>();

        for (int e = 0; e < numGenomes; e++)
        {
            // Create new environmentGenome
            EnvironmentGenome envGenome = new EnvironmentGenome(e);
            envGenome.InitializeRandomGenomeFromTemplate(templateGenome);
            // Add to envGenomesList:
            environmentGenomeList.Add(envGenome);

            // Create parallel initial batch of genomes to be used as baseline comparison
            EnvironmentGenome baseGenome = new EnvironmentGenome(e);
            baseGenome.InitializeRandomGenomeFromTemplate(templateGenome);
            baselineGenomePool.Add(baseGenome);
        }
        AppendBaselineGenomes();

        // Representatives:
        numPerformanceReps = numReps;
        ResetRepresentativesList();
        historicGenomePool.Add(environmentGenomeList[0]); // init

        fitnessManager = new FitnessManager();
        SetUpDefaultFitnessComponents(challengeType, fitnessManager);
        fitnessManager.ResetHistoricalData();
        fitnessManager.InitializeForNewGeneration(environmentGenomeList.Count);

        trainingSettingsManager = new TrainingSettingsManager(1f, 1f, 0f, 0f);
    }
예제 #11
0
    public void SetUpInstance(EvaluationTicket evalTicket, TeamsConfig teamsConfig, ExhibitionParticleCurves exhibitionParticleCurves)
    {
        this.teamsConfig   = teamsConfig;
        this.challengeType = teamsConfig.challengeType;
        this.maxTimeSteps  = evalTicket.maxTimeSteps;

        /*string debugname = "";
         * for( int i = 0; i < evalTicket.genomeIndices.Length; i++) {
         *  debugname += evalTicket.genomeIndices[i].ToString() + ",";
         * }
         * debugname += evalTicket.focusPopIndex.ToString();
         * gameObject.name = debugname;*/

        // create particle key:

        /*int[] indices = new int[teamsConfig.playersList.Count + 2];
         * indices[0] = evalTicket.focusPopIndex;
         * for(int i = 0; i < evalTicket.genomeIndices.Length; i++) {
         *  indices[i + 1] = evalTicket.genomeIndices[i];
         * }
         * indices[indices[0] + 1] = 0; // focusPop is 0
         */
        /*int[] indices = new int[teamsConfig.playersList.Count + 2];
         * indices[0] = evalTicket.focusPopIndex;
         * for (int i = 0; i < evalTicket.agentGenomesList.Count + 1; i++) {
         *  if (i == 0) {
         *      indices[i + 1] = evalTicket.environmentGenome.index;
         *  }
         *  else {
         *      indices[i + 1] = evalTicket.agentGenomesList[i - 1].index;
         *  }
         *  //indices[i + 1] = ticket.genomeIndices[i];
         * }
         *
         * string txt = "";
         * for(int i = 0; i < indices.Length; i++) {
         *  txt += indices[i].ToString();
         * }*/
        //Debug.Log(txt);

        /*if (exhibitionParticleRef.particleDictionary != null) {
         *  if (exhibitionParticleRef.particleDictionary.TryGetValue(txt, out particleCurves)) {
         *      // particleCurves
         *      //Debug.Log("FOUND IT! set up " + txt);
         *
         *      emit = true;
         *      if (isExhibition)
         *          emit = false;
         *  }
         *  else {
         *      //if (!isExhibition)
         *      //Debug.Log("Eval Instance Setup FAIL " + txt);
         *      emit = false;
         *  }
         * }*/
        if (evalTicket.environmentGenome.index == 0)  // if this instance is testing an agent vs. the Top Environment, record its curves:

        {
            if (isExhibition)
            {
                //emit = false;
                particleCurves = exhibitionParticleCurves.singleTrajectoryCurvesPS;
                emit           = true;
            }
            else
            {
                particleCurves = exhibitionParticleCurves.singleTrajectoryCurvesPS;
                emit           = true;
            }
        }
        else
        {
            emit = false;
        }


        currentEvalTicket = evalTicket;

        BruteForceInit();

        currentEvalTicket.status = EvaluationTicket.EvaluationStatus.InProgress;


        //emitterParamsDefault.startSize = 0.12f;
        //emitterParamsDefault.startColor = new Color(1f, 1f, 1f, 0.1f);

        emitterParamsWin.startSize  = 1.2f;
        emitterParamsWin.startColor = new Color(0.1f, 1f, 0.1f, 1f);

        emitterParamsLose.startSize  = 1.2f;
        emitterParamsLose.startColor = new Color(1f, 0.1f, 0.1f, 1f);

        emitterParamsDraw.startSize  = 1.0f;
        emitterParamsDraw.startColor = new Color(0.4f, 0.4f, 0.4f, 1f);
    }
예제 #12
0
    public void Init1(TeamsConfig teamsConfig)
    {
        challengeType = teamsConfig.challengeType;

        // Temp hardcoded!!!!!
        competitionType   = CompetitionType.Independent;
        competitionFormat = CompetitionFormat.HighScore;
        numOpponents      = 1;

        tournamentRoundList = new List <TournamentRound>();

        TournamentRound round1 = new TournamentRound(0);

        // MOCKUP:
        int[] competitorIDs = new int[1];
        competitorIDs[0] = -1;
        // Match1
        string savename = "env1";
        string path     = Application.dataPath + "/IndividualSaves/Environments/" + savename + ".json";
        // Read the json from the file into a string
        string             dataAsJson        = File.ReadAllText(path);
        EnvironmentGenome  loadedGenome1     = JsonUtility.FromJson <EnvironmentGenome>(dataAsJson);
        List <AgentGenome> agentGenomesList1 = new List <AgentGenome>();

        agentGenomesList1.Add(teamsConfig.playersList[0].agentGenomeList[0]);
        EvaluationTicket ticket1 = new EvaluationTicket(loadedGenome1, agentGenomesList1, 1, 1000);

        TournamentMatchup matchup1 = new TournamentMatchup(0, ticket1, 0, competitorIDs);

        round1.matchupList.Add(matchup1);

        // Match2
        savename = "env2";
        path     = Application.dataPath + "/IndividualSaves/Environments/" + savename + ".json";
        // Read the json from the file into a string
        dataAsJson = File.ReadAllText(path);
        EnvironmentGenome  loadedGenome2     = JsonUtility.FromJson <EnvironmentGenome>(dataAsJson);
        List <AgentGenome> agentGenomesList2 = new List <AgentGenome>();

        agentGenomesList2.Add(teamsConfig.playersList[0].agentGenomeList[0]);
        EvaluationTicket  ticket2  = new EvaluationTicket(loadedGenome2, agentGenomesList2, 1, 1000);
        TournamentMatchup matchup2 = new TournamentMatchup(1, ticket2, 1, competitorIDs);

        round1.matchupList.Add(matchup2);

        // Matchup3:
        savename = "env3";
        path     = Application.dataPath + "/IndividualSaves/Environments/" + savename + ".json";
        // Read the json from the file into a string
        dataAsJson = File.ReadAllText(path);
        EnvironmentGenome  loadedGenome3     = JsonUtility.FromJson <EnvironmentGenome>(dataAsJson);
        List <AgentGenome> agentGenomesList3 = new List <AgentGenome>();

        agentGenomesList3.Add(teamsConfig.playersList[0].agentGenomeList[0]);
        EvaluationTicket  ticket3  = new EvaluationTicket(loadedGenome3, agentGenomesList3, 1, 1000);
        TournamentMatchup matchup3 = new TournamentMatchup(2, ticket3, 2, competitorIDs);

        round1.matchupList.Add(matchup3);


        tournamentRoundList.Add(round1);
    }
예제 #13
0
 public void FirstTimePlayGoToTraining()
 {
     challengeType = Challenge.Type.Test;
     NewTrainingMode();
 }
 public void AddChallenge(Topic topic, string text, bool isOpen, Challenge.Type type, List <string> answers)
 {
     topic.AddChallenge(idCount, text, isOpen, type, answers);
     idCount++;
 }
 public void AddChallenge(int id, string text, bool isOpen, Challenge.Type type, List <string> answers)
 {
     entries.Add(new Challenge(id, text, isOpen, type, answers));
 }
예제 #16
0
    public EnvironmentGenome BirthNewGenome(EnvironmentGenome parentGenome, int index, Challenge.Type challengeType, float mutationRate, float mutationDriftAmount)
    {
        EnvironmentGenome newGenome = new EnvironmentGenome(index);

        newGenome.challengeType = parentGenome.challengeType;
        newGenome.arenaBounds   = new Vector3(parentGenome.arenaBounds.x, parentGenome.arenaBounds.y, parentGenome.arenaBounds.z);

        newGenome.useTerrain = parentGenome.useTerrain;
        if (parentGenome.useTerrain)
        {
            newGenome.terrainGenome = TerrainGenome.BirthNewGenome(parentGenome.terrainGenome, mutationRate, mutationDriftAmount);
        }
        newGenome.useBasicObstacles = parentGenome.useBasicObstacles;
        if (parentGenome.useBasicObstacles)
        {
            newGenome.basicObstaclesGenome = BasicObstaclesGenome.BirthNewGenome(parentGenome.basicObstaclesGenome, mutationRate, mutationDriftAmount, this);
        }
        newGenome.useTargetColumn = parentGenome.useTargetColumn;
        if (parentGenome.useTargetColumn)
        {
            newGenome.targetColumnGenome = TargetColumnGenome.BirthNewGenome(parentGenome.targetColumnGenome, mutationRate, mutationDriftAmount);
        }
        newGenome.useAtmosphere = parentGenome.useAtmosphere;
        if (parentGenome.useAtmosphere)
        {
            newGenome.atmosphereGenome = AtmosphereGenome.BirthNewGenome(parentGenome.atmosphereGenome, mutationRate, mutationDriftAmount);
        }
        newGenome.useMeteorites = parentGenome.useMeteorites;
        if (parentGenome.useMeteorites)
        {
            newGenome.meteoritesGenome = MeteoritesGenome.BirthNewGenome(parentGenome.meteoritesGenome, mutationRate, mutationDriftAmount);
        }

        // StartPositions:
        // HACKY! DOES NOT SUPPORT EVOLVING START POSITIONS! ALL THE SAME!!!!
        newGenome.agentStartPositionsList = parentGenome.agentStartPositionsList;

        /*newGenome.agentStartPositionsList = new List<Vector3>();
         * //Debug.Log("(parentGenome.agentStartPositionsList.Count" + parentGenome.agentStartPositionsList.Count.ToString());
         * for (int i = 0; i < parentGenome.agentStartPositionsList.Count; i++) {
         *  newGenome.agentStartPositionsList.Add(new Vector3(parentGenome.agentStartPositionsList[i].x, parentGenome.agentStartPositionsList[i].y, parentGenome.agentStartPositionsList[i].z));
         * }
         * newGenome.agentStartRotationsList = new List<Quaternion>();
         * for (int i = 0; i < parentGenome.agentStartRotationsList.Count; i++) {
         *  newGenome.agentStartRotationsList.Add(new Quaternion(parentGenome.agentStartRotationsList[i].x, parentGenome.agentStartRotationsList[i].y, parentGenome.agentStartRotationsList[i].z, parentGenome.agentStartRotationsList[i].w));
         * }*/

        return(newGenome);
    }