function Max(var depth) { var best = -99999999; if (depth <= 0) { return Eval(); } Skapa draglista while (drag kvar att göra) { Gör ett drag i listan val = Min(depth - 1); Ta tillbaka detta drag if (val > best) { best = val; } } return best; } function Min(int depth) { int best = 99999999 if (depth <= 0) { return Eval(); } Skapa draglista while (drag kvar att göra) { Gör ett drag i listan val = Max(depth - 1); Ta tillbaka detta drag if (val < best) { best = val; } } return best; }
function NegaMax(var depth) { if (depth == 0) { return Eval(); } Skapa en lista av alla drag best = -99999999; while (drag kvar att göra) { Gör ett drag i listan temp=-Negamax(depth-1) Ta tillbaka draget if (temp>best) { best=temp; } } return best; }
function NegaMaxAlfaBeta(var depth, var alfa, var beta) { if (depth == 0) { return Eval(); } Skapa en lista av alla drag while (drag kvar att göra) { Gör ett drag i listan val = -NegaMaxAlfaBeta(depth - 1, -beta, -alfa); Ta tillbaka draget if (val >= beta) { return beta; } if (val > alfa) { alfa = val; } } return alfa; } val = NegaMaxAlfaBeta(4, -99999999, 99999999);
function QSearch(depth, alfa, beta, tp, mdepth) { var E, nrMoves, nrMovesMem, local_sp, es=(tp)%2; E = es?-Evalue:Evalue; if (E >= beta) { return beta; } if (E > alfa) { alfa = E; } nrMoves=nrMovesMem=generateKillMovelist(tp,depth); local_sp=m_sp-nrMoves-1; while (nrMoves--) { local_sp++; doMove(m_stFr[local_sp],m_stTo[local_sp],tp,depth); E = -QSearch(depth - 1, -beta, -alfa, 1-tp, mdepth); undoMove(0); if (E >= beta) { m_sp-=nrMovesMem; return beta; } if (E > alfa) { alfa = E; } } m_sp-=nrMovesMem; return alfa; }
function NegaMaxAlfaBeta(depth, alfa, beta, tp, mdepth) { var E, nrMoves, nrMovesMem, local_sp, es=(tp)%2; nrMoves=nrMovesMem=generateMovelist(tp,depth); local_sp=m_sp-nrMoves-1; while (nrMoves--) { local_sp++; doMove(m_stFr[local_sp],m_stTo[local_sp],tp,mdepth-depth); if (depth==1) { E = es?-Evalue:Evalue; if (E > alfa) { E = -QSearch(depth - 1, -beta, -alfa, 1-tp, mdepth); } else { E = alfa; } } else { E = -NegaMaxAlfaBeta(depth - 1, -beta, -alfa, 1-tp, mdepth); } undoMove(0); if (E >= beta) { m_sp-=nrMovesMem; return beta; } if (E > alfa) { pvlFr[mdepth-depth]=m_stFr[local_sp]; pvlTo[mdepth-depth]=m_stTo[local_sp]; pvlAlfa[mdepth-depth]=E; alfa = E; } } m_sp-=nrMovesMem; return alfa; }
function IDNegaMaxAlfaBeta(maxdepth,maxtime) { timestart=timer(); for (depth=1;depth<=maxdepth;depth++) { NegaMaxAlphaBeta(depth, -999999, 999999); timenow=timer(); if (avbryt || ((timenow-timestart)>maxtime)) break; } }