2017-01-27 2 views
0

Ich habe den Inhalt von res (der nächste Zustand Aktion a) während der Schleife überprüft und sie sind korrekt. Es wird zur Liste der Grenzlinien hinzugefügt, aber die Werte sind alle gleich, die letzte Iteration von res.Das letzte hinzugefügte Element überschreibt alle Objekte in der Liste. Java

public State BFSearch(){  
     State initial = new State(array); 
     LinkedList<State> frontier = new LinkedList<State>(); 
     frontier.add(initial); 


     while(!frontier.isEmpty()){ 
      State currentState = new State(); 
      currentState = frontier.removeFirst(); 

      if(goalTest(currentState)){ 
       System.out.println("goal"); 
       return currentState; 
      } 
      else{ 
       for (Point a : Actions(currentState)) { 
        State res = new State(); 
        res = Result(currentState,a); 
        frontier.add(res); 
       } 

      } 
     } 
     return null; 
    } 
+1

Nicht klar, was passiert, was ist das Problem. Auch, was tut 'Ergebnis (currentState, a);' Sie wissen, dass Sie 'currentState = border.removeFirst();' in der While-Schleife – AxelH

+0

Es sieht aus wie Sie Ihren Ausgangszustand aus der Grenze entfernen und dann möglicherweise ersetzen es mit nur einem neuen Zustand identisch mit Ihrem ursprünglichen (was würde erklären, warum Sie immer die gleichen Werte erhalten). Es ist schwer zu wissen, warum, ohne zu sehen, wie Ihre State-Klasse funktioniert und wie Sie mit den verfügbaren Aktionen umgehen. Es könnte sich lohnen, zu überprüfen, ob Ihr Zielstatus wirklich erreichbar ist. Es kann sein, dass Ihr Zielstatus nicht erreicht werden kann, weil das Programm in einer wiederholten Schleife stecken bleibt? – Afterfield

+0

Ergebnis (currentState, a); Gibt den nächsten angegebenen Zustand a zurück. – NTNT

Antwort

0

, die ganz in der Erklärung offensichtlich ist currentState = frontier.removeFirst(); Wie es in while-Schleife ist, schließlich alle Elemente entfernt erhalten. Wenn Sie nicht entfernen möchten, können Sie die Methode peekFirst() versuchen.

1

Ich denke, Sie werden versucht, Breadth-first search zu implementieren.

Von Ihrer Implementierung sieht es so aus, als hätten Sie diesen Schritt verpasst: if n is not in S: So könnte es funktionieren, nur wenn Sie keine Schleife in Ihrem Diagramm haben. In anderen Fällen bleiben Sie in der Endlosschleife stecken.

Auch viele Fehler in diesem Code:

public State BFSearch(){  
    State initial = new State(array); 
    LinkedList<State> frontier = new LinkedList<State>(); 
    frontier.add(initial); <-- initially you have 1 element in list 


    while(!frontier.isEmpty()){ 
     State currentState = new State(); <-- You don't need to create new instance because you'll overwrite it on next step 
     currentState = frontier.removeFirst(); <-- you remove initial element 

     if(goalTest(currentState)){ 
      System.out.println("goal"); 
      return currentState; 
     } 
     else{ 
      for (Point a : Actions(currentState)) { <-- I guess Actions is method which returns N points 
       State res = new State(); <-- You don't need to create instance because you overwrite it on next step 
       res = Result(currentState,a); <-- is it method with just return state or you just missed `new` 
       <-- here should be check for existent `res` in `frontier` --> 

       frontier.add(res); <-- there you put N new steps 
      } 

     } 
    } 
    return null; 
} 

Ihre Implementierung könnte aussehen wie:

public State BFSearch() { 
    State initial = new State(arrays); 
    List<State> frontier = new LinkedList<>(); 
    frontier.add(initial); 


    while (!frontier.isEmpty()) { 
     State currentState = frontier.removeFirst(); 

     if (goalTest(currentState)) { 
      System.out.println("goal"); 
      return currentState; 
     } else { 
      for (Point a : actions(currentState)) { 
       State res = result(currentState, a); 
       if (!frontier.contains(res)) { 
        frontier.add(res); 
       } 
      } 

     } 
    } 
    return null; 
} 

Wichtige sicher sein, dass Sie equals und hashCode Methoden ordnungsgemäß umgesetzt in Ihrer State Implementierung

0

Schwer zu folge genau dem, was du machst oder was deine Frage ist, aber aus dem, was ich entnehme, entfernst du das erste Element (aus einer Liste, die vermutlich eine einzelne Elementliste ist), dann überprüfst du, ob es mit einem übereinstimmt Kriterien, Sie geben es von der Funktion zurück, wenn dies der Fall ist, wenn Sie nicht mit Elementen auffüllen, die auf einer anderen Sammlung basieren. Dann wiederholen Sie das oben, bis das erste Element das gewünschte Element ist? Haben Sie versucht, "Ergebnis (currentState, a)" in der Schleife auszudrucken und zu sehen, was es Ihnen gibt? oder drucken Sie die Liste aus, bevor Sie die nächste Iteration eingeben?

Verwandte Themen