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
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
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
Ergebnis (currentState, a); Gibt den nächsten angegebenen Zustand a zurück. – NTNT