Exemplo n.º 1
0
        public RouteFindingNode(AbstractNode parent, AbstractAction action, RouteFindingState state, RouteFindingState target)
            : base(state, target, parent, action)
        {
            if (this.Parent != null && this.Action != null)
                this.PathCost = this.Parent.PathCost + action.Cost;

            this.EstimatedTotalPathCost = this.PathCost + Math.Sqrt(Math.Pow(state.X - target.X, 2) + Math.Pow(state.Y - target.Y, 2));
        }
 protected RouteFindingState GetOrCreateState(int px, int py)
 {
     var tmpState = new RouteFindingState(px, py);
     var state = this.States.SingleOrDefault(s => s.Equals(tmpState));
     if (state == null)
     {
         state = new RouteFindingState(px, py);
         this.States.Add(state);
     }
     return (RouteFindingState)state;
 }
Exemplo n.º 3
0
        public void Run()
        {
            Console.WriteLine();
            Console.WriteLine("--- " + this.Name + " ---");
            var succeeded = 0;
            foreach (var test in this.Tests)
            {
                Console.Write("Test: " + test.Name);
                SearchResult result;
                if (this.IsInference)
                {
                    var kb = InferenceKnowledgeBase.ParseFile(test.File);

                    var parsedTarget = InferenceKnowledgeBase.ParseString(test.Target).Rules.First();
                    var targetState = new InferenceState(parsedTarget.Clause);

                    result = AStar.Search(new InferenceNode(targetState, new InferenceState()), kb);
                }
                else
                {
                    Console.Write(" ... Parsing");
                    var kb = RouteFindingKnowledgeBase.Parse(File.ReadAllText(test.File));

                    var coords = test.Target.Split(',');
                    var startCoord = coords[0].Split(' ');
                    var endCoord = coords[1].Split(' ');
                    var startState = new RouteFindingState(int.Parse(startCoord[0]), int.Parse(startCoord[1]));
                    var endState = new RouteFindingState(int.Parse(endCoord[0]), int.Parse(endCoord[1]));

                    Console.Write(" ... Solving");
                    result = AStar.Search(new RouteFindingNode(startState, endState), kb);
                }

                if (result.Succeeded == test.Exepected)
                    succeeded++;

                Console.Write(result.Succeeded == test.Exepected ? ": SUCCESS" : ": FAILURE");
                Console.WriteLine((result.Succeeded ? " (solved " : " (not solved ") + "in " + result.Iterations + (result.Iterations == 1 ? " iteration)" : " iterations)"));
            }
            var succesRatio = (100 * succeeded) / (double)this.Tests.Count;
            Console.WriteLine("Passed " + succeeded + " of " + this.Tests.Count + " (" + succesRatio.ToString("000") + "%)");
        }
Exemplo n.º 4
0
        public static void DrawKnowledgeBase(Graphics gfx, RouteFindingNode traceNode, RouteFindingKnowledgeBase kb, RouteFindingState startState, RouteFindingState endState)
        {
            var offset = 10;
            var scale = Math.Max(kb.MaxX, kb.MaxY);
            scale = 400 / scale;

            // Draw map of routes
            var pen = new Pen(Color.FromArgb(100, 1, 1, 0)) { Width = 5 };
            pen.EndCap = LineCap.ArrowAnchor;
            pen.StartCap = LineCap.RoundAnchor;
            foreach (var action in kb.Actions.Select(a => (RouteFindingAction)a))
                gfx.DrawLine(pen, action.StartState.X * scale + offset, action.StartState.Y * scale + offset,
                      action.EndState.X * scale + offset, action.EndState.Y * scale + offset);

            // Draw calculated route
            pen = new Pen(Color.FromArgb(255, 0, 255, 0)) { Width = 2.4f };
            var last = endState;
            while (traceNode != null)
            {
                gfx.DrawLine(pen, last.X * scale + offset, last.Y * scale + offset, traceNode.State.X * scale + offset, traceNode.State.Y * scale + offset);
                last = traceNode.State;
                traceNode = traceNode.Parent;
            }

            // Draw end marker
            pen = new Pen(Color.FromArgb(255, 255, 0, 0)) { Width = 3 };
            var esize = 12;
            gfx.DrawEllipse(pen,
                    (int)(endState.X * scale - esize * .5) + offset,
                    (int)(endState.Y * scale - esize * .5) + offset,
                    esize, esize);

            // Draw start marker
            pen = new Pen(Color.FromArgb(255, 0, 0, 255)) { Width = 3 };
            esize = 12;
            gfx.DrawEllipse(pen,
                    (int)(startState.X * scale - esize * .5) + offset,
                    (int)(startState.Y * scale - esize * .5) + offset,
                    esize, esize);
        }
Exemplo n.º 5
0
 public RouteFindingNode(RouteFindingState state, RouteFindingState target)
     : this(null, null, state, target)
 {
 }