Как реализовать дерево решений с помощью C # (Visual Studio 2008) - Помощь - PullRequest
16 голосов
/ 08 октября 2010

У меня есть дерево решений, которое мне нужно обратиться к коду в C #

Простой способ сделать это - использовать операторы if-else, но в этом решении мне нужно будет создать 4-5 вложенных условий.

Я ищу лучший способ сделать это, и пока я немного читаю о механизмах правил.

Есть ли у вас что-то еще, чтобы предложить эффективный способ разработки дерева решений с 4-5 вложенными условиями?

Ответы [ 4 ]

22 голосов
/ 08 октября 2010

Я реализовал простое дерево решений в качестве примера в своей книге. Код доступен онлайн здесь , так что, возможно, вы могли бы использовать его в качестве вдохновения. Решение по существу представляется как класс, который имеет ссылки на ветку true и ветку false и содержит функцию, выполняющую тест:

class DecisionQuery : Decision {
  public Decision Positive { get; set; }
  public Decision Negative { get; set; }
  // Primitive operation to be provided by the user
  public Func<Client, bool> Test { get; set; }

  public override bool Evaluate(Client client) {
    // Test a client using the primitive operation
    bool res = Test(client);
    // Select a branch to follow
    return res ? Positive.Evaluate(client) : Negative.Evaluate(client);
  }
}

Здесь Decision - это базовый класс, содержащий метод Evaluate, а источник содержит один дополнительный производный тип, который содержит окончательное решение дерева (да / нет). Тип Client представляет собой пример входных данных, которые вы анализируете с помощью дерева.

Чтобы создать дерево решений, вы можете написать что-то вроде:

var tree = new DecisionQuery {
    Test = (client) => client.Income > 40000,
    Positive = otherTree,
    Negative = someOtherTree
  };

Если вы просто хотите написать пять вложенных статических предложений if, тогда, возможно, просто написать if хорошо. Преимущество использования такого типа, как этот, состоит в том, что вы можете легко составлять деревья - например, повторно использовать часть дерева или модульную конструкцию.

2 голосов
/ 17 августа 2016

Ниже приведен код Томаса Петричека, упомянутый в ответе https://stackoverflow.com/a/3889544/5288052.

Почтовый индекс, содержащий весь исходный код книги "Функциональное программирование в реальном мире", доступен здесь https://www.manning.com/books/real-world-functional-programming.

// Section 8.4.2 Decision trees in C#

// Listing 8.15 Object oriented decision tree (C#)

abstract class Decision {
  // Tests the given client 
  public abstract void Evaluate(Client client);
}

class DecisionResult : Decision {
  public bool Result { get; set; }
  public override void Evaluate(Client client) {
    // Print the final result
    Console.WriteLine("OFFER A LOAN: {0}", Result ? "YES" : "NO");
  }
}


// Listing 8.16 Simplified implementation of Template method
class DecisionQuery : Decision {
  public string Title { get; set; }
  public Decision Positive { get; set; }
  public Decision Negative { get; set; }
  // Primitive operation to be provided by the user
  public Func<Client, bool> Test { get; set; }

  public override void Evaluate(Client client) {
    // Test a client using the primitive operation
    bool res = Test(client);
    Console.WriteLine("  - {0}? {1}", Title, res ? "yes" : "no");
    // Select a branch to follow
    if (res) Positive.Evaluate(client);
    else Negative.Evaluate(client);
  }
}

static void MainDecisionTrees()
{
  // The tree is constructed from a query
  var tree =
      new DecisionQuery
      {
        Title = "More than $40k",
        // Test is specified using a lambda function
        Test = (client) => client.Income > 40000,
        // Sub-trees can be 'DecisionResult' or 'DecisionQuery'
        Positive = new DecisionResult { Result = true },
        Negative = new DecisionResult { Result = false }
      };

  // Test a client using this tree
  // Create client using object initializer
  var john = new Client {
      Name = "John Doe", Income = 40000, YearsInJob = 1,
      UsesCreditCard = true, CriminalRecord = false 
    };
  tree.Evaluate(john);
}

private static void Main(string[] args)
{
  MainDecisionTrees();
}
1 голос
/ 28 марта 2014

Просто потому что ... Я попробовал это, и результаты здесь ... https://github.com/jkennerley/DeeTree

0 голосов
/ 25 апреля 2018

Мне пришлось реализовать дерево решений с использованием алгоритма ID3 во время моего обучения в C #.

Я написал о своей реализации здесь . Код можно скачать с GitHub .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...