static int EvaluateCostAndPrint(IADTreeNode node, ADTreeContext context) { EvaluateCostVisitor v = new EvaluateCostVisitor(); var value = v.GetValue(node, v, context); Console.WriteLine("Minimum attack cost: " + value); return value; }
static void Test(ADTreeContext context, ADTreeParser parser) { Console.WriteLine("Test Cases for ADTs"); ADTreeExample1(context, parser); ADTreeExample2(context, parser); ADTreeExample3(context, parser); }
static void Main(string[] args) { var context = new ADTreeContext(); var parser = new ADTreeParser(); Test(context, parser); Console.WriteLine("All test cases passed"); Console.ReadKey(); }
static bool EvaluateSuccessAndPrint(IADTreeNode node, ADTreeContext context) { EvaluateSuccessVisitor v = new EvaluateSuccessVisitor(); var value = v.GetValue(node, v, context); if (value) Console.WriteLine("Evaluated: true"); else Console.WriteLine("Evaluated: false"); return value; }
static int EvaluateDurationAndPrint(IADTreeNode node, ADTreeContext context) { EvaluateDurationVisitor v = new EvaluateDurationVisitor(); var value = v.GetValue(node, v, context); Console.WriteLine("Minimum attack time: " + value); Console.WriteLine(""); Console.WriteLine("----------------------------------------"); return value; }
static void ADTreeExample1(ADTreeContext context, ADTreeParser parser) { context.SetNodeOutcome("ForceDoor", false); var input = "LEAF,ForceDoor,100,120"; Console.WriteLine("ADTree: " + input); var adt = parser.Parse(input); var expected_success = false; var actual_success = EvaluateSuccessAndPrint(adt, context); var expected_cost = 100; var actual_cost = EvaluateCostAndPrint(adt, context); var expected_duration = 120; var actual_duration = EvaluateDurationAndPrint(adt, context); Debug.Assert(expected_success == actual_success && expected_cost == actual_cost && expected_duration == actual_duration); }
public int GetValue(IADTreeNode a, EvaluateDurationVisitor b, ADTreeContext c) { if (a is LEAF) { return((int)a.Accept(this)); } else if (a is OR) { int v1 = GetValue(a.childs[0], b, c); int v2 = GetValue(a.childs[1], b, c); return(v1 > v2 ? v2 : v1); } else { return(GetValue(a.childs[0], b, c) + GetValue(a.childs[1], b, c)); } }
static void ADTreeExample2(ADTreeContext context, ADTreeParser parser) { context.SetNodeOutcome("BribeGuard", true); context.SetNodeOutcome("ForceDoor", false); var input = "AND,GrabTreasure,0,2 LEAF,BribeGuard,500,60 LEAF,ForceDoor,100,120"; Console.WriteLine("ADTree: " + input); var adt = parser.Parse(input); var expected_success = false; var actual_success = EvaluateSuccessAndPrint(adt, context); var expected_cost = 600; var actual_cost = EvaluateCostAndPrint(adt, context); var expected_duration = 182; var actual_duration = EvaluateDurationAndPrint(adt, context); Debug.Assert(expected_success == actual_success && expected_cost == actual_cost && expected_duration == actual_duration); }
static void ADTreeExample3(ADTreeContext context, ADTreeParser parser) { context.SetNodeOutcome("HelicopterExit", true); context.SetNodeOutcome("EmergencyExit", false); context.SetNodeOutcome("BribeGuard", true); context.SetNodeOutcome("ForceDoor", true); var input = "AND,TreasureStolen,0,0 OR,GetAway,0,0 LEAF,HelicopterExit,500,3 LEAF,EmergencyExit,0,10 AND,GrabTreasure,0,2 LEAF,BribeGuard,500,60 LEAF,ForceDoor,100,120"; Console.WriteLine("ADTree: " + input); var adt = parser.Parse(input); var expected_success = true; var actual_success = EvaluateSuccessAndPrint(adt, context); var expected_cost = 600; var actual_cost = EvaluateCostAndPrint(adt, context); var expected_duration = 185; var actual_duration = EvaluateDurationAndPrint(adt, context); Debug.Assert(expected_success == actual_success && expected_cost == actual_cost && expected_duration == actual_duration); }
public bool GetValue(IADTreeNode a, EvaluateSuccessVisitor b, ADTreeContext c) { if (a.childs.Count > 0) { if (a is AND) { return(GetValue(a.childs[0], b, c) && GetValue(a.childs[1], b, c)); } else { return(GetValue(a.childs[0], b, c) || GetValue(a.childs[1], b, c)); } } bool?outcome = c.GetNodeOutcome((string)a.Accept(b)); if (outcome == null) { return(new Random().Next(0, 100) > 50 ? true : false); } return(outcome.Value); }
public abstract T Accept <T>(IVisitor <T> visitor, ADTreeContext context);