void generateRun(string testArea) { float currentSpawnLocation = initialSpawnLocation; float bufferSpace = 30; float height = 10; // float runTime = 10; GameObject controller = GameObject.Find("Controller"); Architect archy = (Architect)controller.GetComponent(typeof(Architect)); for (int i = 0; i < unitsPerRun; i++) { bluePrint robot = currentPopulation [iteration]; GameObject instance1 = (GameObject)Instantiate(Resources.Load("Terrain/" + testArea)); terrainInScene [objectCount] = instance1; currentSpawnLocation += instance1.collider.bounds.size.y + bufferSpace; instance1.transform.position = new Vector3(0, currentSpawnLocation, 0); robot.instantiation = (GameObject)archy.generateRobot(robot, new Vector3((instance1.transform.position.x), currentSpawnLocation + height, instance1.transform.position.z)); robot.startLocation = robot.trackerObject.transform.position.x; robotsInScene [objectCount] = robot; objectCount++; iteration++; } MeshRenderer[] renderObjects = FindObjectsOfType(typeof(MeshRenderer)) as MeshRenderer[]; if (disableRender) { foreach (MeshRenderer a in renderObjects) { a.enabled = false; } } objectCount = 0; }
bluePrint[] mergeSort(bluePrint[] a) { if (a.Length <= 1) { return(a); } int middle = a.Length / 2; bluePrint[] left = new bluePrint[middle]; bluePrint[] right = new bluePrint[a.Length - middle]; for (int i = 0, j = 0; i < a.Length; i++) { if (i < middle) { left [i] = a [i]; } else { right [j] = a [i]; j++; } } left = mergeSort(left); right = mergeSort(right); return(merge(left, right)); }
bluePrint[] breed(bluePrint a, bluePrint b) { // Debug.Log ("breed call"); bluePrint[] children = new bluePrint[2]; String [] aChroms = a.chromosomes; String [] bChroms = b.chromosomes; int chromA = UnityEngine.Random.Range(0, numberOfUnits); int chromB = UnityEngine.Random.Range(0, numberOfUnits); String[] newChromsA = swapChrom(aChroms, bChroms, chromA, chromB); //Debug.Log ("swappin B:"); String[] newChromsB = swapChrom(bChroms, aChroms, chromB, chromA); children [0] = new bluePrint("blank", newChromsA); children [1] = new bluePrint("blank", newChromsB); //children [0] = new bluePrint ("blank", a.chromosomes); //children [1] = new bluePrint ("blank", b.chromosomes); // } return(children); }
void generateInitialPopulation() { // int initialStrutID = 1000; // Use this for initialization // int identityStrut = initialStrutID; // int currentStrut; for (int i = 0; i < populationSize; i++) { bluePrint robot; string[] chromosomes = new string[numberOfUnits - 1]; string ID = "B" + i; //sr.WriteLine (ID); // string[] IDList = new string[numberOfUnits]; // int originID = 5000; robot = new bluePrint(ID); int originUnitType = UnityEngine.Random.Range(0, maxValueOfUnit + 1); functionalUnit origin = new functionalUnit("5000", new point3(0, 0, 0)); robot.unitArray.Add(origin); for (int j = 0; j < numberOfUnits - 1; j++) { int id = 5001 + j; int side = UnityEngine.Random.Range(0, 6); int connectObject = 5000 + UnityEngine.Random.Range(0, j + 1); functionalUnit con = robot.getUnit("" + connectObject); point3 newPoint = translatePoint(con.location, side); while (robot.unitAreaOccupied(newPoint)) { side = UnityEngine.Random.Range(0, 6); connectObject = 5000 + UnityEngine.Random.Range(0, j + 1); con = robot.getUnit("" + connectObject); newPoint = translatePoint(con.location, side); } robot.unitArray.Add(new functionalUnit("" + id, newPoint)); int unitType = UnityEngine.Random.Range(0, maxValueOfUnit + 1); string chromosome = connectObject + "," + id + "," + originUnitType + "," + unitType + "," + side; chromosomes [j] = chromosome; } robot.chromosomes = chromosomes; currentPopulation [i] = robot; } }
bluePrint[] merge(bluePrint[] left, bluePrint[] right) { bluePrint [] result = new bluePrint[left.Length + right.Length]; int leftPointer = 0, rightPointer = 0, returnPointer = 0; while (leftPointer < left.Length || rightPointer < right.Length) { if (leftPointer < left.Length && rightPointer < right.Length) { if (left [leftPointer].score <= right [rightPointer].score) { result [returnPointer] = left [leftPointer]; returnPointer++; leftPointer++; } else { result [returnPointer] = right [rightPointer]; returnPointer++; rightPointer++; } } else if (leftPointer < left.Length) { result [returnPointer] = left [leftPointer]; returnPointer++; leftPointer++; } else if (rightPointer < right.Length) { result [returnPointer] = right [rightPointer]; returnPointer++; rightPointer++; } } return(result); }
bluePrint [] crossOver(bluePrint[] leaders) { //Debug.Log ("crossover call"); ArrayList combinations = new ArrayList(); bluePrint[] children = new bluePrint[populationSize]; int i = 0; int topleaders = (int)(populationSize * 0.01); float leaderVal = leaders [populationSize - 1].score; bluePrint parent1 = null, parent2 = null; bool parent1Selected = false, parent2Selected = false; for (int leads = populationSize - 1; leads > populationSize - topleaders - 1; leads--) { children[i] = leaders[leads]; i++; } //int count = 0; while (i < populationSize) { while (!parent1Selected || !parent2Selected) { float selectionChance = UnityEngine.Random.Range(0.0f, 1.0f); int selectedBot = UnityEngine.Random.Range(0, populationSize); // float normalVal = leaders [selectedBot].score / leaderVal; //count++; if (leaders [selectedBot].normalScore > selectionChance) { // if(parent1Selected){ // // foreach(string a in combinations){ // // if(a.Equals(parent1.ID + leaders[selectedBot])){ // // duplicate = true; // } // // // // } //} if (!parent1Selected) { parent1 = leaders [selectedBot]; //leaders[selectedBot].score = -100; parent1Selected = true; } else if (!combinations.Contains(parent1.ID + leaders [selectedBot].ID) && !parent1.ID.Equals(leaders [selectedBot].ID)) { parent2 = leaders [selectedBot]; //leaders[selectedBot].score = -100; parent2Selected = true; // Debug.Log(parent1.ID + parent2.ID); // Debug.Log(parent2.ID + parent1.ID); combinations.Add(parent1.ID + parent2.ID); combinations.Add(parent2.ID + parent1.ID); //Debug.Log("p1 " + parent1.chromosomes[0]); //Debug.Log("p2 " + parent2.chromosomes[0]); // Debug.Log("it took me: " + count + " tries to find the parents"); // count = 0; bluePrint[] newbies = breed(parent1, parent2); //Debug.Log(newbies.Length); for (int j = 0; j < newbies.Length && i < populationSize; j++) { // Debug.Log("newbiechrom: " +newbies[j].chromosomes[0]); children [i] = newbies [j]; children [i].ID = "B" + i + "G" + currentGeneration; i++; } } else { //Debug.Log ("parent combination already exists or same parents were selected"); } } } parent1Selected = false; parent2Selected = false; } // Debug.Log ("howmanychildren:" + i); return(children); }
public GameObject generateRobot(bluePrint currentBP, Vector3 spawnLocation) { string line; GameObject previousInstance = null; GameObject instance1 = null; GameObject instance2 = null; int[] instructions = new int[4]; String BUID; GameObject parent = null; //Debug.Log ("crhoms and sl" + currentBP.chromosomes [0]); BUID = currentBP.ID; FUArray = new List <GameObject> (); previousInstance = null; parent = (GameObject)Instantiate(Resources.Load("parentObject")); parent.tag = "Empty"; parent.transform.name = BUID; for (int chromosome = 0; chromosome < currentBP.chromosomes.Length; chromosome++) { line = currentBP.chromosomes [chromosome]; if (line != null) { instructions = stringToIntArray(line); if (previousInstance == null) { instance1 = (GameObject)Instantiate(Resources.Load("FunctionalUnits/F" + instructions [2])); Transform[] children = new Transform[instance1.transform.childCount]; instance1.transform.position = spawnLocation; FUArray.Add(instance1); parent.transform.position = spawnLocation; instance1.transform.parent = parent.transform; instance1.transform.name = instructions [0].ToString(); int index = 0; foreach (Transform child in instance1.transform) { children [index++] = child; //Debug.Log(child); } currentBP.trackerObject = children [0]; } if (findUnit(instructions [1].ToString()) != null) { instance2 = findUnit(instructions [1].ToString()); Debug.Log("Unit already exists: " + instructions [1].ToString()); //affixStruts (instance1, instance2, instructions [4]); } else { instance1 = findUnit(instructions [0].ToString()); instance2 = (GameObject)Instantiate(Resources.Load("FunctionalUnits/F" + instructions [3])); instance2.transform.position = spawnLocation; instance2.transform.name = instructions [1].ToString(); FUArray.Add(instance2); placeNewUnit(instance1, instance2, instructions [4]); affixStruts(returnClosest(instance1.transform.root.gameObject, instance2) [0].gameObject, returnClosest(instance1.transform.root.gameObject, instance2) [1].gameObject); instance2.transform.parent = parent.transform; } previousInstance = instance1; } } //currentBP.instantiation = parent; return(parent); }
public bool generateRobots(bluePrint[] population) { string line; GameObject previousInstance = null; GameObject instance1 = null; GameObject instance2 = null; int[] instructions = new int[4]; String BUID; GameObject parent = null; for (int bluePrint = 0; bluePrint < population.Length; bluePrint++) { bluePrint currentBP = population [bluePrint]; BUID = currentBP.ID; spawnLocation = spawnLocation + new Vector3(10, 0, 0); FUArray = new List <GameObject> (); previousInstance = null; parent = (GameObject)Instantiate(Resources.Load("parentObject")); parent.transform.name = BUID; for (int chromosome = 0; chromosome < currentBP.chromosomes.Length; chromosome++) { line = currentBP.chromosomes [chromosome]; if (line != null) { instructions = stringToIntArray(line); if (previousInstance == null) { instance1 = (GameObject)Instantiate(Resources.Load("FunctionalUnits/F" + instructions [2])); instance1.transform.position = spawnLocation; FUArray.Add(instance1); parent.transform.position = instance1.transform.position; instance1.transform.parent = parent.transform; instance1.transform.name = instructions [0].ToString(); } if (findUnit(instructions [1].ToString()) != null) { instance2 = findUnit(instructions [1].ToString()); Debug.Log("Unit already exists"); //affixStruts (instance1, instance2, instructions [4]); } else { instance1 = findUnit(instructions [0].ToString()); instance2 = (GameObject)Instantiate(Resources.Load("FunctionalUnits/F" + instructions [3])); instance2.transform.position = spawnLocation; instance2.transform.name = instructions [1].ToString(); FUArray.Add(instance2); instance2.transform.parent = parent.transform; placeNewUnit(instance1, instance2, instructions [4]); affixStruts(returnClosest(instance1, instance2) [0].gameObject, returnClosest(instance1, instance2) [1].gameObject); } previousInstance = instance1; } } // createPrefab (parent); currentBP.instantiation = parent; } return(true); }