Questa mattina non mi va di lavorare, e, approfittando del fatto che le simulazioni che sto facendo non hanno bisogno di me per andare avanti, ho deciso di dedicare un'oretta ad un atto eroico.
Ho deciso di salvare Robinson Crusoe dalla morte per fame.
Robinson Crusoe naufraga su un'isola deserta, insieme ad una quantità K di cibo non deperibile. Ogni mese che passa c'è una probabilità P che una nave passi e tragga in salvo il naufrago. Robinson Crusoe ha una funzione di utilità del tipo U=sum(B^t*log(ct)), dove B è un termine di sconto (compreso tra 0 e 1) che indica le preferenze temporali, ct è la quantità di cibo che mangia nel tempo t, e sum() è la funzione di somma sull'indice t da 0 a infinito.
Robinson si trova di fronte ad un problema di fondamentale importanza per la sua sopravvivenza: decidere quanto cibo mangiare ogni mese, dato che:
(1) Se mangia, si troverà una quantità minore di cibo successivamente, quindi non deve mangiare troppo;
(2) Se gli avanza troppo cibo, prima o poi verrà una nave a salvarlo, visto che la probabilità che non venga salvato dopo N giorni è (1-P)^N, che tende a 0 asintoticamente, quindi risparmiare troppo cibo è uno spreco, in quanto poi sulla nave potrà mangiare caviale e bere champagne (è una nave da crociera) e la sua dotazione di scatolame non gli varrà nulla. Quindi non deve mangiare troppo poco.
Robinson non sa come organizzarsi perché non conosce l'ottimizzazione dinamica, ma io sono il dittatore sociale benevolo e gli consiglio (anche se sono un dittatore, non ordino perchè sono benevolo) di adottare una strategia ottimale.
La strategia ottimale parte dal dare un valore V(K) alla sua dotazione di cibo. Se un giorno consuma c, si troverà una quantità residua K-c. Ma questo residuo varrà nel periodo successivo V(K-c). Tutto sta nel sapere quanto vale V(K), e quindi nello scegliere c ottimale.
Il valore attuale di una dotazione K è V(K). K o si mangia o si conserva: il valore è quindi pari alla somma del valore di ciò che si mangia e di quello che rimane, ma questa è pari al valore ottimale di consumo odierno c, e il valore scontato della futura dotazione ottimale di cibo K-c. Questo perché il valore del consumo odierno è log(c), e il valore futuro di ciò che rimane è V(K-c), e quindi il valore presente di ciò che rimane sarà B*V(K-c).
Per ingraziarsi le divinità, Robinson costruisce un altare a Bellman, inventore dell'ottimizzazione dinamica, è scrive sulla sabbia (grazie al mio consiglio):
V(K) = max(log(c) + B*V(K-c)), dato 0 < c < K
Il vincolo è legato al fatto che un giorno o non mangia nulla (c=0), o mangia tutto (c=K), o una cosa di mezzo. Il vincolo sarebbe maggiore o uguale, ma in realtà gli estremi non sono stringenti: infatti se c=0 Robinson ottiene un'utilità infinitamente negativa, perché log(0)=-inf, e se K=0 ha una probabilità (1-P) che otterrà una utilità infinitamente negativa in futuro, perché se K=0, il consumo futuro se non viene salvato è 0 sempre, e quindi ho tanti log(0) scontati che si sommano.
Il problema è che Robinson non sa se il mese successivo verrà o meno salvato dalla nave. Ci sono due stati per ogni periodo di tempo: o viene salvato o rimane sull'isola.
Se viene salvato, il valore della sua dotazione di cibo in scatola è nullo, perché la nave da crociera che viene a salvarlo è piena di caviale. Se non viene salvato, il valore è invece V(K), una funzione ignota. In media, la probabilità di essere salvato essendo P, il valore dello scatolame è (1-P)*V(K)+P*0 = (1-P)*V(K). Non ricordo perché il valore atteso è così importante, ma devo salvare Robinson e non ho il tempo di controllare su Stockey.
L'equazione di Bellman in realtà è un po' diversa da come l'ho scritta prima:
V(K) = max(log(c) + B*E(V(K-c))), dato 0 < c < K
Dove E() è il valore atteso, che è (1-P)*F(K-c).
Si noti che V(K0) nel tempo t=0 è condizionata al fatto di stare sull'isola: è una probabilità a posteriori rispetto alla realizzazione dello stato "non-salvato" in t=0. Detta in altri termini, V(K) è in realtà una V(K,S), dove S è lo stato. Solo che lo stato o è 0 (salvato) o è 1 (non-salvato), e posso scrivere V(K,S)=S*V(K). Ma siccome in S=0 non esiste nessun problema di ottimizzazione, perché il capitano della nave da crociera è un filantropo, mi sembra un'inutile complicazione.
La strategia che consiglio a Robinson è di questo tipo: ogni giorno consumare una frazione costante della propria dotazione di cibo (alternativamente, potrei dire che deve dare al cibo che ha un valore pari a E+F*log(K), ma poi intuitivamente non capirà a cosa gli serve questa contabilità).
Così definisco una politica h(K)=q*K, con q compreso tra 0 e 1, che dice che ogni giorno Robinson deve consumare una frazione q della sua ricchezza. Faccio questo perché so che la funzione ottima ha questa forma, perché ho fatto i conti ora.
Se la politica è ottima, rispetta l'equazione di Bellman.
Ora qui ci sono vari modi per risolvere il problema: o si sceglie la politica, si calcola il valore data la politica, e si usa questo valore per calcolare una politica migliore; o si sceglie una funzione valore, si calcola la politica ideale, e si usa questa per migliorare la funzione valore; oppure si sceglie una forma funzionale a caso e si spera che il risultato venga fuori.
Io ho adottato quest'ultima strategia (anche perché la prima non sono convinto d'averla capita, chiederò a Howard), e ho posto V(K) = E+F*log(K) (non ci vuole molto, è la normale soluzione di un modello di crescita di Ramsey con utilità logaritmica e funzione di produzione di Cobb-Douglass a deprezzamento completo del capitale), ottenendo:
h(K)=(1-Q)*K
Q=(1-P)*B
V(K) = E+F*log(K)
F=1/(1-Q)
E=(Q*log(Q)+(1-Q)*log(1-Q))/(1-Q)^2
Se il fattore di sconto di Robinson è 0.98 e se la probabilità di essere salvati in un mese è 1%, la strategia ottima è mangiare 1-0.99*0.98 = 2.98% della quantità di cibo in scatola al mese.
Vediamo qual è la probabilità che Robinson muoia, nel senso che sarà costretto a non mangiare nulla. Questo è possibile se non viene salvato per N mesi di fila, e se al mese N non ha cibo.
Siccome ogni mese mangia il 3% circa di quello che gli rimane, Robinson non morirà mai, visto che, se ha 100kg di fagioli, dopo 100 mesi avrà ancora circa 5kg di fagioli. Il problema è che dovrà mangiare 150g di fagioli al mese. Ma questo non l'abbiamo considerato... bisognerà rendere la funzione di utilità più realistica, assumendo ad esempio imponendo un livello di consumo minimo per evitare morte per fame (log(c-cmin) se c>cmin? Può darsi). In questo caso al massimo sopravvivrà K0/cmin mesi, e se non viene salvato (evento con probabilità (1-P)^N) muore.
Ma non voglio sapere come si fanno i calcoli in questo caso... piuttosto, che crepi!
PS C'è qualcosa di strano nel modello, quindi potrei aver scritto un mucchio di scemenze. La stranezza è che non ho idea di quale sia l'utilità attesa perché non ho mai specificato l'utilità quando viene salvato. La cosa mi sembra irrilevante, visto che i problemi di scelta si hanno finché si permane nello stato da naufrago sull'isola deserta, il resto è una crociera.