Hallo,
ich programmiere 4 gewinnt und benötige dazu den Negamax-Algorithmus. den Algorithmus habe ich soweit verstanden und auch schon implementiert, aber aus dem allgemeinen Pseudocode von Wikipedia lässt sich mir nicht erschließen wie ich daraus schlussendlich einen konkreten Spaltenwert extrahieren kann?
[HIGHLIGHT="Java"]int NegaMax(int tiefe, int alpha, int beta)
{
if (tiefe == 0)
return Bewerten();
GeneriereMoeglicheZuege();
while (ZuegeUebrig())
{
FuehreNaechstenZugAus();
wert = -NegaMax(tiefe-1, -beta, -alpha);
MacheZugRueckgaengig();
if (wert >= beta)
return beta;
if (wert > alpha)
alpha = wert;
}
return alpha;
}
Meine Interpretation lautet wie folgt(funktoniert aber nicht richtig):
private int negamax(int player, int depth, int alpha, int beta)
{
int score = Integer.MIN_VALUE;
if(depth == 0 //Abbruchbedingun der Rekursion (Tiefe erreicht,
|| possibleMovesInt() == 0) //aktueller spieler hat keine möglichen Züge -> Feld ist voll
{
return evaluate(player);
}
for(int s = 0; s < pf.getSpalten(); s++) //Alle Züge durchprobieren
{
if (pf.getOneField(s, pf.getZeilen() - 1) == 0) //Alle möglichen Züge durchprobieren
{
pf.set(s, player); //Zug simulieren
int actualvalue = -negamax(player, depth-1,-beta,-localalpha); //Rekursionsaufruf
//ZUG rückgängig
if(score < actualvalue)
{
score = actualvalue;
doNext = s; // Bester Zug speichern
}
if (actualvalue >= beta)
{
//Betacut
return beta;
}
if (score > alpha)
{
//Alphacut
alpha = score;
}
}
}
return score;
}[/HIGHLIGHT]
doNext soll den konkreten spaltenwert darstellen.
Aber was ist falsch, oder wie kann ich den originial code schnell um doNext erweitern?
Vielen Dank im voraus.
ich programmiere 4 gewinnt und benötige dazu den Negamax-Algorithmus. den Algorithmus habe ich soweit verstanden und auch schon implementiert, aber aus dem allgemeinen Pseudocode von Wikipedia lässt sich mir nicht erschließen wie ich daraus schlussendlich einen konkreten Spaltenwert extrahieren kann?
[HIGHLIGHT="Java"]int NegaMax(int tiefe, int alpha, int beta)
{
if (tiefe == 0)
return Bewerten();
GeneriereMoeglicheZuege();
while (ZuegeUebrig())
{
FuehreNaechstenZugAus();
wert = -NegaMax(tiefe-1, -beta, -alpha);
MacheZugRueckgaengig();
if (wert >= beta)
return beta;
if (wert > alpha)
alpha = wert;
}
return alpha;
}
Meine Interpretation lautet wie folgt(funktoniert aber nicht richtig):
private int negamax(int player, int depth, int alpha, int beta)
{
int score = Integer.MIN_VALUE;
if(depth == 0 //Abbruchbedingun der Rekursion (Tiefe erreicht,
|| possibleMovesInt() == 0) //aktueller spieler hat keine möglichen Züge -> Feld ist voll
{
return evaluate(player);
}
for(int s = 0; s < pf.getSpalten(); s++) //Alle Züge durchprobieren
{
if (pf.getOneField(s, pf.getZeilen() - 1) == 0) //Alle möglichen Züge durchprobieren
{
pf.set(s, player); //Zug simulieren
int actualvalue = -negamax(player, depth-1,-beta,-localalpha); //Rekursionsaufruf
//ZUG rückgängig
if(score < actualvalue)
{
score = actualvalue;
doNext = s; // Bester Zug speichern
}
if (actualvalue >= beta)
{
//Betacut
return beta;
}
if (score > alpha)
{
//Alphacut
alpha = score;
}
}
}
return score;
}[/HIGHLIGHT]
doNext soll den konkreten spaltenwert darstellen.
Aber was ist falsch, oder wie kann ich den originial code schnell um doNext erweitern?
Vielen Dank im voraus.
Zuletzt bearbeitet von einem Moderator: