2012-09-23 23 views
6

Tengo como excersice de la escuela para implementar la primera búsqueda de ancho en java. He implementado casi todo, pero el problema es que mi búsqueda no funciona y no puedo encontrar el problema :(Así que estoy pidiendo que me asesoramiento y dame algunos actuales directivas sobre dónde la eventual problema podría ser.Breadth First Search - Java

public ArrayList<SearchNode> search(Problem p) { 
     // The frontier is a queue of expanded SearchNodes not processed yet 
     frontier = new NodeQueue(); 
     /// The explored set is a set of nodes that have been processed 
     explored = new HashSet<SearchNode>(); 
     // The start state is given 
     GridPos startState = (GridPos) p.getInitialState(); 
     // Initialize the frontier with the start state 
     frontier.addNodeToFront(new SearchNode(startState)); 

     // Path will be empty until we find the goal. 
     path = new ArrayList<SearchNode>(); 

     // The start NODE 

     SearchNode node = new SearchNode(startState); 

     // Check if startState = GoalState?? 
     if(p.isGoalState(startState)){ 
      path.add(new SearchNode(startState)); 
      return path; 
     } 


     do { 

      node = frontier.removeFirst(); 
      explored.add(node); 

      ArrayList reachable = new ArrayList<GridPos>(); 
      reachable = p.getReachableStatesFrom(node.getState()); 

      SearchNode child; 

      for(int i = 0; i< reachable.size(); i++){ 

       child = new SearchNode((GridPos)reachable.get(i)); 

       if(!(explored.contains(child) || frontier.contains(child))){ 
        if(p.isGoalState(child.getState())){ 
         path = child.getPathFromRoot() ; 
         return path; 
        } 
        frontier.addNodeToFront(child); 
       } 

      } 
     }while(!frontier.isEmpty()); 


     return path; 
    } 

Gracias

+1

¿Cómo no funciona? Se preciso. – Borgleader

+0

Parece que está explorando los nodos y la ruta "equivocados". – mrjasmin

+0

Tiene muchos métodos que no nos está mostrando. Parece que está extrayendo nodos de dos matrices/listas diferentes e insertando los nodos alcanzables en solo uno. Su condición también es extraña, solo debe verificar la lista 'explorada', en una implementación clásica. La idea básica es: extraer el primer nodo del principio de una lista, agregar todos sus vecinos al final de la misma lista. Deténgase cuando la lista esté vacía o cuando haya agregado el nodo de destino a esa lista. – IVlad

Respuesta

8
frontier.addNodeToFront(child); 

suponiendo que el resto de su código (getReachableStatesFrom(), etc) es correcta, añadir elementos a la parte delantera de la cola hará que su código se ejecute como una primera búsqueda en profundidad.

+0

Sí, tienes razón. Estúpido error por mi parte. Después de cambiarlo para agregar los nodos a la parte posterior, parece que "casi funciona": D – mrjasmin

+2

@ user1285737 si puede identificar otro lugar donde su código puede tener un problema, no dude en abrir otra pregunta :) si usted cree que He respondido esta pregunta de manera apropiada, aceptar mi respuesta es la forma preferida de dar las gracias. ¡buena suerte! –

0

para implementando la primera búsqueda de amplitud, sho uld usa una cola. Este proceso puede volverse muy complicado. Por lo tanto, es mejor mantenerlo simple. Debe empujar los elementos secundarios de un nodo a la cola (izquierda y derecha) y luego visitar el nodo (imprimir datos). Entonces, deberías eliminar el nodo de la cola. Debe continuar este proceso hasta que la cola quede vacía. Puede ver mi implementación del BFS aquí: https://github.com/m-vahidalizadeh/foundations/blob/master/src/algorithms/TreeTraverse.java