如何在C#中实现交互式决策树

我需要让用户通过在屏幕上选择两个简单的选项来选择自己的路径,以便继续到下一组选择,直到他们到达其中一个结局。例如,应该实现类似这样的功能:

enter image description here

我尝试了以下代码,但每次只评估左侧。我想知道如何实现如上图所示的结果(覆盖所有分支)?例如,如果用户选择“否”,应用程序不应再向用户提问,只需简单地显示“也许你想吃披萨”的消息。我已经使用决策树算法完成了这个任务,现在需要修复它,以便它像上图一样覆盖左右两侧。

namespace ConsoleApp3{    class Program    {        static void Main(string[] args)        {            var decisionTree = MainDecisionTree();            var client = new Client();            Console.WriteLine("你想要一本书吗?真/假");            client.Answer[0] = bool.Parse(Console.ReadLine());            Console.WriteLine("你喜欢它吗?真/假");            client.Answer[1] = bool.Parse(Console.ReadLine());            Console.WriteLine("你确定吗?真/假");            client.Answer[2] = bool.Parse(Console.ReadLine());            decisionTree.Evaluate(client);            Console.WriteLine("按任意键...");            Console.ReadKey();        }        private static DecisionQuery MainDecisionTree()        {            //决策2            var wantBranch = new DecisionQuery            {                Title = "你想要一本书吗?",                Test = (client) => client.Answer[0],                Positive = new DecisionResult { Result = true },                Negative = new DecisionResult { Result = false }            };            //决策1            var deserveBranch = new DecisionQuery            {                Title = "你喜欢它吗?",                Test = (client) => client.Answer[1],                Positive = wantBranch,                Negative = new DecisionResult { Result = false }            };            //决策0            var sureBranch = new DecisionQuery            {                Title = "你确定吗?",                Test = (client) => client.Answer[2],                Positive = deserveBranch,                Negative = new DecisionResult { Result = false }            };            return sureBranch;        }    }    public class DecisionResult : Decision    {        public bool Result { get; set; }        public override void Evaluate(Client client)        {            Console.WriteLine("\r\n结果: {0}", Result ? "买它" : "你需要等待");        }    }    public class DecisionQuery : Decision    {        public string Title { get; set; }        public Decision Positive { get; set; }        public Decision Negative { get; set; }        public Func<Client, bool> Test { get; set; }        public override void Evaluate(Client client)        {            bool result = this.Test(client);            string resultAsString = result ? "是" : "否";            Console.WriteLine($"\t- {this.Title}? {resultAsString}");            if (result) this.Positive.Evaluate(client);            else this.Negative.Evaluate(client);        }    }    public abstract class Decision    {        public abstract void Evaluate(Client client);    }    public class Client    {        public bool[] Answer { get; set; } = new bool[3];    }}

回答:

如果我理解你的问题,这里是你的代码的修正版。

我重命名了一些东西。

我将初始化专家系统的条件树并返回根条件的方法命名为MakeDecisionTree

每个condition包含一个sentenceevaluate,它可以是queryresult

对于resultevaluate显示sentence

对于queryevaluate方法要求用户通过回答问题。并使用这个答案,调用下一个子condition的相应evaluate

对不起我的英语在这里不是我的母语,我也不涉及AI领域。

static private void DecisionTreeTest(){  Console.WriteLine("请用是或否回答几个问题。");  Console.WriteLine();  MakeDecisionTree().Evaluate();}
static private bool GetUserAnswer(string question){  Console.WriteLine(question);  string userInput;  while ( true )  {    userInput = Console.ReadLine().ToLower();    if ( userInput == "是" )      return true;    else    if ( userInput == "否" )      return false;    else      Console.WriteLine("你的回答不被支持,请重试。" +                        Environment.NewLine + Environment.NewLine +                        question);  }}
static private DecisionTreeQuery MakeDecisionTree(){  var queryAreYouSure    = new DecisionTreeQuery("你确定吗?",                            new DecisionTreeResult("买它。"),                            new DecisionTreeResult("你需要等待。"),                            GetUserAnswer);  var queryIsItAGoodBook    = new DecisionTreeQuery("这是一本好书吗?",                            new DecisionTreeResult("你在等什么?赶紧买它。"),                            new DecisionTreeResult("找另一本。"),                            GetUserAnswer);  var queryDoYouLikeIt    = new DecisionTreeQuery("你喜欢它吗?",                            queryAreYouSure,                            queryIsItAGoodBook,                            GetUserAnswer);  var queryDoYouWantABook    = new DecisionTreeQuery("你想要一本书吗?",                            queryDoYouLikeIt,                            new DecisionTreeResult("也许你想吃披萨。"),                            GetUserAnswer);  return queryDoYouWantABook;}
abstract public class DecisionTreeCondition{  protected string Sentence { get; private set; }  abstract public void Evaluate();  public DecisionTreeCondition(string sentence)  {    Sentence = sentence;  }}
public class DecisionTreeQuery : DecisionTreeCondition{  private DecisionTreeCondition Positive;  private DecisionTreeCondition Negative;  private Func<string, bool> UserAnswerProvider;  public override void Evaluate()  {    if ( UserAnswerProvider(Sentence) )      Positive.Evaluate();    else      Negative.Evaluate();  }  public DecisionTreeQuery(string sentence,                           DecisionTreeCondition positive,                           DecisionTreeCondition negative,                           Func<string, bool> userAnswerProvider)    : base(sentence)  {    Positive = positive;    Negative = negative;    UserAnswerProvider = userAnswerProvider;  }}
public class DecisionTreeResult : DecisionTreeCondition{  public override void Evaluate()  {    Console.WriteLine(Sentence);  }  public DecisionTreeResult(string sentence)    : base(sentence)  {  }}

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注