Frage

Ich mache einen Algorithmus für eine Hügel-Klettersuche, und aus irgendeinem Grund, den Stapel, den ich am Ende der Schleife haben soll, scheint mit der letzten Iteration des Zustands überschrieben zu sein, der deren Schleife erzeugt.

Grundsätzlich ist hier ein Auslauf dessen, was dieser Algorithmus tut:

Dieser Algorithmus wird verwendet, um das N-Queens-Problem zu lösen. Der gesamte zugrunde liegende Code mit der Staatsklasse funktioniert einwandfrei. Mit diesem Algorithmus ist es durch alle möglichen Nachfolgerstaaten des aktuellen Zustands itert. Es speichert den nächsten Nachfolgerstatus innerhalb der Nachbarn-Variablen (wie in den untenstehenden Code gesehen). Wenn ein staatlicher Preis weniger als die derzeitigen Kosten ist, fügt es den Nachbarn mit diesen neuen niedrigen Kosten in einen Nachbarn hinzu und lagert das in einen Stapel. Alle neuen Min-Werte, die erkannt werden, wischt den Stapel ab und legen die neuen niedrigsten Mindestknoten ein.

Ich habe ein paar Tests innerhalb der Schleife getan, um zu sehen, wie die Ausgänge aussehen, wie in den Stapel eingesetzt wird. Alle scheinen richtig auszugeben. Wenn ich jedoch außerhalb der Schleife bin und den Stapel überprüfe, haben alle Knoten im Stapel ihre Zustände in den letzten erzeugten Nachfolgerstaat aus der Schleife. Es scheint, dass in jedem Knoten, in dem der Nachbarn gespeichert ist, jedes Mal, wenn die Nachbarn aktualisiert wird, alle NODE-Nachbarn-Werte ändert. Ich kann einfach nicht einen Weg finden, dies zu beheben.

Einige Ratschläge, wie ich das beheben kann, würde dies sehr geschätzt werden!

* Hinweis: Ignorieren Sie den Code nach der für die IF-Anweisung, wie es noch unvollständig ist, ignoriert.

Hier ist der Code:

generasacodicetagpre.

}

generasacodicetagpre.

}

War es hilfreich?

Lösung

Wenn Sie den generakodicetagcode ansehen, sieht dies mir misstrauisch aus:

generasacodicetagpre.

Hier sieht es aus, als würden Sie diese Arrays zwischen Objekten teilen. Ohne viel darüber zu kennen, was das Programm tut, ist diese Sache in der Regel die Ursache des Verhaltens "freigegebenes Update", das Sie beobachtet haben.

Das Aktualisieren des Arrays aus dem zurückgegebenen Nachfolger wird auch den Status des Objekts ändern, das sie zurückgegeben hat (usw.).

Es gibt ein paar einfache Möglichkeiten, ein Array zu kopieren, nämlich System # Arraycopy , Arrays # Copyof und Klon . (Alle Arrays sind klonable.) Für das 2D-Array möchten Sie möglicherweise eine Helfermethode erstellen, da Sie wahrscheinlich eine tiefe Kopie erstellen müssen. So etwas wie:

generasacodicetagpre.

Ich habe nicht viel Zeit damit verbracht, den Code wirklich zu analysieren - es gibt viel zu gehen, tut mir leid - aber ich sehe nicht, dass Sie irgendwo ein Kopien machen, um sie zu mustern, also würde ich so einsetzen Meine Wette darauf.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top