/// <summary> /// Spawn an ant colony in the specified world quadrant. Default split of the world into 1/4 sections /// </summary> /// <param name="worldQuadrant"></param> public Colony(short worldQuadrant, Colony singleParent) { colony = new List <GameObject>(); colonyId = worldQuadrant; this.spawnColony(ConfigurationManager.Instance.spawnRadius, singleParent); }
public void setColony(Colony c) { this.colony = c; }
/// <summary> /// Create a new colony based off a single parent for now. /// /// Mutate each nervous system by the proper probabilities before passing it on. /// </summary> /// <param name="spawnRadius"></param> /// <param name="singleParent"></param> /// <param name="randomChoice"></param> public void spawnColony(int spawnRadius, Colony singleParent, bool randomChoice = false) { int l = ConfigurationManager.Instance.Chunk_Diameter * ConfigurationManager.Instance.World_Diameter; Vector2Int c; // Choose a center location in this colony if (randomChoice) { c = new Vector2Int(UnityEngine.Random.Range(spawnRadius / 2, l / 2 - spawnRadius / 2), UnityEngine.Random.Range(spawnRadius / 2, l / 2 - spawnRadius / 2)); } else { c = new Vector2Int(l / 4, l / 4); if (colonyId == 1) { c.y += l / 2; } else if (colonyId == 2) { c.y += l / 2; c.x += l / 2; } else if (colonyId == 3) { c.x += l / 2; } } // Spawn all ants for (int i = 0; i < ConfigurationManager.Instance.antsPerColony; i++) { NervousSystem newNS; if (singleParent.bestAnt == null) { newNS = new NervousSystem(singleParent.colony[i].GetComponent <Ant>().getNervousSystem().nodes, singleParent.colony[i].GetComponent <Ant>().getNervousSystem().connections); } else { newNS = new NervousSystem(singleParent.bestAnt.GetComponent <Ant>().getNervousSystem().nodes, singleParent.bestAnt.GetComponent <Ant>().getNervousSystem().connections); } for (int k = 0; k < UnityEngine.Random.Range(1, 5); k++) { if (UnityEngine.Random.Range(0f, 1f) < ConfigurationManager.Instance.connectionMutationRate) { NeuroEvolution.MutateByConnection(newNS); } if (UnityEngine.Random.Range(0f, 1f) < ConfigurationManager.Instance.nodeMutationRate) { NeuroEvolution.MutateByConnection(newNS); } } spawnAnt(c, spawnRadius, newNS, false); } NervousSystem newNSqueen = new NervousSystem(singleParent.queen.GetComponent <Ant>().getNervousSystem().nodes, singleParent.queen.GetComponent <Ant>().getNervousSystem().connections); for (int k = 0; k < UnityEngine.Random.Range(1, 5); k++) { // Spawning the queen if (UnityEngine.Random.Range(0f, 1f) < ConfigurationManager.Instance.connectionMutationRate) { NeuroEvolution.MutateByConnection(newNSqueen); } if (UnityEngine.Random.Range(0f, 1f) < ConfigurationManager.Instance.nodeMutationRate) { NeuroEvolution.MutateByNode(newNSqueen); } } spawnAnt(c, spawnRadius, newNSqueen, true); }