public static Unit.Renderer DevelopTopology(Tree.RootNode tree) { var man = new DevelopManager(); man.tree = tree; tree.Target = man.firstPoint; foreach (var item in tree.ToBreadthFirstList()) { item.Process(); } man.render.InitAll(); return(man.render); }
/// <summary> /// 自分自身を他個体と交叉させる /// </summary> /// <param name="another"></param> /// <returns>交叉が行えなかったらfalse</returns> public bool CrossOver(RootNode another, Random rand) { another = another.CloneTree(); var target = GetRandomChildWithoutConstant(rand, false); var type = target.NodeType & SynthTree.NodeType.Mask; var candidate = another.ToBreadthFirstList() .Where(x => (type & x.NodeType) == type).ToArray(); if (!candidate.Any()) { return(false); } var t2 = candidate[rand.Next(candidate.Length)]; var t2p = t2.Parent; target.Parent.ChangeChild(target, t2); t2p.ChangeChild(t2, target); SetIndex(); return(true); }
IEnumerable <Tree.Constant> GetActiveConstants(Tree.RootNode tree) { return(tree.ToBreadthFirstList().OfType <Tree.Constant>().Where(x => x.Parent.IsUsed())); }