public static List <ShipChromosomeNode> TreeCrossover(List <ShipChromosomeNode> selectionList) { List <ShipChromosomeNode> outputPopulation = new List <ShipChromosomeNode>(); while (selectionList.Count >= 2) { //SELECT TWO PARENTS AT RANDOM ShipChromosomeNode p1 = selectRandomElement(selectionList, true); ShipChromosomeNode p2 = selectRandomElement(selectionList, true); //if (p1 == p2) // Debug.LogError("SAME PARENTS"); //Debug.Log("P1: \n" + p1.getString() + "\n"); //Debug.Log("P2: \n" + p2.getString() + "\n"); //RETRIEVE A LIST OF THEIR NODES List <ShipChromosomeNode> p1Nodes = p1.getListOfNodes(); List <ShipChromosomeNode> p2Nodes = p2.getListOfNodes(); //SELECT ONE AT RANDOM FROM EACH PARENT ShipChromosomeNode p1CutNode = selectRandomElement(p1Nodes, false); ShipChromosomeNode p2CutNode = selectRandomElement(p2Nodes, false); //Debug.Log("P1 cut point: \n" + p1CutNode.getString() + "\n"); //Debug.Log("P2 cut point: \n" + p2CutNode.getString() + "\n"); //ADD THE OFFSPRING CREATED TO THE OUTPUT POPULATION outputPopulation.Add(createOffspring(p1, p1CutNode, p2CutNode)); outputPopulation.Add(createOffspring(p2, p2CutNode, p1CutNode)); } return(outputPopulation); }
public void generatePhysicalShip(ShipChromosomeNode root) { GameObject g = (GameObject)GameObject.Instantiate(Resources.Load(Config.HEAVY_BLOCK_PREFAB_LOCATION), Vector3.zero, Quaternion.identity); Rigidbody r = g.AddComponent <Rigidbody>(); r.mass = Config.BLOCK_MASS * root.getListOfNodes().Count; r.drag = Config.BLOCK_DRAG; r.angularDrag = Config.BLOCK_ANGULAR_DRAG; //r.constraints = RigidbodyConstraints.FreezeAll; r.constraints = RigidbodyConstraints.FreezeRotationX | RigidbodyConstraints.FreezeRotationY | RigidbodyConstraints.FreezePositionZ; BlockScript b = g.GetComponent <BlockScript>(); ShipController s = g.AddComponent <ShipController>(); s.rootNode = root; s.setOrbs(orbsRoot); lastShip = s; b.initialize(root, s); b.combineSubMeshes(); g.transform.position = transform.position; g.SetActive(false); }
public List <ShipChromosomeNode> getListOfNodes() { List <ShipChromosomeNode> allNodes = new List <ShipChromosomeNode>(); allNodes.Add(this); if (top != null && parentPos != ChildNode.TOP) { allNodes.AddRange(top.getListOfNodes()); } if (bottom != null && parentPos != ChildNode.BOTTOM) { allNodes.AddRange(bottom.getListOfNodes()); } if (left != null && parentPos != ChildNode.LEFT) { allNodes.AddRange(left.getListOfNodes()); } if (right != null && parentPos != ChildNode.RIGHT) { allNodes.AddRange(right.getListOfNodes()); } return(allNodes); }