Ricerca con avversari Roberto Tagliaferri Dipartimento di Informatica Università di Salerno ( Sa ) 84084 Fisciano rtagliaferri@unisa.it
Indice I giochi Decisioni ottime nei giochi L algoritmo minimax Potatura alfa-beta Ordinamento delle mosse Decisioni imperfette in tempo reale Funzioni di valutazione Tagliare la ricerca Potatura in avanti Ricerca e ricerca in tabelle
I giochi Qui trattiamo gli ambienti competitivi, in cui gli obiettivi degli agenti sono in conflitto, dando origine a problemi di ricerca con avversari (adversarial search), più spesso indicati con il nome di giochi. La teoria matematica dei giochi, una branca dell'economia, considera ogni ambiente multiagente come un gioco, indipendentemente dal fatto che I'interazione sia cooperativa o competitiva, a patto che l'influenza di ogni agente sugli altri sia "significativa". Nell'IA i giochi più comuni appartengono a una categoria piuttosto specializzata, quella che i teorici chiamano giochi a somma zero con informazione perfetta, a turni e a due giocatori (come gli scacchi) Nella nostra terminologia questo significa ambienti deterministici e completamente osservabili, in cui due agenti agiscono alternandosi e in cui i valori di utilità, alla fine della partita, sono sempre uguali ma di segno opposto. Ad esempio, se un giocatore vince una partita a scacchi, I'altro deve necessariamente perderla. E proprio quest'opposizione delle funzioni di utilità dei due agenti che ci fa parlare di "avversari".
I giochi
I giochi Cominceremo con la definizione di mossa ottima e di un algoritmo per trovarla. Esamineremo poi le tecniche per scegliere una buona mossa quando il tempo a disposizione è limitato. La potatura ci permette di ignorare porzioni dell'albero di ricerca che non influiscono sulla scelta finale, le funzioni di valutazione euristiche ci consentono di approssimare l'utilità reale di uno stato senza eseguire una ricerca completa
I giochi Un gioco può essere definito come un problema di ricerca con i seguenti componenti: S 0 : lo stato iniziale, che specifica come è configurato il gioco in partenza Giocatore(s), definisce il giocatore a cui tocca muovere in uno stato AZIONI(s): restituisce I'insieme delle mosse lecite in uno stato
I giochi RISULTATO(s, a): il modello di transizione, che definisce il risultato di una mossa TEST-TERMINAZIONE(s): un test di terminazione, che restituisce vero se la partita è finita e falso altrimenti. Gli stati che fanno finire la partita sono chiamati stati terminali. UTILITÀ(s, p): una funzione utilità (chiamata anche funzione obiettivo o funzione di payoff), che definisce il valore numerico finale per un gioco che termina nello stato terminale s per un giocatore p.
I giochi Negli scacchi i possibili risultati sono vittoria, sconfitta o pareggio, e i valori corrispondenti +1, 0 o 1/2. Gli scacchi sono un gioco a somma zero perché ogni partita ha un payoff di 0+1, l+0 o 1/2+1/2. Sarebbe meglio utilizzare il termine "somma costante", ma tradizionalmente si parla di "somma zero", che è sensato se si immagina che ogni giocatore sia inizialmente penalizzato di un valore 1/2
I giochi Lo stato iniziale, la funzione AZIONI e la funzione RISULTATO definiscono l'albero di gioco, un albero in cui i nodi sono stati del gioco e gli archi sono mosse. Inizia MAX che si alterna ad ogni mossa con MIN Il numero associato a ciascun nodo foglia indica il valore di utilità di quello stato terminale dal punto di vista di MAX; i valori alti sono buoni per MAX e cattivi per MIN
I giochi Per il gioco del tic-tac-toe I'albero è relativamente piccolo, meno di 9! = 362.880 nodi terminali, mentre per gli scacchi ci sono oltre 10 40 nodi, perciò è meglio pensare all'albero di gioco come a un costrutto teorico che non possiamo realizzare nel mondo fisico. Utilizziamo il termine albero di ricerca per indicare un albero che viene sovrapposto all'albero di gioco completo, e che esamina un numero di nodi sufficiente per consentire a un giocatore di determinare quale mossa fare.
I giochi
Decisioni ottime nei giochi In una ricerca con avversari, MIN può dire la sua: MAX quindi deve trovare una strategia contingente che specifichi la sua mossa nello stato iniziale, quindi le mosse in tutti gli stati possibili risultanti dalla prima mossa di MIN, poi le mosse negli stati risultanti dalle mosse di MIN in risposta a quelle, e così via. E un processo analogo a quello dell'algoritmo AND-OR con MAX che assume il ruolo di OR e MIN equivalente ad AND Una strategia ottima porta a un risultato che è almeno pari a quello di qualsiasi altra strategia, assumendo che si stia giocando contro un avversario infallibile.
I giochi
L algoritmo minimax L algoritmo minimax calcola la decisione minimax per lo stato corrente usando un semplice calcolo ricorsivo del valore minimax di ogni stato successore, implementando direttamente le equazioni che lo definiscono. La ricorsione percorre tutto I'albero sino alle foglie, quindi i valori minimax sono "portati su (bachedup) attraverso I'albero durante la fase di ritorno.
I giochi
Potatura alfa-beta Figura 5.5 Fasi del calcolo della decisione ottima per l'albero di gioco della Figura 5.2: in ogni punto viene indicato l'intervallo dei possibili valori di ogni nodo. Il valore della radice e di conseguenza la decisione minimax sono indipendenti dal valore delle foglie potate
Potatura alfa-beta La potatura alfa-beta può essere applicata ad alberi di qualunque profondità, e spesso invece di foglie è possibile potare interi sottoalberi Possiamo quindi potare un qualsiasi nodo n non appena abbiamo raccolto abbastanza informazioni (esaminando alcuni dei suoi discendenti) da raggiungere la conclusione che c'è una scelta migliore m a livello del nodo padre o di un qualunque nodo precedente Infatti: n non sarà mai raggiunto in tutta la partita.
Potatura alfa-beta minimax è una ricerca in profondità, per cui in ogni momento dobbiamo considerare solo i nodi lungo un singolo cammino dell'albero. La potatura alfa-beta prende il suo nome dai seguenti due parametri che descrivono i limiti sui valori "portati su" in un qualsiasi punto del cammino: = il valore della scelta migliore (quella con valore più alto) per MAX che abbiamo trovato sin qui in un qualsiasi punto di scelta lungo il cammino; = il valore della scelta migliore (quella con valore più basso) per MIN che abbiamo trovato sin qui in un qualsiasi punto di scelta lungo il cammino.
Potatura alfa-beta La ricerca alfa-beta aggiorna i valori di e a mano a mano che procede e pota i rami restanti che escono da un nodo (ovvero, fa terminare le chiamate ricorsive) non appena determina che il valore del nodo è peggiore di quello di per MAX o, rispettivamente, di per MIN.
I giochi
Ordinamento delle mosse L efficacia della potatura alfa-beta dipende fortemente dall'ordine in cui sono esaminati gli stati. Se questo può essere fatto, risulta che per scegliere la mossa migliore la ricerca alfa-beta deve esaminare solo O(b m/2 ) nodi, invece degli O(b m ) richiesti da minimax. Questo significa che il fattore di ramificazione effettivo diventa b invece di b: nei caso degli scacchi, 6 invece di 35. Per esprimere in un altro modo lo stesso risultato, si può dire che la ricerca alfa-beta può risolvere un albero profondo circa il doppio di quello che può risolvere minimax nello stesso lasso di tempo.
Decisioni imperfette in tempo reale L algoritmo minimax genera l'intero spazio di ricerca del gioco, mentre quello alfa-beta ci permette di potarne una buona parte. Comunque, alfa-beta deve condurre la ricerca fino agli stati terminali, almeno per una porzione dello spazio di ricerca. Questa profondità. normalmente non è gestibile in tempo ragionevole Claude Shannon (1950) proponeva che i programmi "tagliassero" la ricerca prima di raggiungere le foglie applicando una funzione di valutazione euristica agli stati, di fatto trasformando i nodi non terminali in foglie.
Decisioni imperfette in tempo reale Si può modificare minimax o alfa-beta in due modi: sostituendo la funzione di utilità con una funzione di valutazione euristica EVAL, che fornisce una stima dell'utilità della posizione raggiunta, e rimpiazzando il test di terminazione con un test di taglio (cutoff test), che decide quando applicare EVAL.
Decisioni imperfette in tempo reale Abbiamo la funzione minimax euristica per lo stato s e la profondità massima d:
Funzioni di valutazione Una funzione di valutazione restituisce una stima del guadagno atteso in una determinata posizione (analogia con le funzioni euristiche per la stima della distanza dall obiettivo) Caratteristiche della funzione di valutazione: la funzione di valutazione dovrebbe ordinare gli stati terminali nello stesso modo della vera funzione di utilità: gli stati che sono vittorie devono avere una valutazione migliore dei pareggi, che a loro volta devono essere migliori delle sconfitte. i calcoli non dovrebbero richiedere troppo tempo per gli stati non terminali, la funzione di valutazione dovrebbe avere una forte correlazione con la probabilità reale di vincere la partita.
Funzioni di valutazione Se Ia ricerca deve essere interrotta in stati non terminali, I'algoritmo sarà necessariamente incerto sui risultati finali di quegli stati. Questo tipo di incertezza deriva da limiti computazionali, non dalla mancanza di informazioni. Data la quantità limitata di calcoli che la funzione di valutazione può svolgere in un determinato stato, il meglio che può fare è fornire una stima del risultato finale.
Funzioni di valutazione La maggior parte delle funzioni di valutazione ragiona in base alle caratteristiche di uno stato: i.e., negli scacchi, avremmo come caratteristiche: il numero di pedoni bianchi, il numero di pedoni neri, di regine bianche, di regine nere e così via.
Funzioni di valutazione Le caratteristiche, prese insieme, definiscono categorie o classi di equivalenza: gli stati di una categoria hanno lo stesso valore per tutte le caratteristiche. i.e., una categoria contiene tutti gli stati finali con due pedoni contro un pedone. In generale, ogni categoria potrà contenere stati che portano alla vittoria, altri che portano al pareggio e altri ancora alla sconfitta.
Funzioni di valutazione La funzione di valutazione non può sapere quali sono questi stati, ma può restituire un singolo valore che riflette la proporzione di stati che portano a ogni risultato. Se la nostra esperienza suggerisce che il 72% degli stati nella categoria di due pedoni contro un pedone conducano a una vittoria (utilità +1); il 20 % a una sconfitta (0): I'8 % a un pareggio (1/2), allora una valutazione ragionevole per gli stati appartenenti a tale categoria è il valore atteso: (0,72 x 1) + (0,20 x 0) + (0,08 x l/2) = 0,76.
Funzioni di valutazione Come con gli stati terminali, non è neppure necessario che la funzione di valutazione restituisca effettivamente i valori attesi, purché non venga alterato l'ordinamento degli stati. I libri di scacchi per principianti, ad esempio, forniscono un valore del materiale approssimativo per ogni pezzo: ogni pedone vale 1, un cavallo o alfiere 3, una torre 5 e la regina 9, Altre caratteristiche come una buona disposizione dei pedoni o la difesa del re potrebbero valere mezzo pedone
Funzioni di valutazione Questo tipo di valutazione è chiamata funzione lineare pesata, perché può essere espressa come dove ogni w i è un peso (weight) e ogni f i è una caratteristica (feature) di una posizione Negli scacchi f i è il numero di pezzi di un certo tipo e w i il suo valore (1 per i pedoni, 3 per gli alfieri ecc.)
Funzioni di valutazione Sommare i valori delle caratteristiche sembra ragionevole, ma in effetti presume che si accetti l'ipotesi che il contributo di ogni caratteristica sia indipendente dal valore delle altre. Ad esempio, assegnare il valore 3 a un alfiere non tiene conto del fatto che questi pezzi sono più potenti nei finali delle partite, quando hanno più spazio per muoversi. Per questa ragione, i programmi più recenti per gli scacchi e altri giochi utilizzano combinazioni non lineari di caratteristiche: ad esempio, una coppia di alfieri potrebbe valere leggermente più del doppio di un alfiere singolo, che a sua volta avrà più valore nel finale
Funzioni di valutazione
Ricerca e ricerca in tabelle Un programma di scacchi non inizia una partita considerando un albero di un miliardo di stati del gioco, solo per determinare la prima mossa Molti programmi di scacchi utilizzano ricerche in tabelle, invece di cercare aperture e chiusure. Per le aperture, il computer si affida per lo più all'esperienza e alle competenze dell'uomo. I migliori consigli di grandi esperti su come effettuare ogni apertura sono copiati dai libri e inseriti in tabelle destinate all'uso da parte de1 computer.
Ricerca e ricerca in tabelle Tuttavia, i computer possono anche raccogliere statistiche da un database di partite giocate nel passato, per determinare quali sequenze di apertura portano più spesso a una vittoria. Nelle prime mosse ci sono poche scelte, e perciò molti commenti degli esperti e partite passate su cui basarsi. Solitamente dopo dieci mosse ci si ritrova in una posizione incontrata raramente nel passato, e il programma deve passare dalla ricerca nella tabella alla ricerca pura.
Ricerca e ricerca in tabelle Verso la conclusione della partita ci sono ancora meno posizioni possibili, e perciò più possibilità di affidarsi alle tabelle. Ma qui è il computer I'esperto: I'analisi al computer delle chiusure supera le possibilità dell'uomo. Una persona può dirvi la strategia generale per giocare una chiusura re-e-torre-contro-re (KRK) (King-Rook-King): ridurre la possibilità di movimento del re avversario costringendolo contro un lato della scacchiera, usando il proprio re per evitare che l'avversario possa scappare
Ricerca e ricerca in tabelle Altre chiusure, come re, alfiere e cavallo contro re (KBNK) (King-Bishop-kNight-King, sono difficili da padroneggiare e non dispongono di una strategia descrivibile in breve. Un computer può risolvere interamente la chiusura producendo una politica che associa a ogni possibile stato la migliore mossa possibile. Possiamo quindi limitarci a cercare la mossa migliore in una tabella, anziché ricalcolarla da zero
Ricerca e ricerca in tabelle Che dimensioni avrà la tabella KBNK? Ci sono 462 modi per disporre due re sulla tastiera evitando che siano adiacenti tra loro. Una volta posizionati i re, ci sono 62 caselle vuote per I'alfiere, 6l per il cavallo e due possibili giocatori che hanno la prossima mossa, in tutto ci sono soltanto 462 x 62 x 6l x 2 = 3.494.568 possibili posizioni.
Ricerca e ricerca in tabelle Alcune di queste sono posizioni di scacco matto, e vanno contrassegnate come tali nella tabella. Poi si esegue una ricerca minimax retrograda: si invertono le regole degli scacchi per fare "retro mosse" anziché mosse reali. Qualsiasi mossa del Bianco che, a prescindere dalla mossa con cui risponda il Nero, termini in una posizione indicata come vittoria, deve anch'essa essere una vittoria. Si continua questa ricerca finché tutte Ie 3.494.568 posizioni sono risolte come vittorie, sconfitte o pareggi, ottenendo così una tabella infallibile per tutte le chiusure KBNK.
Ricerca e ricerca in tabelle Alcuni risultati interessanti: Ken Thompson (1986, 1996) e Lewis Stiller (1992, 1996) hanno risolto tutte le chiusure del gioco degli scacchi con un massimo di cinque pezzi e alcune con sei pezzi. Stiller ha scoperto un caso in cui esisteva uno scacco matto forzato, ma richiedeva 262 mosse Marc Bourzutschky e Yakov Konoval (Bourzutschky, 2006) hanno risolto tutte le chiusure con sei pezzi senza pedoni e alcune con sette pezzi. esiste una chiusura KQNKRBN (re-regina-cavallo contro re-torre-alfiere-cavallo) che con la migliore strategia richiede 517 mosse fino a una cattura, che poi porta a uno scacco matto