Попытка реализовать задачу 8 головоломок в Java с использованием BFS - Не искать целое дерево

Я пытаюсь сделать алгоритм поиска в ширину для проблемы 8 головоломки в Java. Я посмотрел на реализации и думаю, что у меня есть все необходимые компоненты, но по какой-то причине узлы не проходят глубину 2 дерева поиска. Любая помощь будет оценена

У меня есть два класса: PuzzleSolver.java и State.java

State.java находится в нижней части прокрутки

public class PuzzleSolver {
                Set<String> explored = new HashSet<String>();
                Queue<State> frontier = new LinkedList<>();
                String goal_map = "123456780";

                int nodesExpanded = 0;

                int SearchDepth = 0;
                int FrontierSize = 0;
public PuzzleSolver(ArrayList<Integer> start_state)
{

    State current_node = new State(start_state, null, 0, 0);
    frontier.add(current_node);

    while(frontier.size() > 0)
    {
        current_node = frontier.poll();
        explored.add(current_node.map);
        if(goalTest(current_node))
        {
            SearchDepth = current_node.depth;
            break;

        }


        ArrayList<State> neighbors = expand(current_node);

        for(int i = 0; i < neighbors.size(); i++)
        {
            if(goalTest(neighbors.get(i)))
            {
                frontier.add(neighbors.get(i));
                explored.add(neighbors.get(i).map);


            }

            if(!explored.contains(neighbors.get(i).map) && !frontier.contains(neighbors.get(i)))
            {
                frontier.add(neighbors.get(i));
                explored.add(neighbors.get(i).map);


                if(neighbors.get(i).depth > SearchDepth)
                {
                    SearchDepth ++;
                }
            }
        }


        if(frontier.size() > FrontierSize)
        {
            FrontierSize = frontier.size();
        }

    }

}


private boolean goalTest(State node) {
    // TODO Auto-generated method stub
    boolean rv = false;
    ArrayList<Integer> goal = new ArrayList<Integer>();
    goal.add(1);
    goal.add(2);
    goal.add(3);
    goal.add(4);
    goal.add(5);
    goal.add(6);
    goal.add(7);
    goal.add(8);
    goal.add(0);
    //1 2 3
    //4 5 6
    //7 8 0
    if(goal.equals(node.state))
    {
        rv = true;
    }
    return rv;
}


public int getNodesExpanded(){
    return nodesExpanded;
}

public Set<String> getNodePath(){
    return explored;
}



private ArrayList<State> expand(State node) {
    // TODO Auto-generated method stub
    nodesExpanded ++;
    ArrayList<State> successors = new ArrayList<State>();
    successors.add(new State(move(node.state, 1), node, node.depth+1, node.cost+1));
    successors.add(new State(move(node.state, 2), node, node.depth+1, node.cost+1));
    successors.add(new State(move(node.state, 3), node, node.depth+1, node.cost+1));
    successors.add(new State(move(node.state, 4), node, node.depth+1, node.cost+1));

    return successors;
}




private ArrayList<Integer> move(ArrayList<Integer> state, int position) {
    // TODO Auto-generated method stub
    ArrayList<Integer> rv = new ArrayList<Integer>(); 
    ArrayList<Integer> lastrow = new ArrayList<Integer>();
    lastrow.add(8);
    lastrow.add(7);
    lastrow.add(6);
    ArrayList<Integer> firstrow = new ArrayList<Integer>();
    firstrow.add(0);
    firstrow.add(1);
    firstrow.add(2);
    int index = state.indexOf(0);

    //UP
    if(position == 1){
        //if not in first row
        if(firstrow.contains(index))
        {
            rv = null;
        }
        else
        {
            int temp = state.get(index - 3);
            state.set(index - 3, state.get(index));
            state.set(index, temp);
            rv = state;
        }
    }

    //DOWN
    if(position == 2)
    {
        if(lastrow.contains(index))
        {
            rv = null;
        }
        else
        {
            int temp = state.get(index + 3);
            state.set(index + 3, state.get(index));
            state.set(index, temp);
            rv = state;
        }
    }

    //Left
    if(position == 3)
    {
        if(0 == index%3)
        {
            rv = null;
        }
        else
        {
            int temp = state.get(index - 1);
            state.set(index - 1, state.get(index));
            state.set(index, temp);
            rv = state;
        }

    }

    //Right
    if(position == 4)
    {
        if(2 == index%3)
        {
            rv = null;
        }
        else
        {
            int temp = state.get(index + 1);
            state.set(index + 1, state.get(index));
            state.set(index, temp);
            rv = state;
        }
    }
    return rv; 
}


public static void main(String[] args)
{
    ArrayList<Integer> sample_input = new ArrayList<Integer>();
    sample_input.add(1);
    sample_input.add(4);
    sample_input.add(2);
    sample_input.add(3);
    sample_input.add(0);
    sample_input.add(5);
    sample_input.add(6);
    sample_input.add(7);
    sample_input.add(8);

    //1 4 2
    //3 0 5 
    //6 7 8
    PuzzleSolver solve = new PuzzleSolver(sample_input);
    int num_nodes = solve.getNodesExpanded();
    Set<String> nodes = solve.getNodePath();

    System.out.println(num_nodes);
    System.out.println(nodes);
}}







public class State {
                ArrayList<Integer> state;
                State parent;
                String map;
                int depth;
                int cost;
public State(ArrayList<Integer> state, State parent, int depth, int cost) {
    // TODO Auto-generated constructor stub
    this.state = state;
    this.map = "";
    this.parent = parent;
    if(state != null){
        for(int i = 0; i < state.size(); i++)
        {
            this.map += state.get(i).toString();
        }
    }
    this.depth = depth;
    this.cost = cost;
}

}

С моего основного () вызова:

Мой входной сигнал [1, 4, 2, 3, 0, 5, 6, 7, 8] и мой выходной сигнал: Расширенные узлы: 3 узла: [102345678, 142035678, 142305678]

0 ответов

Другие вопросы по тегам