Esercizio - MDP con pymdptoolbox, matrici di transizione e ricompensa (esempio d'esame 2)
In questa pagina 4
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 →. Esercizio guida con la stessa libreria: Esercizio - MDP con value iteration, policy iteration e Q-learning (laboratorio 9). Domanda 4 del quiz da 9 CFU e domanda 4 di quello da 6 CFU: identiche (24 blank).
Testo. Processo di Markov con 3 stati (numerati da 0 a 2) e due azioni.
- "Stay" (indice 0): ha sempre successo e lascia l'agente dove è.
- "Jump" (indice 1): porta l'agente avanti di una posizione con probabilità , con probabilità lo lascia dov'è.
- Nello stato 2 l'agente resta con probabilità . Lo stato 2 ha ricompensa (valore che include già eventuali costi).
- Ogni altra azione Stay costa , ogni altra azione Jump costa .
Completare l'implementazione con MDP toolbox. Q1: la matrice P1 delle probabilità di transizione, 18 blank (diciotto numeri), ciascuno con menu , , , . Q2: la matrice R1 delle ricompense, 6 blank, ciascuno con menu , , , . (Nella trascrizione le parentesi quadre del codice sono sbilanciate; la struttura è quella spiegata qui sotto.)
Struttura degli array
pymdptoolbox usa:
Pdi forma(A, S, S):P[a][s][s']è la probabilità di passare dasas'con l'azionea. Qui forma : numeri, i 18 blank. Ogni rigaP[a][s]deve sommare a .Rdi forma(S, A):R[s][a]è la ricompensa di eseguireains. Qui : 6 numeri.
Soluzione
Q1. Prima matrice, azione 0 (Stay): l'identità, perché non ci si muove mai. Seconda matrice, azione 1 (Jump):
- stato 0: resta in 0 con , va in 1 con : riga ;
- stato 1: resta in 1 con , va in 2 con : riga ;
- stato 2: resta in 2 con (non c'è uno stato 3 in cui saltare): riga .
import numpy as np
P1 = np.array([
[[1, 0, 0], [0, 1, 0], [0, 0, 1]], # azione 0, Stay
[[0.3, 0.7, 0], [0, 0.3, 0.7], [0, 0, 1]], # azione 1, Jump
])Q2. R1[s][a]: negli stati 0 e 1 Stay costa (colonna 0) e Jump (colonna 1); nello stato 2 la ricompensa è per entrambe le azioni, perché il valore "include già eventuali costi":
R1 = np.array([[-0.10, -0.05], # stato 0: Stay, Jump
[-0.10, -0.05], # stato 1
[ 1, 1 ]]) # stato 2Blank 19-24, in ordine: .
Perché le scelte alternative sono sbagliate
- Mettere e scambiati (salto con probabilità ): contraddice il testo, il salto riesce con .
- Mettere nella colonna di destra nello stato 2 non ha senso: non esiste uno stato oltre il 2, e la riga non sommerebbe a (serve ).
- Trasporre
R(forma invece di ): la libreria si aspettaR[s][a]; con la forma sbagliata il controllo fallisce o le ricompense vanno agli stati sbagliati. - Ricompensa nello stato 2 o per Jump: il testo dà nello stato 2 e per Jump.
Verifica
Le righe di P1 sommano tutte a (P1.sum(axis=2) dà una matrice di soli uni). Con mdptoolbox.mdp.ValueIteration(P1, R1, 0.9) (sconto non dato dal testo, qui ) il valore di stato soddisfa e, usando Jump negli stati 0 e 1, e . La politica ottima è Jump, Jump, e in 2 le due azioni sono equivalenti (la libreria sceglie la prima, Stay). Valori ricalcolati con NumPy (la libreria non è installata).
Versione ripasso
Pforma(A, S, S),P[a][s][s'], righe che sommano a 1: 18 blank.Rforma(S, A): 6 blank.P1[0](Stay) = identità.P1[1](Jump) =[[0.3,0.7,0],[0,0.3,0.7],[0,0,1]].R1 = [[-0.10,-0.05],[-0.10,-0.05],[1,1]].- Controllo (): , politica Jump, Jump, Stay (pari in 2).
Errori tipici: invertire e ; riga dello stato 2 che non somma a 1; R trasposta; ricompensa nello stato 2.