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; }
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") + "%)"); }
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); }
public RouteFindingNode(RouteFindingState state, RouteFindingState target) : this(null, null, state, target) { }