public AlgorithmResult run() { var result = new AlgorithmResult(); visited = new List <BreadthFirstSearchNode>(); var queue = new Queue <BreadthFirstSearchNode>(); queue.Enqueue(P); while (true) { if (queue.Count == 0) { break; } var B = queue.Dequeue(); var adjacentNodes = GetUnivisitedAdjacentNodes(B); visited.Add(B); bool breakWhile = false; for (var adjacentNodeIndex = 0; adjacentNodeIndex < adjacentNodes.Count; adjacentNodeIndex++) { var C = adjacentNodes[adjacentNodeIndex]; if (C.Equals(this.G)) { var node = C; var nextNode = node.Parent; while (node.Parent != null) { result.Paths.Add(new Paths(node.X, node.Y)); node = nextNode; nextNode = node.Parent; } result.Paths.Add(new Paths(node.X, node.Y)); breakWhile = true; break; } result.Probes.Add(new Probes(C.X, C.Y)); visited.Add(C); queue.Enqueue(C); } if (breakWhile) { break; } } return(result); }
public AlgorithmResult run() { var OpenList = new List <AStarNode>() { P }; var ClosedList = new List <AStarNode>(); var result = new AlgorithmResult(); while (true) { if (OpenList.Count == 0) { break; } OpenList = OpenList.OrderBy(x => x.F).ToList(); var B = OpenList.FirstOrDefault(); OpenList.RemoveAt(0); ClosedList.Add(B); var connectedNodes = GetConnectedNodes(B); connectedNodes = connectedNodes.OrderBy(x => x.F).ToList(); var breakWhile = false; for (var childIndex = 0; childIndex < connectedNodes.Count; childIndex++) { var C = connectedNodes[childIndex]; CalculateCostsForNode(C); var nodeInOpenList = OpenList.FirstOrDefault(x => x.Equals(C)); var nodeInClosedList = ClosedList.FirstOrDefault(x => x.Equals(C)); result.Probes.Add(new Probes(C.X, C.Y)); if (C.Equals(G)) { var node = C; var nextNode = node.Parent; while (node.Parent != null) { result.Paths.Add(new Paths(node.X, node.Y)); node = nextNode; nextNode = node.Parent; } result.Paths.Add(new Paths(node.X, node.Y)); breakWhile = true; break; } else if (nodeInOpenList != null) { if (C.F >= nodeInOpenList.F) { continue; } } else if (nodeInClosedList != null) { if (C.F >= nodeInClosedList.F) { continue; } else { OpenList.Add(C); } } else { OpenList.Add(C); } } if (breakWhile) { break; } } return(result); }
public AlgorithmResult run() { var result = new AlgorithmResult(); graph.reset(); graph.Get(P.X, P.Y).Distance = 0; while (true) { var UnexploredList = graph.GetSortedUnexploredList(); if (UnexploredList.Count == 0) { break; } var B = UnexploredList.FirstOrDefault(); B.Selected = true; if (B.Equals(G)) { var node = B; var nextNode = node.Parent; while (node.Parent != null) { result.Paths.Add(new Paths(node.X, node.Y)); node = nextNode; nextNode = node.Parent; } if (B.Parent != null) { result.Paths.Add(new Paths(node.X, node.Y)); } break; } var adjacentNodes = B.Adjacents; for (var adjacentNodeIndex = 0; adjacentNodeIndex < adjacentNodes.Count; adjacentNodeIndex++) { var C = adjacentNodes[adjacentNodeIndex]; if (C.Selected) { continue; } if (C.Weight != int.MaxValue) { result.Probes.Add(new Probes(C.X, C.Y)); } var distance = (B.Distance == int.MaxValue ? 0 : B.Distance) + C.Weight + 1; if (C.Weight == int.MaxValue) { distance = int.MaxValue; } if (distance < C.Distance) { C.Distance = distance; C.Parent = B; } } } return(result); }