예제 #1
0
 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;
 }
예제 #2
0
        static void Test(ADTreeContext context, ADTreeParser parser)
        {
            Console.WriteLine("Test Cases for ADTs");

            ADTreeExample1(context, parser);
            ADTreeExample2(context, parser);
            ADTreeExample3(context, parser);
        }
예제 #3
0
        static void Main(string[] args)
        {
            var context = new ADTreeContext();
            var parser  = new ADTreeParser();

            Test(context, parser);

            Console.WriteLine("All test cases passed");
            Console.ReadKey();
        }
예제 #4
0
 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;
 }
예제 #5
0
        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;
        }
예제 #6
0
        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);
        }
예제 #7
0
파일: Visitor.cs 프로젝트: AstRyou/All
 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));
     }
 }
예제 #8
0
        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);
        }
예제 #9
0
        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);
        }
예제 #10
0
파일: Visitor.cs 프로젝트: AstRyou/All
        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);
        }
예제 #11
0
 public abstract T Accept <T>(IVisitor <T> visitor, ADTreeContext context);