Dallalgoritmo minimax allalgoritmo alfa-beta
MINIMAX int minimax(stato, livello) { if((livello == max_livello) || condizione_uscita(stato)) { CAMMINO = NULL; return(statica(stato)); } else { lista_figli = genera_figli(stato); if(lista_figli == NULL)// Lista vuota, non ci sono figli { CAMMINO = NULL; return(VALORE_DI_FALLIMENTO); }
if((livello % 2) == 0)// livello e Giocatore sono in corrispondenza { max = - ; for each figlio in lista_figli { valutazione = minimax(figlio, livello + 1); if(valutazione > max) { max = valutazione; migliore = figlio; } inserisci(migliore, CAMMINO); return(max); }
else { min = + ; for each figlio in lista_figli { valutazione = minimax(figlio, livello + 1); if(valutazione < min) { min = valutazione; migliore = figlio; } inserisci(migliore, CAMMINO); return(min); }
Considerazioni Se a un livello superiore si sta minimizzando, a un livello inferiore in cui si massimizza è inutile continuare la ricerca se si è ottenuto un max provvisorio superiore o uguale ad una soglia_max, coincidente con il minimo del livello superiore. Se a un livello superiore si sta massimizzando, a un livello inferiore in cui si minimizza è inutile continuare la ricerca se si è ottenuto un min provvisorio inferiore o uguale ad una soglia_min, coincidente con il massimo del livello superiore.
ALFA-BETA provvisorio int minimax(stato, livello) { if((livello == max_livello) || condizione_uscita(stato)) { CAMMINO = NULL; return(statica(stato)); } else { lista_figli = genera_figli(stato); if(lista_figli == NULL)// Lista vuota, non ci sono figli { CAMMINO = NULL; return(VALORE_DI_FALLIMENTO); }
if((livello % 2) == 0)// livello e Giocatore sono in corrispondenza { max = - ; finito = FALSE; for each figlio in lista_figli && !finito { valutazione = minimax(figlio, livello + 1); if(valutazione > max) { max = valutazione; migliore = figlio; } if(max soglia_max)// a un livello superiore, si sta minimizzando e si è già raggiunto il valore soglia_max (coincide con ) { finito = TRUE; max = soglia_max; } inserisci(migliore, CAMMINO); return(max); }
else { min = + ; finito = FALSE; for each figlio in lista_figli && !finito { valutazione = minimax(figlio, livello + 1); if(valutazione < mim) { min = valutazione; migliore = figlio; } if(valutazione soglia_min)// a un livello superiore si sta massimizzando e si è già raggiunto il valore soglia_min (coincide con α) { finito = TRUE; min = soglia_min; } inserisci(migliore, CAMMINO); return(min); }
Ulteriori considerazioni soglia_min la chiamiamo alfa, soglia_max la chiamiamo beta: devono essere passate come parametri. La variabile max può essere inizializzata con alfa (che in fase di prima chiamata dovrà essere posta a - e che via via riflette il livello di minimo raggiunto). La variabile min può essere inizializzata con beta (che in fase di prima chiamata dovrà essere posta a + e che via via riflette il livello di massimo raggiunto).
ALFA-BETA seconda approssimazione int minimax(stato, livello, alfa, beta) { if((livello == max_livello) || condizione_uscita(stato)) { CAMMINO = NULL; return(statica(stato)); } else { lista_figli = genera_figli(stato); if(lista_figli == NULL)// Lista vuota, non ci sono figli { CAMMINO = NULL; return(VALORE_DI_FALLIMENTO); }
if((livello % 2) == 0)// livello e Giocatore sono in corrispondenza { max = alfa; finito = FALSE; for each figlio in lista_figli && !finito { valutazione = minimax(figlio, livello + 1, alfa, beta); if(valutazione > max) { max = valutazione; migliore = figlio; } if(max beta)// a un livello superiore, si sta minimizzando e si è già raggiunto il valore soglia_max (coincide con ) { finito = TRUE; max = beta; } inserisci(migliore, CAMMINO); return(max); }
else { min = beta; finito = FALSE; for each figlio in lista_figli && !finito { valutazione = minimax(figlio, livello + 1, alfa, beta); if(valutazione < mim) { min = valutazione; migliore = figlio; } if(min alfa)// a un livello superiore si sta massimizzando e si è già raggiunto il valore soglia_min (coincide con α) { finito = TRUE; min = alfa; } inserisci(migliore, CAMMINO); return(min); }
Considerazioni finali Visto luso che se ne fa e i valori assunti, la variabile max può essere chiamata direttamente alfa e min direttamente beta. Lalgoritmo finale è il seguente:
ALFA-BETA definitivo int alfa_beta(stato, livello, alfa, beta) { if((livello == max_livello) || condizione_uscita(stato)) { CAMMINO = NULL; return(statica(stato)); } else { lista_figli = genera_figli(stato); if(lista_figli == NULL)// Lista vuota, non ci sono figli { CAMMINO = NULL; return(VALORE_DI_FALLIMENTO); }
if((livello % 2) == 0)// livello e Giocatore sono in corrispondenza { finito = FALSE; for each figlio in lista_figli && !finito { valutazione = alfa_beta(figlio, livello + 1, alfa, beta); if(valutazione > alfa) { alfa = valutazione; migliore = figlio; } if(alfa beta)// a un livello superiore, si sta minimizzando e si è già raggiunto il valore soglia_max (coincide con ) { finito = TRUE; alfa = beta; } inserisci(migliore, CAMMINO); return(alfa); }
else { finito = FALSE; for each figlio in lista_figli && !finito { valutazione = alfa_beta(figlio, livello + 1, alfa, beta); if(valutazione < beta) { beta = valutazione; migliore = figlio; } if(beta alfa)// a un livello superiore si sta massimizzando e si è già raggiunto il valore soglia_min (coincide con α) { finito = TRUE; beta = alfa; } inserisci(migliore, CAMMINO); return(beta); }