Sei sulla pagina 1di 16

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); } } }