Как реализовать дерево решений с помощью С# (visual studio 2008) - Справка
У меня есть дерево решений, которое мне нужно перевести на код в С#
Простой способ сделать это - использовать инструкции if-else, но в этом решении мне нужно будет создать 4-5 вложенных условий.
Я ищу лучший способ сделать это, и до сих пор я немного читал о механизмах правил.
Есть ли у вас что-то еще, чтобы предложить эффективный способ разработки дерева решений с 4-5 вложенными условиями?
Ответы
Ответ 1
Я реализовал простое дерево решений в качестве образца в моей книге. Код доступен онлайн здесь, поэтому, возможно, вы можете использовать его как вдохновение. Решение по существу представлено как класс, имеющий ссылки на ветвь true
branch и 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
Просто потому, что...
Я пошел на это, и результаты здесь...
https://github.com/jkennerley/DeeTree
Ответ 3
Ниже приведен код Tomas Petricek, упомянутый в ответе fooobar.com/info/427477/....
Почтовый индекс, содержащий весь исходный код книги "Функциональное программирование реального мира", можно найти здесь 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();
}