我需要让用户通过在屏幕上选择两个简单的选项来选择自己的路径,以便继续到下一组选择,直到他们到达其中一个结局。例如,应该实现类似这样的功能:
我尝试了以下代码,但每次只评估左侧。我想知道如何实现如上图所示的结果(覆盖所有分支)?例如,如果用户选择“否”,应用程序不应再向用户提问,只需简单地显示“也许你想吃披萨”的消息。我已经使用决策树算法完成了这个任务,现在需要修复它,以便它像上图一样覆盖左右两侧。
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
包含一个sentence
来evaluate
,它可以是query
或result
。
对于result
,evaluate
显示sentence
。
对于query
,evaluate
方法要求用户通过是
或否
回答问题。并使用这个答案,调用下一个子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) { }}