Probleme mit Negamax-Algorithmus

Bitte aktiviere JavaScript!
A

Anzeige




Vielleicht hilft dir unser Kurs hier weiter —> (hier klicken)
Hast Du mal ein Beispiel?
Irgendwie kann ich das was ich im vorherigen Post meinte nicht mehr rekonstruieren, weil ich einiges im Programm verändert habe. (Es funktioniert aber immer noch nicht) Ich verwende jetzt auch eine Brettkopie, vorher hatte ich die Züge auf dem Brett ja direkt geändert. Ist meine negaMax Methode von der Logik her soweit richtig?

Java:
private int negaMax(int spieler, int tiefe) { // Weiß 1 , Schwarz -1
           
            int maxWert = Integer.MIN_VALUE;           
            ArrayList<Zug> züge = generiereZüge(kopie, spieler);                      
           
            if(tiefe == 0 || züge.size() == 0) { // Keine Züge mehr                                            
                brettAusgeben(kopie);
                aufrufe++;
                return bewerten(kopie,  tiefe); // Hier wird dann Patt und Matt überprüft
            }
          
            for(Zug z: züge) {
         
                kopie = kopiereBrett(brett);
                kopie[z.vonX][z.vonY] = 0; // altes Feld
                kopie[z.nachX][z.nachY] = z.figur; // neues Feld
                              
                int wert = -negaMax(-spieler, tiefe - 1);
                                           
                if(wert > maxWert) {
                    maxWert = wert;

                    if(tiefe == suchTiefe) {
                       besterZug = z;
                    }
                }

            }
            return maxWert;
        }
 
Das du die Kopie nicht weiter gibst und in negaMax immer eine neue Kopie von Brett anlegst, sieht auf den ersten Blick falsch aus. Vielleicht passiert da aber auch irgendwo Magie, die hier nicht sichtbar ist.
 
Statt irgendwelche Instanzvariablen zu benutzen, kannst du das Brett einfach als Parameter weiter geben.
Die Signatur müsste dann grob so sein: int negaMax(int spieler, int tiefe, int[][] brett) (wobei du das Array noch durch eine sinnvolle Datenstruktur ersetzen solltest). Überall, wo du das aktuelle Brett brauchst, benutzt du dann das Argument.

In der Schliefe kopierst du dann das übergebene Brett, führst auf der Kopie den Zug durch, und gibst die Kopie an den Rekursiven Aufruf weiter.
 
Vielen Dank. Es scheint jetzt zu funktionieren.
Edit: Durch was für eine Datenstruktur sollte ich das Array den ersetzen?
 
Zuletzt bearbeitet:
Habe nochmal ne Frage zu der Bewertungsfunktion beim Negamaxalgorithmus, da ich mir noch ziemlich unsicher bin..
Kann ich in der Bewertungsfunktion zwischen schwarzen und weißen Spieler unterscheiden und bei welchem der Spieler muss ich dann negative Werte zurückgeben?
Java:
private int bewerten(int b[][], int spieler, int tiefe) {
if (spieler == weiß) {...}
if (spieler == schwarz) {...}
}
 
Du solltest das immer aus Sicht von weiß zurückgeben. Wenn weiß am Zug und Matt ist (also weiß schwarz matt setzt) positive Werte, wenn Schwarz am Zug ist negative Werte.
 
Da ich das mit der Bewertung beim negamax verwirrend finde habe ich jetzt stattdessen Minmax ausprobiert. Die Laufzeit vom minmax ist nur deutlich höher. Woran liegt das? ich dachte eigentlich das beide ungefähr gleich von der Laufzeit wären.
 
Passende Stellenanzeigen aus deiner Region:

Oben