Ejemplo n.º 1
0
        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]));
                    }
                }
            }
        }