Esercizio - Utilità attesa, maximax e maximin (laboratorio 9)
Teoria: Processi decisionali di Markov - utilità, equazione di Bellman, value e policy iterationUn MDP (processo decisionale di Markov) modella un problema decisionale sequenziale in ambiente stocastico e completamente osservabile con stati S, azioni A(s), modello di transizione P(s'|s,a) e ricompensa R(s,a,s'). La soluzione è una politica pi(s). L'utilità U(s) è il ritorno scontato atteso e soddisfa l'equazione di Bellman U(s)=max_a sum_s' P(s'|s,a)[R(s,a,s')+gamma U(s')]; la quantità tra parentesi quadre sommata su s' è la funzione azione-utilità Q(s,a). Value iteration parte da U=0, applica Bellman a tutti gli stati insieme e si ferma quando delta <= eps(1-gamma)/gamma; la politica è argmax_a Q(s,a). Policy iteration alterna valutazione (sistema lineare, senza max) e miglioramento greedy, e termina quando la politica non cambia. Nei POMDP lo stato è nascosto: si lavora sullo stato di credenza b aggiornato come nel filtraggio, b'(s')=alpha P(e|s') sum_s P(s'|s,a)b(s).Processi decisionali di Markov - utilità, equazione di Bellman, value e policy iteration →, sezione 1. Il laboratorio parte da un esempio svolto in aula (il caffè) e poi propone l'esercizio "cosa fare all'aeroporto".
Esempio guida: il caffè
Testo. Ho mezz'ora libera e posso scegliere tra lavorare in ufficio e uscire a prendere un caffè.
- Se resto in ufficio può succedere una di tre cose: faccio un po' di lavoro (utilità 8), mi distraggo guardando le notizie (utilità 1), passa un collega a parlare di lavoro (utilità 5), con probabilità , e .
- Se esco a prendere un caffè, con probabilità me lo godo (utilità 10) e con probabilità me lo rovescio addosso (utilità ).
(a) Utilità attesa di restare in ufficio. (b) Utilità attesa di uscire. (c) Cosa conviene fare secondo il principio di massima utilità attesa? Poi: (d) decisione con il criterio maximax; (e) decisione con il maximin.
Soluzione. (a) . (b) . (c) : si esce a prendere il caffè. (d) Maximax: si guarda solo il miglior esito di ogni azione: ufficio , caffè . Vince il caffè. (e) Maximin: si guarda solo il peggior esito: ufficio , caffè . Vince l'ufficio: il criterio prudente evita il rischio di rovesciare il caffè, a differenza del MEU.
Il laboratorio aggiunge: "vediamo cosa succede al variare delle probabilità". Se la probabilità di rovesciare il caffè è , l'utilità attesa del caffè è ; confrontandola con si ha . Sopra circa il di probabilità di rovesciarlo, il MEU preferisce l'ufficio.
Esercizio 1 del laboratorio: cosa fare all'aeroporto
Testo. Stai viaggiando e hai del tempo da far passare in aeroporto. Puoi fare tre cose.
- Prendere un caffè. Con probabilità ti rilassi con una bevanda gustosa, utilità . Con probabilità il caffè è cattivo, fatto con chicchi bruciati, e ti infastidisce, utilità .
- Comprare dei vestiti. Con probabilità trovi un vestito bellissimo a un buon prezzo, utilità . Con probabilità spendi soldi in cose care e inutili, utilità .
- Mangiare qualcosa. Con probabilità trovi qualcosa di piuttosto mediocre che ti evita di avere troppa fame durante il volo, utilità . Con probabilità trovi qualcosa di sostanzioso e saporito, utilità .
(a) Cosa conviene fare se il criterio di decisione è la massima utilità attesa? (b) E con il criterio maximax? (c) E con il maximin?
Soluzione.
(a) Utilità attese:
- caffè: ;
- vestiti: ;
- mangiare: .
Il massimo è : caffè.
(b) Miglior esito di ogni azione: caffè , vestiti , mangiare . Il massimo è : vestiti. Il maximax guarda solo l'esito fortunato e ignora che ha probabilità .
(c) Peggior esito di ogni azione: caffè , vestiti , mangiare . Il massimo dei minimi è : mangiare. È l'unica azione senza esiti negativi.
I tre criteri danno tre risposte diverse, perché pesano in modo diverso la probabilità e la gravità degli esiti. Solo il MEU usa le probabilità.
Codice (equivalente a quello del corso, che usa una catena di if annidati; qui si usa argmax):
import numpy as np
azioni = { # (probabilita', utilita')
"caffe": (np.array([0.8, 0.2]), np.array([10, -5])),
"vestiti": (np.array([0.1, 0.9]), np.array([20, -10])),
"mangiare": (np.array([0.8, 0.2]), np.array([2, 5])),
}
nomi = list(azioni)
eu = [float(np.sum(p * u)) for p, u in azioni.values()] # utilita' attesa
maximax = [u.max() for p, u in azioni.values()] # miglior esito
maximin = [u.min() for p, u in azioni.values()] # peggior esito
print("EU:", dict(zip(nomi, eu)))
print("MEU ->", nomi[int(np.argmax(eu))])
print("maximax ->", nomi[int(np.argmax(maximax))])
print("maximin ->", nomi[int(np.argmax(maximin))])Output atteso (che coincide con quello del corso):
EU: {'caffe': 7.0, 'vestiti': -7.0, 'mangiare': 2.6}
MEU -> caffe
maximax -> vestiti
maximin -> mangiareVersione ripasso
Criteri. MEU: , massimo. Maximax: massimo del miglior esito. Maximin: massimo del peggior esito. Solo il MEU usa le probabilità.
Caffè (ufficio: 8, 1, 5 con ; caffè: 10, con ).
- ; : MEU sceglie il caffè.
- Maximax: contro , caffè. Maximin: contro , ufficio.
- Soglia: ( = probabilità di rovesciarlo).
Aeroporto.
| azione | miglior | peggior | |
|---|---|---|---|
| caffè () | |||
| vestiti () | |||
| mangiare () |
MEU: caffè; maximax: vestiti; maximin: mangiare.
eu = [np.sum(p * u) for p, u in azioni.values()]
nomi[int(np.argmax(eu))] # MEU; con u.max() e u.min(): maximax e maximinErrori tipici: usare nel maximax o nel maximin le probabilità; confrontare le probabilità invece delle utilità attese; dimenticare il segno negativo di un'utilità.