Algoritmi e giochi combinatori Panoramica Giochi combinatori Programmi che giocano Albero di un gioco L algoritmo Minimax 1
Perché studiare i giochi? Problemi che coinvolgono agenti in competizione tra loro Problemi interessanti e ardui, facili da descrivere Definiscono spesso spazi di ricerca molto ampi Divertente Giochi combinatori Giochi a 2 giocatori I giocatori alternano le proprie mosse Somma zero: un giocatore vince nella misura in cui l altro perde Informazione perfetta: i due giocatori conoscono completamente lo stato del gioco ogni volta che muovono; nessuna informazione è nascosta ad uno dei due giocatori. Deterministici: nessun elemento di casualità Finiti: il numero di scelte possibili ad ogni mossa è finito, e il gioco dura un numero finito di mosse 2
Giochi combinatori e non Non è finito Non è deterministico Solitario Informazione incompleta Ok Troppi giocatori Ok Stato dell arte Che livello raggiungono i migliori algoritmi? Scacchi: Deep Blue batte Garry Kasparov nel 1997 Garry Kasparov vs. Deep Junior (Feb 2003): patta! Kasparov vs. X3D Fritz (Nov 2003): patta! Dama: Chinook è stato campione del mondo. Go: programmi appena sufficienti 3
Come giocare Un possibile approccio ad un gioco combinatorio: Considera tutte le mosse ammissibili nello stato attuale Calcola la nuova posizione risultante da ogni mossa Valuta ogni posizione risultante e determina la migliore Gioca la mossa corrispondente Attendi la mossa dell avversario e ricomincia Difficoltà: Rappresentazione della scacchiera Generazione di tutte le posizioni risultanti Valutazione di una posizione Funzione di valutazione Una funzione di valutazione viene usata per stimare la bontà di una situazione di gioco Per l assunzione di somma nulla, una singola funzione è sufficiente a valutare la situazione di entrambi i giocatori f(s) > 0: la posizione s è buona per il primo giocatore e cattiva per il secondo f(s) < 0: la posizione s è cattiva per il primo giocatore e buona per il secondo f(s) = 0: la posizione s è neutra 4
Esempi di funzioni di valutazione Esempio di funzione di valutazione per il gioco del Tris: f(s) = [# di tris possibili per A] - [# di tris possibili per B] Una funzione di valutazione per gli scacchi: f(s) = w(s)/b(s) dove w(s) = somma del valore dei punti dei pezzi bianchi b(s) = somma del valore dei punti dei pezzi neri Spesso le funzioni di valutazione sono la somma pesata di singole caratteristiche della posizione: f(s) = w 1 *car 1 (s) + w 2 *car 2 (s) +... + w k *car k (s) Esempi di caratteristiche per gli scacchi: numero di pezzi, piazzamento dei pezzi, caselle controllate, ecc. Deep Blue aveva oltre 8000 caratteristiche nella sua funzione di valutazione Albero di un gioco Lo spazio di ricerca di un gioco è rappresentabile da un albero Un nodo rappresenta una posizione di gioco; il giocatore decide quale singola mossa eseguire portando così ad un determinato nodo figlio La funzione di valutazione assegna un valore ad ogni nodo Gli archi rappresentano le mosse ammissibili per un giocatore Se è il turno del primo giocatore, il nodo è etichettato MAX, altrimenti MIN Dato che i giocatori alternano le proprie mosse, su ogni cammino dalla radice ad una foglia le etichette si alternano 5
L algoritmo Minimax Crea un nodo radice di tipo MAX con la posizione iniziale Espandi i nodi fino ad una certa profondità nel gioco Applica la funzione di valutazione ai nodi foglia Calcola induttivamente all indietro i valori dei nodi interni fino ad arrivare alla radice: Ai nodi MIN, poni il valore al minimo dei valori associati a ciascun nodo figlio. Ai nodi MAX, poni il valore al massimo dei valori associati a ciascun nodo figlio. L arco (=mossa) scelto a ciascuno nodo è quello il cui figlio ha valore pari al valore del nodo L algoritmo Minimax 2 2 1 2 1 2 7 1 8 Valutazione delle posizioni 2 7 1 8 Mossa selezionata da Minimax MAX MIN 2 7 1 8 2 2 1 2 7 1 8 6
L albero del gioco del Tris f(s) = +1 se la posizione è vincente per X. f(s) = -1 se la posizione è vincente per O. f(s) = 0 se la posizione è una patta. Pseudocodice per Minimax function MAX-VALUE (state) if TERMINAL(state) then return UTILITY(state) v := - for each s in SUCCESSORS (state) do v := MAX (v, MIN-VALUE (s)) end return v function MIN-VALUE (state) if TERMINAL(state) then return UTILITY(state) v := + for each s in SUCCESSORS (state) do v := MIN (v, MAX-VALUE (s)) end return v 7
Potatura alfa-beta Possiamo migliorare l efficienza dell algoritmo minimax con la potatura alfa-beta Idea di base: Se hai un idea che di certo non è buona, non perdere tempo per capire quanto sia cattiva. MAX >=2 MIN =2 MAX 2 7 1 <=1? Non abbiamo bisogno di valutare questo nodo. A prescindere dal suo valore, non potrà influenzare il valore della radice. Potatura alfa-beta Visita l albero del gioco in profondità Ad ogni nodo MAX s, alfa(s) = massimo valore trovato finora Ad ogni nodo MIN s, beta(s) = minimo valore trovato finora I valori alfa partono da -infinito e possono solo crescere, mentre i valori beta partono da +infinito e possono solo diminuire. Soglia Alfa: taglia la ricerca su un nodo s di tipo MIN se beta(s) <= alfa(i) per qualche nodo i di tipo MAX che sia antenato di s. Soglia Beta: taglia la ricerca su un nodo s di tipo MAX se alfa(s) >= beta(i) per qualche nodo i di tipo MIN che sia antenato di s. 8
Potatura alfa-beta: esempio MAX 3 MIN 3 2 - taglia 14 1 - taglia 3 12 8 2 14 1 L algoritmo alfa-beta function MAX-VALUE (state, α, β) // α = MAX attuale; β = MIN attuale if TERMINAL-TEST (state) then return UTILITY(state) v := - for each s in SUCCESSORS (state) do v := MAX (v, MIN-VALUE (s, α, β)) if v >= β then return v α := MAX (α, v) end return v function MIN-VALUE (state, α, β) if TERMINAL-TEST (state) then return UTILITY(state) v := for each s in SUCCESSORS (state) do v := MIN (v, MAX-VALUE (s, α, β)) if v <= α then return v β := MIN (β, v) end return v 9
L efficacia di alfa-beta Alfa-beta calcola sempre lo stesso valore di Minimax Caso peggiore: nessuna potatura, esamina O(b d ) nodi dove d è la profondità della ricerca e b il numero massimo di figli di ogni nodo Nel caso migliore, esamina solo O(b d/2 ) nodi In Deep Blue, l uso della potatura alfa-beta ha portato il fattore di branching medio da 35 a 6! 10