Skip to content

Latest commit

 

History

History
156 lines (138 loc) · 3.77 KB

README.md

File metadata and controls

156 lines (138 loc) · 3.77 KB

Decision trees

The purpose of this solution is to get the sum of all the decision tree results.

Input:
  - 1000 Decimal variables: VAR_0 ... VAR_999
  - 50 Decision trees
    * Multilevel
    * Each level has a condition based on a variable
        Example:
          * VAR_56 < 0.5
          * VAR_475 > 544 and VAR_475 < 892
    * The result of a decision tree is a decimal number
        Example: 0.2319949
      
Output:
  - SCORE = Sum of the decision tree results

Solution:

public abstract class Decision
{
    public abstract decimal Decide(decimal[] input);
}
public class Node : Decision
{
    public Decision Affirmative { get; set; }
    public Decision Negative { get; set; }
    public Func<decimal[], bool> Condition { get; set; }

    public override decimal Decide(decimal[] input)
    {
        return Condition(input)
            ? Affirmative.Decide(input)
            : Negative.Decide(input);
    }
}
public class Leaf : Decision
{
    public decimal Result { get; set; }

    public override decimal Decide(decimal[] input)
    {
        return Result;
    }
}
/// <summary>
/// Define a set of multilevel trees for testing
/// Where each level has a condition based on a variable
/// </summary>
public static class Forest
{
    public static Node TreeA()
    {
        Node nodeC = new Node
        {
            Condition = (values) => values[0] > 0.5M,
            Affirmative = new Leaf { Result = 1.2M },
            Negative = new Leaf { Result = 0.4M }
        };

        Node nodeB = new Node
        {
            Condition = (values) => values[4] > 1.0M || values[4] == 0.8M,
            Affirmative = nodeC,
            Negative = new Leaf { Result = 2.2M }
        };

        Node nodeA = new Node
        {
            Condition = (values) => values[1] == 0.2M || values[1] > 0.5M,
            Affirmative = new Leaf { Result = 1.3M },
            Negative = nodeB
        };

        return nodeA;
    }

    public static Node TreeB()
    {
        Node nodeC = new Node
        {
            Condition = (values) => values[1] > 0.1M || values[1] == 0.0M,
            Affirmative = new Leaf { Result = 0.6M },
            Negative = new Leaf { Result = 2.4M }
        };

        Node nodeB = new Node
        {
            Condition = (values) => values[3] > 0.4M,
            Affirmative = new Leaf { Result = 0.7M },
            Negative = nodeC
        };

        Node nodeA = new Node
        {
            Condition = (values) => values[4] < 0.3M || values[4] > 0.7M,
            Affirmative = nodeB,
            Negative = new Leaf { Result = 1.5M }
        };

        return nodeA;
    }
}
public class Tree
{
    public Tree(Node root, decimal[] values)
    {
        Root = root;
        Values = values;
    }

    public Node Root { get; set; }
    public decimal[] Values { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        decimal result = 0;
        Node rootA = Forest.TreeA();
        Node rootB = Forest.TreeB();
        List<Tree> trees = new List<Tree>();

        // 1000 decimal variables, VAR_0 ... VAR_999
        decimal[] inputA = { 1.1M, 0.5M, 2.0M, 0.3M, 0.2M };
        decimal[] inputB = { 0.4M, 0.2M, 3.5M, 1.0M, 0.5M };

        // 50 decision trees
        trees.Add(new Tree(rootA, inputA));
        trees.Add(new Tree(rootA, inputB));
        trees.Add(new Tree(rootB, inputA));
        trees.Add(new Tree(rootB, inputB));

        foreach (Tree tree in trees)
        {
            // The result of a decision tree is a decimal number
            result += tree.Root.Decide(tree.Values);
        }

        // Sum of the decision tree results
        Console.WriteLine(result);
        Console.ReadKey();
    }
}