【发布时间】:2020-02-03 12:58:31
【问题描述】:
我需要允许用户通过在屏幕上显示的两个简单选项之间进行选择来选择自己的路径,以便进入下一组选项,直到他们到达一个结局,即应该实现这样的目标:
我尝试了以下代码,但每次只评估左侧。我想知道如何才能获得像上图这样的结果(覆盖所有分支)?例如,如果用户选择“否”,则应用程序不应该向用户询问任何进一步的问题,而只是简单地显示“也许你想要披萨”消息。我已经用决策树算法做到了这一点,需要修复它,使其像上图一样覆盖左右两侧。
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];
}
}
【问题讨论】:
-
机器学习?
-
@OlivierRogier 不确定是否相同。我只需要以最简单的方式创建一个简单的决策树。
-
@OlivierRogier 那么你对我的问题有什么想法吗?它可以很容易地重新生产。
-
你写的代码并没有实现所有的分支,问题可能会在过程中被问到,而不是在评估之前。我没有参与机器学习和决策树,但乍一看,您的算法在
MainDecisionTree中存在缺陷。
标签: c# machine-learning artificial-intelligence chatbot decision-tree