public DecisionTree MakeACopy() { var newDt = new DecisionTree(); newDt._node = _node.Clone(newDt); newDt._statistics = _statistics.MakeACopy(); return newDt; }
public static List<DecisionTree> CrossOver(DecisionTree dt1, DecisionTree dt2) { Debug.Assert(dt1 != dt2); Debug.Assert(CanBeCrossOvered(dt1,dt2)); DecisionTree t1 = dt1.MakeACopy(); Debug.Assert(t1.IsEqual(dt1)); DecisionTree t2 = dt2.MakeACopy(); Debug.Assert(t2.IsEqual(dt2)); var nodes1 = new List<Node>(); var nodes2 = new List<Node>(); t1._node.Add(nodes1); t2._node.Add(nodes2); var list = new List<DecisionTree>(); while (true) { int i1 = Randomizer.GetRandomInteger(nodes1.Count); int i2 = Randomizer.GetRandomInteger(nodes2.Count); Node n1 = nodes1[i1]; Node n2 = nodes2[i2]; if (CanBeCrossOvered(n1, n2)) { int dt2Count = dt2.NumberOfNodes; Node parent1 = n1.Parent; Node parent2 = n2.Parent; parent1.SubstituteChild(n1, n2); parent2.SubstituteChild(n2, n1); list.Add(t1); list.Add(t2); break; } } return list; }