2012-09-23 10 views
6

Mam jako excersice szkoły do ​​wdrożenia pierwszego wyszukiwania w języku Java. I wprowadziły niemal wszystko, ale problemem jest to, że moje wyszukiwanie nie działa i nie mogę znaleźć problem :(tak im prośbą o poradę do mnie i daj mi kilka guidlines na którym ewentualny problem może być.Szerokość pierwszego wyszukiwania - 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; 
    } 

Dziękuję

+1

Jak to działa? Bądź precyzyjny. – Borgleader

+0

Wygląda na to, że eksploruje "niewłaściwe" węzły i ścieżkę. – mrjasmin

+0

Masz wiele metod, których nam nie pokazujesz. Wydaje się, że wyodrębniasz węzły z dwóch różnych tablic/list i wstawiasz dostępne węzły do ​​jednego. Twój stan jest również dziwny, powinieneś sprawdzić tylko listę "eksplorowanych" w klasycznej implementacji. Podstawową ideą jest: wyodrębnić pierwszy węzeł z początku listy, dodać wszystkich swoich sąsiadów na końcu tej samej listy. Zatrzymaj, gdy lista jest pusta lub gdy dodałeś węzeł docelowy do tej listy. – IVlad

Odpowiedz

8
frontier.addNodeToFront(child); 

zakładając resztę swojego kodu (getReachableStatesFrom(), etc) jest poprawna, dodawanie elementów do przodu kolejki spowoduje kod do wykonania jako głębokość pierwszego wyszukiwania.

+0

Tak, masz rację. Głupi błąd przeze mnie. Po zmianie, aby dodać węzły do ​​tyłu, wygląda na to, że "prawie działa": D – mrjasmin

+2

@ user1285737, jeśli możesz zidentyfikować inne miejsce, w którym twój kod może mieć problem, możesz otworzyć kolejne pytanie :) jeśli uważasz, że ja "Odpowiednio odpowiedziałem na to pytanie, zaakceptowanie mojej odpowiedzi jest preferowanym sposobem dziękowania. powodzenia! –

0

dla wdrażanie pierwszego zakresu wyszukiwania, ty sho używasz kolejki. Ten proces może stać się bardzo skomplikowany. Więc lepiej jest zachować prostotę. Powinieneś przekazać dzieciom węzła do kolejki (po lewej, po prawej), a następnie odwiedzić węzeł (dane drukowania). Następnie należy usunąć węzeł z kolejki. Powinieneś kontynuować ten proces, aż kolejka stanie się pusta. Możesz zobaczyć moją implementację BFS tutaj: https://github.com/m-vahidalizadeh/foundations/blob/master/src/algorithms/TreeTraverse.java

Powiązane problemy