2012-09-23 21 views
6

Ho come excersice scolastico per implementare ampiezza prima ricerca in Java. Ho implementato quasi tutto, ma il problema è che la mia ricerca non funziona e non posso trovare il problema :(Così Im che chiede di consigliare me e darmi qualche guidlines su dove l'eventuale problema potrebbe essere.Larghezza Prima ricerca - 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; 
    } 

Grazie

+1

Come funziona? Sii preciso – Borgleader

+0

Sembra che stia esplorando i nodi e il percorso "sbagliati". – mrjasmin

+0

Hai molti metodi che non ci stai mostrando. Sembra che stiate estraendo nodi da due diversi array/liste e inserendo i nodi raggiungibili solo in uno. Anche la tua condizione è strana, dovresti solo controllare la lista "esplorata", in un'implementazione classica. L'idea di base è: estrai il primo nodo dall'inizio di una lista, aggiungi tutti i suoi vicini alla fine della stessa lista. Interrompi quando l'elenco è vuoto o quando hai aggiunto il nodo di destinazione a quell'elenco. – IVlad

risposta

8
frontier.addNodeToFront(child); 

assumendo il resto del codice (getReachableStatesFrom(), ecc) è corretta, l'aggiunta di elementi alla parte anteriore della coda causerà il codice da eseguire come ricerca in profondità.

+0

Sì, hai ragione. Presa stupida da parte mia. Dopo averlo modificato per aggiungere i nodi sul retro, sembra che funzioni "quasi": D – mrjasmin

+2

@ user1285737 se riesci a identificare un altro posto in cui il tuo codice potrebbe avere un problema, sentiti libero di aprire un'altra domanda :) se credi che Ho risposto correttamente a questa domanda, accettare la mia risposta è il modo preferito di rendere grazie. in bocca al lupo! –

0

per implementando l'ampiezza della prima ricerca, si scatta usare una coda Questo processo potrebbe diventare molto complicato. Quindi, è meglio mantenerlo semplice. È necessario trasferire i figli di un nodo in coda (a sinistra, a destra) e quindi visitare il nodo (dati di stampa). Quindi, si dovrebbe rimuovere il nodo dalla coda. Dovresti continuare questo processo fino a quando la coda diventa vuota. Qui puoi vedere la mia implementazione di BFS: https://github.com/m-vahidalizadeh/foundations/blob/master/src/algorithms/TreeTraverse.java

Problemi correlati