ai-22 / src / am / aua / search / GraphSearch.java
GraphSearch.java
Raw
package am.aua.search;

import java.util.HashSet;

public class GraphSearch implements Search {
    private Frontier frontier;

    // statistics
    // keeps track of how many nodes where generated during last search
    private int steps;

    public GraphSearch(Frontier frontier) {
       this.frontier = frontier;
       steps = 0;
    }

    @Override
    public Node search(State initialState, GoalTest test) {
        frontier.clear();
        steps = 1;

        Node node = new Node(null, null, initialState);
        if (test.isGoal(node.state))
            return node;
        frontier.add(node);
        HashSet<State> expanded = new HashSet<>();
        while (!frontier.isEmpty()) {
            node = frontier.remove();
            if (test.isGoal(node.state)) return node;
            expanded.add(node.state);
            for (Action action : node.state.getApplicableActions()) {
                State newState = node.state.getActionResult(action);
                if (!expanded.contains(newState)) {
                    Node child = new Node(node, action, newState);
                    steps++;
                    frontier.add(child);
                }
            }
        }
        return null;
    }

    @Override
    public int steps() {
        return steps;
    }

    @Override
    public int stretchFactor() {
        return frontier.stretchFactor();
    }

    @Override
    public String toString() {
        return frontier + " Graph Search";
    }
}