gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:51:01 27 4
gpt4 key购买 nike

我需要允许用户通过在屏幕上显示的两个简单选项之间进行选择来选择自己的路径,以便继续进行下一组选择,直到他们到达其中一个结局,即应该实现这样的事情:

enter image description here

我试过下面的代码,但每次只评估左边。我想知道如何才能获得如上图(覆盖所有分支)的结果?例如,如果用户选择“否”,应用程序不应向用户询问任何进一步的问题,而只是简单地显示“也许你想要披萨”消息。我已经用决策树算法完成了这个并且需要修复它,以便它像上图一样覆盖左侧和右侧。

namespace ConsoleApp3
{
class Program
{
static void Main(string[] args)
{
var decisionTree = MainDecisionTree();

var client = new Client();

Console.WriteLine("Do you want a book? true/false");
client.Answer[0] = bool.Parse(Console.ReadLine());
Console.WriteLine("Do you like it? true/false");
client.Answer[1] = bool.Parse(Console.ReadLine());
Console.WriteLine("Are you sure? true/false");
client.Answer[2] = bool.Parse(Console.ReadLine());

decisionTree.Evaluate(client);

Console.WriteLine("Press any key...");
Console.ReadKey();
}

private static DecisionQuery MainDecisionTree()
{
//Decision 2
var wantBranch = new DecisionQuery
{
Title = "Do you want a book?",
Test = (client) => client.Answer[0],
Positive = new DecisionResult { Result = true },
Negative = new DecisionResult { Result = false }
};

//Decision 1
var deserveBranch = new DecisionQuery
{
Title = "Do you like it?",
Test = (client) => client.Answer[1],
Positive = wantBranch,
Negative = new DecisionResult { Result = false }
};


//Decision 0
var sureBranch = new DecisionQuery
{
Title = "Are you sure?",
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\nThe result: {0}", Result ? "Buy it" : "You need to wait");
}
}

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 ? "yes" : "no";

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 方法,该方法使用条件树初始化专家系统并返回根条件。

每个条件包含一个句子评估,它可以是一个查询或一个结果

对于结果评估显示句子

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

抱歉我的英语不好,这不是我的母语,而且我不参与 AI。

static private void DecisionTreeTest()
{
Console.WriteLine("Please, answer a few questions with yes or no.");
Console.WriteLine();
MakeDecisionTree().Evaluate();
}
static private bool GetUserAnswer(string question)
{
Console.WriteLine(question);
string userInput;
while ( true )
{
userInput = Console.ReadLine().ToLower();
if ( userInput == "yes" )
return true;
else
if ( userInput == "no" )
return false;
else
Console.WriteLine("Your answer is not supported, retry please." +
Environment.NewLine + Environment.NewLine +
question);
}
}
static private DecisionTreeQuery MakeDecisionTree()
{
var queryAreYouSure
= new DecisionTreeQuery("Are you sure?",
new DecisionTreeResult("Buy it."),
new DecisionTreeResult("You need to wait."),
GetUserAnswer);
var queryIsItAGoodBook
= new DecisionTreeQuery("Is it a good book?",
new DecisionTreeResult("What are you waiting for? Just buy it."),
new DecisionTreeResult("Find another one."),
GetUserAnswer);
var queryDoYouLikeIt
= new DecisionTreeQuery("Do you like it?",
queryAreYouSure,
queryIsItAGoodBook,
GetUserAnswer);
var queryDoYouWantABook
= new DecisionTreeQuery("Do you want a book?",
queryDoYouLikeIt,
new DecisionTreeResult("Maybe you want a pizza."),
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)
{
}
}

关于c# - 如何在C#中实现交互式决策树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58249079/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com