/* (non-Javadoc) * @see searchingAlgorithms.SearchAlgorithm#search(searchable.Searchable) */ @Override public Solution search(Searchable s) // the function actually implements the search algorithm. { addToOpenList(s.getInitialState()); HashSet<State> closedSet = new HashSet<State>(); // closed list for nodes that we already processed while (openList.size() > 0) { State n = popOpenList(); // extracts the first node out of the list closedSet.add(n); if (n.equals(s.getGoalState())) { return backTrace(n, s.getInitialState()); } ArrayList<State> successors = new ArrayList<State>(); // creating an array of nodes surroundings a certain node. successors = s.getAllPossibleStates(n); n.setFlag(true); for (State state : successors) { // iterating over all the nodes. state.setCameFrom(n); state.setCost(n.getCost() + 1); if (!closedSet.contains(state) && !openList.contains(state)) { state.setCameFrom(n); addToOpenList(state); } else if (openList.contains(state)) { State temp = null; for (State s2 : openList) { if (s2.getPos().equals(state.getPos())) temp = s2; } if (temp != null) { if (temp.getCost() < state.getCost()) { openList.remove(temp); openList.add(state); } } } else openList.add(state); } } return null; }
/* (non-Javadoc) * @see java.lang.Comparable#compareTo(java.lang.Object) */ @Override public int compareTo(State o) { return this.getCost() - o.getCost(); }