public void InitializeModules(AgentGenome genome, Agent agent, StartPositionGenome startPos) { testModule = new TestModule(); testModule.Initialize(genome.bodyGenome.testModuleGenome, agent, startPos); /* * healthModuleList = new List<HealthModule>(); * valueList = new List<InputValue>(); * * for (int i = 0; i < genome.bodyGenome.healthModuleList.Count; i++) { * HealthModule healthModule = new HealthModule(); * //agent.segmentList[genome.healthModuleList[i].parentID].AddComponent<HealthModuleComponent>(); * healthModule.Initialize(genome.bodyGenome.healthModuleList[i], agent); * healthModuleList.Add(healthModule); * //healthModuleList[i].Initialize(genome.healthModuleList[i]); * } * for (int i = 0; i < genome.bodyGenome.valueInputList.Count; i++) { * InputValue inputValue = new InputValue(); * inputValue.Initialize(genome.bodyGenome.valueInputList[i], agent); * valueList.Add(inputValue); * //valueList[i].Initialize(genome.valueInputList[i]); * } */ }
public void CopyGenomeFromTemplate(EnvironmentGenome templateGenome) { 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++) { StartPositionGenome genomeCopy = new StartPositionGenome(templateGenome.agentStartPositionsList[i]); agentStartPositionsList.Add(genomeCopy); } }
public void StartNewTrainingMode() { Destroy(playerGO); // Create population brains agentGenomeList = new List <AgentGenome>(); BodyGenome templateBodyGenome = new BodyGenome(); templateBodyGenome.InitializeGenomeAsDefault(); //BodyGenome bodyGenomeTemplate = new BodyGenome(); //bodyGenomeTemplate.CopyBodyGenomeFromTemplate(bodyTemplate); for (int i = 0; i < trainingPopulationSize; i++) { AgentGenome newGenome = new AgentGenome(i); newGenome.InitializeBodyGenomeFromTemplate(templateBodyGenome); newGenome.InitializeRandomBrainFromCurrentBody(0.033f); agentGenomeList.Add(newGenome); } // CrossoverSettings: trainingSettingsManager = new TrainingSettingsManager(0.06f, 0.35f, 0.1f, 0.01f); GameObject dummyAgentGO = new GameObject("DummyAgent"); dummyAgent = dummyAgentGO.AddComponent <Agent>(); dummyStartGenome = new StartPositionGenome(Vector3.zero, Quaternion.identity); ResetTrainingForNewGen(); //Brain brain = new Brain() //Debug.Log(dummyAgent.testModule.); // Create Visible Display Agent to observe behavior /*displayStartPos = new StartPositionGenome(Vector3.zero, Quaternion.identity); * GameObject agentGO = Instantiate(Resources.Load("PredatorPrey/PredatorPrefab")) as GameObject; ; // GameObject.CreatePrimitive(PrimitiveType.Sphere); * //displayAgent * agentGO.name = "Guinea Pig"; * //agentGO.transform.parent = gameObject.transform; * agentGO.transform.localPosition = displayStartPos.agentStartPosition; * agentGO.transform.localRotation = displayStartPos.agentStartRotation; * //agentGO.GetComponent<Collider>().enabled = false; * displayAgent = agentGO.AddComponent<Agent>(); * displayAgent.isVisible = true; * displayAgent.InitializeAgentFromTemplate(agentGenomeList[0], displayStartPos); * // hook modules: * displayAgent.testModule.enemyTransform = targetGO.transform; * displayAgent.testModule.bias[0] = 1f; * displayAgent.testModule.enemyTestModule = displayAgent.testModule; // self as target, to zero out targetvel */ ResetTrainingAgentAndEnvironment(); }
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(); }
public void InitializeAsDefaultGenome() { // ARENA BOUNDS IRRELEVANT!!! // Currently hardcoded in: // EvaluationManager --> CreateEvaluationInstances() arenaBounds = new Vector3(40f, 40f, 40f); agentStartPositionsList = new List <StartPositionGenome>(); StartPositionGenome player1Start = new StartPositionGenome(new Vector3(0f, -5f, 0f), Quaternion.identity); StartPositionGenome player2Start = new StartPositionGenome(new Vector3(0f, 5f, 0f), Quaternion.identity); agentStartPositionsList.Add(player1Start); agentStartPositionsList.Add(player2Start); }
public void InitializeAgentFromTemplate(AgentGenome genome, StartPositionGenome startPos) { // Initialize Modules -- //Debug.Log("Agent Initialize Modules() segment count: " + segmentList.Count.ToString() + ", visCount: " + visibleObjectList.Count.ToString()); // -- Setup that used to be done in the constructors InitializeModules(genome, this, startPos); // Visible/Non-Visible: //if (isVisible) { // for (int i = 0; i < visibleObjectList.Count; i++) { // visibleObjectList[i].SetActive(true); // } //} // Construct Brain: brain = new Brain(genome.brainGenome, this); }
public void Initialize(TestModuleGenome genome, Agent agent, StartPositionGenome startPos) { //destroyed = false; bias = new float[1]; bias[0] = 1f; ownPosX = new float[1]; ownPosX[0] = startPos.agentStartPosition.x; ownPosY = new float[1]; ownPosY[0] = startPos.agentStartPosition.y; ownVelX = new float[1]; ownVelY = new float[1]; enemyPosX = new float[1]; enemyPosY = new float[1]; enemyVelX = new float[1]; enemyVelY = new float[1]; enemyDirX = new float[1]; enemyDirY = new float[1]; distLeft = new float[1]; distRight = new float[1]; distUp = new float[1]; distDown = new float[1]; throttleX = new float[1]; throttleY = new float[1]; maxSpeed = genome.maxSpeed; accel = genome.accel; radius = genome.radius; //maxHealth = genome.maxHealth; //health = maxHealth; //prevHealth = health; parentID = genome.parentID; inno = genome.inno; //isVisible = agent.isVisible; //component = agent.segmentList[parentID].AddComponent<HealthModuleComponent>(); //if (component == null) { // Debug.LogAssertion("No existing HealthModuleComponent on segment " + parentID.ToString()); //} //component.healthModule = this; }
void Start() { if (spawnZonesList == null) { return; } foodStartGenomesArray = new StartPositionGenome[spawnZonesList.Count]; for (int i = 0; i < spawnZonesList.Count; i++) { Vector3 parentForward = spawnZonesList[i].transform.up; Vector3 startPos = new Vector3(spawnZonesList[i].transform.position.x, spawnZonesList[i].transform.position.y, 0f) + parentForward * 0.5f; StartPositionGenome startPosGenome = new StartPositionGenome(startPos, Quaternion.identity); foodStartGenomesArray[i] = startPosGenome; } }
private void EnvironmentCrossover() { /*int randStart = UnityEngine.Random.Range(0, 4); * if(randStart == 0) { * StartPositionGenome newStart0 = new StartPositionGenome(new Vector3(-5f, 0f, 0f), Quaternion.identity); * StartPositionGenome newStart1 = new StartPositionGenome(new Vector3(5f, 0f, 0f), Quaternion.identity); * teamsConfig.environmentPopulation.environmentGenomeList[0].agentStartPositionsList[0] = newStart0; * teamsConfig.environmentPopulation.environmentGenomeList[0].agentStartPositionsList[1] = newStart1; * } * else if(randStart == 1) { * StartPositionGenome newStart0 = new StartPositionGenome(new Vector3(5f, 0f, 0f), Quaternion.identity); * StartPositionGenome newStart1 = new StartPositionGenome(new Vector3(-5f, 0f, 0f), Quaternion.identity); * teamsConfig.environmentPopulation.environmentGenomeList[0].agentStartPositionsList[0] = newStart0; * teamsConfig.environmentPopulation.environmentGenomeList[0].agentStartPositionsList[1] = newStart1; * } * else if (randStart == 2) { * StartPositionGenome newStart0 = new StartPositionGenome(new Vector3(0f, -5f, 0f), Quaternion.identity); * StartPositionGenome newStart1 = new StartPositionGenome(new Vector3(0f, 5f, 0f), Quaternion.identity); * teamsConfig.environmentPopulation.environmentGenomeList[0].agentStartPositionsList[0] = newStart0; * teamsConfig.environmentPopulation.environmentGenomeList[0].agentStartPositionsList[1] = newStart1; * } * else { * StartPositionGenome newStart0 = new StartPositionGenome(new Vector3(0f, 5f, 0f), Quaternion.identity); * StartPositionGenome newStart1 = new StartPositionGenome(new Vector3(0f, -5f, 0f), Quaternion.identity); * teamsConfig.environmentPopulation.environmentGenomeList[0].agentStartPositionsList[0] = newStart0; * teamsConfig.environmentPopulation.environmentGenomeList[0].agentStartPositionsList[1] = newStart1; * }*/ for (int e = 0; e < teamsConfig.environmentPopulation.environmentGenomeList.Count; e++) { float randAngleRad = UnityEngine.Random.Range(-Mathf.PI, Mathf.PI); float randRadius = UnityEngine.Random.Range(2.5f, 7.5f); StartPositionGenome newStart0 = new StartPositionGenome(new Vector3(Mathf.Cos(randAngleRad) * randRadius, Mathf.Sin(randAngleRad) * randRadius, 0f), Quaternion.identity); StartPositionGenome newStart1 = new StartPositionGenome(new Vector3(Mathf.Cos(randAngleRad + Mathf.PI) * randRadius, Mathf.Sin(randAngleRad + Mathf.PI) * randRadius, 0f), Quaternion.identity); teamsConfig.environmentPopulation.environmentGenomeList[e].agentStartPositionsList[0] = newStart0; teamsConfig.environmentPopulation.environmentGenomeList[e].agentStartPositionsList[1] = newStart1; } /* * List<EnvironmentGenome> newGenGenomeList = new List<EnvironmentGenome>(); // new population! * * FitnessManager fitnessManager = teamsConfig.environmentPopulation.fitnessManager; * TrainingSettingsManager trainingSettingsManager = teamsConfig.environmentPopulation.trainingSettingsManager; * float mutationChance = trainingSettingsManager.mutationChance; * float mutationStepSize = trainingSettingsManager.mutationStepSize; * * // Keep top-half peformers + mutations: * for (int x = 0; x < teamsConfig.environmentPopulation.environmentGenomeList.Count; x++) { * if (false) { //x == 0) { * // Top performer stays * EnvironmentGenome parentGenome = teamsConfig.environmentPopulation.environmentGenomeList[fitnessManager.rankedIndicesList[x]]; * parentGenome.index = 0; * newGenGenomeList.Add(parentGenome); * } * else { * int parentIndex = fitnessManager.GetAgentIndexByLottery(); * * EnvironmentGenome parentGenome = teamsConfig.environmentPopulation.environmentGenomeList[parentIndex]; * EnvironmentGenome newGenome = parentGenome.BirthNewGenome(parentGenome, newGenGenomeList.Count, teamsConfig.challengeType, mutationChance, mutationStepSize); * * newGenGenomeList.Add(newGenome); * } * } * * for (int i = 0; i < teamsConfig.environmentPopulation.environmentGenomeList.Count; i++) { * teamsConfig.environmentPopulation.environmentGenomeList[i] = newGenGenomeList[i]; * } */ }
public void Initialize(TestModuleGenome genome, Agent agent, StartPositionGenome startPos) { ownRigidBody2D = agent.GetComponent <Rigidbody2D>(); bias = new float[1]; //0 foodPosX = new float[1]; //1 foodPosY = new float[1]; // 2 foodDirX = new float[1]; // 3 foodDirY = new float[1]; // 4 foodTypeR = new float[1]; // 5 foodTypeG = new float[1]; // 6 foodTypeB = new float[1]; // 7 friendPosX = new float[1]; // 8 friendPosY = new float[1]; // 9 friendVelX = new float[1]; // 10 friendVelY = new float[1]; // 11 friendDirX = new float[1]; // 12 friendDirY = new float[1]; // 13 enemyPosX = new float[1]; // 14 enemyPosY = new float[1]; // 15 enemyVelX = new float[1]; // 16 enemyVelY = new float[1]; // 17 enemyDirX = new float[1]; // 18 enemyDirY = new float[1]; // 19 ownVelX = new float[1]; // 20 ownVelY = new float[1]; // 21 temperature = new float[1]; // 22 pressure = new float[1]; // 23 isContact = new float[1]; // 24 contactForceX = new float[1]; // 25 contactForceY = new float[1]; // 26 hitPoints = new float[1]; // 27 stamina = new float[1]; // 28 foodAmountR = new float[1]; // 29 foodAmountG = new float[1]; // 30 foodAmountB = new float[1]; // 31 distUp = new float[1]; // 32 // start up and go clockwise! distTopRight = new float[1]; // 33 distRight = new float[1]; // 34 distBottomRight = new float[1]; // 35 distDown = new float[1]; // 36 distBottomLeft = new float[1]; // 37 distLeft = new float[1]; // 38 distTopLeft = new float[1]; // 39 inComm0 = new float[1]; // 40 inComm1 = new float[1]; // 41 inComm2 = new float[1]; // 42 inComm3 = new float[1]; // 43 // 44 Total Inputs throttleX = new float[1]; // 0 throttleY = new float[1]; // 1 dash = new float[1]; // 2 outComm0 = new float[1]; // 3 outComm1 = new float[1]; // 4 outComm2 = new float[1]; // 5 outComm3 = new float[1]; // 6 // 7 Total Outputs //maxHealth = genome.maxHealth; //health = maxHealth; //prevHealth = health; bias[0] = 1f; foodAmountR[0] = 0.5f; foodAmountG[0] = 0.5f; foodAmountB[0] = 0.5f; hitPoints[0] = 1f; stamina[0] = 1f; //if(genome!= null) { // Debug.Log("!null -- genome.parentID" + genome.parentID.ToString()); //} //Debug.Log("genome.parentID" + genome.parentID.ToString()); parentID = genome.parentID; inno = genome.inno; //isVisible = agent.isVisible; //component = agent.segmentList[parentID].AddComponent<HealthModuleComponent>(); //if (component == null) { // Debug.LogAssertion("No existing HealthModuleComponent on segment " + parentID.ToString()); //} //component.healthModule = this; }
public StartPositionGenome(StartPositionGenome templateGenome) { agentStartPosition = new Vector3(templateGenome.agentStartPosition.x, templateGenome.agentStartPosition.y, templateGenome.agentStartPosition.z); agentStartRotation = new Quaternion(templateGenome.agentStartRotation.x, templateGenome.agentStartRotation.y, templateGenome.agentStartRotation.z, templateGenome.agentStartRotation.w); }
public void ResetTrainingAgentAndEnvironment() { // Spawn Player & Target Randomly float randomAngle = UnityEngine.Random.Range(-Mathf.PI, Mathf.PI); float randomRadius = UnityEngine.Random.Range(minSpawnRadius, maxSpawnRadius); Vector3 displayPos = new Vector3(Mathf.Cos(randomAngle) * randomRadius, Mathf.Sin(randomAngle) * randomRadius, 0f); Vector3 targetPos = new Vector3(Mathf.Cos(randomAngle + Mathf.PI) * randomRadius, Mathf.Sin(randomAngle + Mathf.PI) * randomRadius, 0f); BodyGenome templateBodyGenome = new BodyGenome(); templateBodyGenome.InitializeGenomeAsDefault(); AgentGenome newGenome = new AgentGenome(-1); newGenome.InitializeBodyGenomeFromTemplate(templateBodyGenome); newGenome.InitializeRandomBrainFromCurrentBody(0.0f); if (displayGO != null) { Destroy(displayGO); // NOT IDEAL } displayGO = Instantiate(Resources.Load("PredatorPrey/PredatorPrefab")) as GameObject; displayAgent = displayGO.AddComponent <Agent>(); displayAgent.humanControlled = false; StartPositionGenome displayStartPos = new StartPositionGenome(displayPos, Quaternion.identity); displayGO.transform.position = displayPos; if (targetGO != null) { Destroy(targetGO); // NOT IDEAL } targetGO = Instantiate(Resources.Load("PredatorPrey/PreyPrefab")) as GameObject; targetAgent = targetGO.AddComponent <Agent>(); targetAgent.humanControlled = false; StartPositionGenome targetStartPos = new StartPositionGenome(targetPos, Quaternion.identity); targetGO.transform.position = targetPos; // Hook-Ups PLAYER: displayAgent.isVisible = true; displayAgent.InitializeAgentFromTemplate(agentGenomeList[0], displayStartPos); // creates TestModule // Hook-Ups TARGET: targetAgent.isVisible = true; targetAgent.InitializeAgentFromTemplate(newGenome, targetStartPos); // creates TestModule // hook modules PLAYER: displayAgent.testModule.ownRigidBody2D = displayGO.GetComponent <Rigidbody2D>(); displayAgent.testModule.bias[0] = 1f; displayAgent.testModule.enemyTestModule = targetAgent.testModule; // self as target, to zero out targetvel // hook modules TARGET: targetAgent.testModule.ownRigidBody2D = targetGO.GetComponent <Rigidbody2D>(); targetAgent.testModule.bias[0] = 1f; targetAgent.testModule.enemyTestModule = displayAgent.testModule; // self as target, to zero out targetvel /* * // Spawn Player & Target Randomly * float randomAngle = UnityEngine.Random.Range(-Mathf.PI, Mathf.PI); * float randomRadius = UnityEngine.Random.Range(minSpawnRadius, maxSpawnRadius); * Vector3 playerPos = new Vector3(Mathf.Cos(randomAngle) * randomRadius, Mathf.Sin(randomAngle) * randomRadius, 0f); * Vector3 targetPos = new Vector3(Mathf.Cos(randomAngle + Mathf.PI) * randomRadius, Mathf.Sin(randomAngle + Mathf.PI) * randomRadius, 0f); * targetGO.transform.position = targetPos; * * displayStartPos = new StartPositionGenome(playerPos, Quaternion.identity); * GameObject agentGO; * if (displayAgent == null) { * agentGO = GameObject.CreatePrimitive(PrimitiveType.Sphere); * displayAgent = agentGO.AddComponent<Agent>(); * } * else { * agentGO = displayAgent.gameObject; * } * //displayAgent * agentGO.name = "Guinea Pig"; * agentGO.transform.parent = gameObject.transform; * agentGO.transform.localPosition = displayStartPos.agentStartPosition; * agentGO.transform.localRotation = displayStartPos.agentStartRotation; * //agentGO.GetComponent<Collider>().enabled = false; * displayAgent.isVisible = true; * displayAgent.InitializeAgentFromTemplate(agentGenomeList[0], displayStartPos); * // hook modules: * displayAgent.testModule.enemyTransform = targetGO.transform; * displayAgent.testModule.bias[0] = 1f; * displayAgent.testModule.enemyTestModule = displayAgent.testModule; */ }
public void StartNewDataCollectionRound() { curTimeStep = 0; imitationUI.TogglePause(); // Spawn Player & Target Randomly float randomAngle = UnityEngine.Random.Range(-Mathf.PI, Mathf.PI); float randomRadius = UnityEngine.Random.Range(minSpawnRadius, maxSpawnRadius); Vector3 playerPos = new Vector3(Mathf.Cos(randomAngle) * randomRadius, Mathf.Sin(randomAngle) * randomRadius, 0f); Vector3 targetPos = new Vector3(Mathf.Cos(randomAngle + Mathf.PI) * randomRadius, Mathf.Sin(randomAngle + Mathf.PI) * randomRadius, 0f); BodyGenome templateBodyGenome = new BodyGenome(); templateBodyGenome.InitializeGenomeAsDefault(); AgentGenome newGenome = new AgentGenome(-1); newGenome.InitializeBodyGenomeFromTemplate(templateBodyGenome); newGenome.InitializeRandomBrainFromCurrentBody(0.0f); if (playerGO == null) { //ResetTrainingForNewGen(); // Create Visible Display Agent to observe behavior //displayStartPos = new StartPositionGenome(Vector3.zero, Quaternion.identity); //playerGO.transform.localPosition = displayStartPos.agentStartPosition; //playerGO.transform.localRotation = displayStartPos.agentStartRotation; } else { //playerGO.transform.position = playerPos; Destroy(playerGO); // NOT IDEAL } // Instantiate Player (Predator) Human-Controlled: playerGO = Instantiate(Resources.Load("PredatorPrey/PredatorPrefab")) as GameObject; playerAgent = playerGO.AddComponent <Agent>(); playerAgent.humanControlled = true; StartPositionGenome playerStartPos = new StartPositionGenome(playerPos, Quaternion.identity); playerGO.transform.position = playerPos; if (targetGO == null) { //targetGO = Instantiate(Resources.Load("PredatorPrey/PreyPrefab")) as GameObject; //targetGO.transform.position = targetPos; } else { //targetGO.transform.position = targetPos; Destroy(targetGO); // NOT IDEAL } targetGO = Instantiate(Resources.Load("PredatorPrey/PreyPrefab")) as GameObject; targetAgent = targetGO.AddComponent <Agent>(); targetAgent.humanControlled = false; StartPositionGenome targetStartPos = new StartPositionGenome(targetPos, Quaternion.identity); targetGO.transform.position = targetPos; // Hook-Ups PLAYER: playerAgent.isVisible = true; playerAgent.InitializeAgentFromTemplate(newGenome, playerStartPos); // creates TestModule // Hook-Ups TARGET: targetAgent.isVisible = true; targetAgent.InitializeAgentFromTemplate(newGenome, targetStartPos); // creates TestModule // hook modules PLAYER: playerAgent.testModule.ownRigidBody2D = playerGO.GetComponent <Rigidbody2D>(); playerAgent.testModule.bias[0] = 1f; playerAgent.testModule.enemyTestModule = targetAgent.testModule; // self as target, to zero out targetvel // hook modules TARGET: targetAgent.testModule.ownRigidBody2D = targetGO.GetComponent <Rigidbody2D>(); targetAgent.testModule.bias[0] = 1f; targetAgent.testModule.enemyTestModule = playerAgent.testModule; // self as target, to zero out targetvel }