public void Mutate(GPNode root, int index1, int maxLevels) { //We dont want to crossover root if (index1 == 1) { throw new Exception("Wrong index number for Mutate operation!"); } //start counter from 0 int count = 0; //Collection holds tree nodes Queue <Tuple <int, GPNode> > dataTree = new Queue <Tuple <int, GPNode> >(); //current node Tuple <int, GPNode> tuplenode = null; //Add tail recursion dataTree.Enqueue(new Tuple <int, GPNode>(0, root)); while (dataTree.Count > 0) { //get next node tuplenode = dataTree.Dequeue(); //count node count++; //perform mutation if (count == index1) { int level = maxLevels - tuplenode.Item1; if (level < 0) { throw new Exception("Level is not a correct number!"); } int rnd = Globals.radn.Next(level + 1); if (level <= 1 || rnd == 0) { tuplenode.Item2.value = Globals.GenerateNodeValue(false); GPNode.DestroyNodes(tuplenode.Item2.children); tuplenode.Item2.children = null; } else { var node = GenerateTreeStructure(rnd); tuplenode.Item2.value = node.value; tuplenode.Item2.children = node.children; } break; } if (tuplenode.Item2.children != null) { for (int i = tuplenode.Item2.children.Length - 1; i >= 0; i--) { dataTree.Enqueue(new Tuple <int, GPNode>(tuplenode.Item1 + 1, tuplenode.Item2.children[i])); } } } }