public override SearchResult AllPaths(iDomain start) { var result = new SearchResult(); var discovered = new Dictionary <string, SearchNode>(); var toSearch = new Stack <SearchNode>(); var rootNode = new SearchNode(start); discovered.Add(start.getStateHash(), rootNode); toSearch.Push(rootNode); while (toSearch.Count() > 0) { var currentNode = toSearch.Pop(); if (currentNode.IsComplete()) { result.AddSolution(currentNode); } else { var neighbors = currentNode.GetNeighbors(); if (neighbors.Count == 0) { result.leafNodes += 1; } foreach (SearchNode neighbor in neighbors) { if (!discovered.ContainsKey(neighbor.getStateHash())) { discovered.Add(neighbor.getStateHash(), neighbor); toSearch.Push(neighbor); } } } } return(result); }
public override SearchNode AnyPath(iDomain start) { var discovered = new Dictionary <string, SearchNode>(); var toSearch = new Queue <SearchNode>(); var rootNode = new SearchNode(start); discovered.Add(start.getStateHash(), rootNode); toSearch.Enqueue(rootNode); while (toSearch.Count() > 0) { var currentNode = toSearch.Dequeue(); if (currentNode.IsComplete()) { return(currentNode); } var neighbors = currentNode.GetNeighbors(); foreach (SearchNode neighbor in neighbors) { if (!discovered.ContainsKey(neighbor.getStateHash())) { discovered.Add(neighbor.getStateHash(), neighbor); toSearch.Enqueue(neighbor); } else { if (neighbor.Depth() < discovered[neighbor.getStateHash()].Depth()) { discovered[neighbor.getStateHash()].history = neighbor.history; } } } } return(null); }
public SearchNode(iDomain _state, ActionSequence _history = null) { state = _state; if (_history != null) { history = _history; } else { history = new ActionSequence(); } }
public iDomain Act(iDomain board) { Node sourceNode = ((PegBoard)board).getNodeAtPoint(source); Node middleNode = ((PegBoard)board).getNodeAtPoint(middle); Node targetNode = ((PegBoard)board).getNodeAtPoint(target); if ((sourceNode == null || middleNode == null || targetNode == null) || (!sourceNode.occupied || !middleNode.occupied || targetNode.occupied)) { return(board); } sourceNode.occupied = false; middleNode.occupied = false; targetNode.occupied = true; return(board); }
// Only run on finite search spaces public abstract SearchResult AllPaths(iDomain start);
// Okay to run on infinite search spaces public abstract SearchNode AnyPath(iDomain start);