#Numero de epocas
Tmax = 3
#Estados
estados = c('Excelente','Bueno','Promedio','Malo')
#Decisiones
decisiones = c("Reemplazar",'No reemplazar')
#Retornos inmediatos
datos_retornos = c(-1e7,100,
-100,80,
-100,50,
-100,10)
retorno_inmediato = matrix(datos_retornos,byrow = T, nrow = 4, ncol = 2)
dimnames(retorno_inmediato) = list(estados,decisiones)
retorno_inmediato
Reemplazar No reemplazar
Excelente -1e+07 100
Bueno -1e+02 80
Promedio -1e+02 50
Malo -1e+02 10
#Estado futuro - Matrices de probabilidad
#Decisión de reemplazar
datos_Reemplazar = c(0 ,0 ,0,0,
0.7,0.3,0,0,
0.7,0.3,0,0,
0.7,0.3,0,0)
p_Reemplazar = matrix(datos_Reemplazar, byrow = T, ncol = 4, nrow = 4)
dimnames(p_Reemplazar) = list(estados,estados)
p_Reemplazar
Excelente Bueno Promedio Malo
Excelente 0.0 0.0 0 0
Bueno 0.7 0.3 0 0
Promedio 0.7 0.3 0 0
Malo 0.7 0.3 0 0
#Decisión de NO reemplazar
datos_Noreemplazar = c(0.7,0.3,0,0,
0,0.7,0.3,0,
0,0,0.6,0.4,
0,0,0,1)
p_NO_reemplazar = matrix(datos_Noreemplazar, byrow = T, ncol = 4, nrow = 4)
dimnames(p_NO_reemplazar) = list(estados,estados)
p_NO_reemplazar
Excelente Bueno Promedio Malo
Excelente 0.7 0.3 0.0 0.0
Bueno 0.0 0.7 0.3 0.0
Promedio 0.0 0.0 0.6 0.4
Malo 0.0 0.0 0.0 1.0
#Matriz con las ecuaciones de Bellmann
Ft_optimo = matrix(0,nrow = length(estados), ncol = Tmax)
dimnames(Ft_optimo) = list(estados,seq(1:Tmax))
#Matriz con las decisiones optimas
Mat_Dec_Optimo = matrix(0,nrow = length(estados), ncol = Tmax)
dimnames(Mat_Dec_Optimo) = list(estados,seq(1:Tmax))
#---------------------Recursión hacia atras de la semana 3-----------------------------
#Crear las funciones de Bellman f_3(i)
f_i = matrix(0, nrow = length(estados), ncol = length(decisiones))
dimnames(f_i) = list(estados,decisiones)
#En la ultima epoca la ecuación de Bellman es el retorno inmediato
f_i = retorno_inmediato
f_i
Reemplazar No reemplazar
Excelente -1e+07 100
Bueno -1e+02 80
Promedio -1e+02 50
Malo -1e+02 10
#Escoger la mejor decisión para cada estado
Ft_optimo[,Tmax] = apply(f_i,1,max)
Ft_optimo
1 2 3
Excelente 0 0 100
Bueno 0 0 80
Promedio 0 0 50
Malo 0 0 10
#apply es una función que aplica una función especificada a las filas
#o columnas de una matriz o DataFrame.
#f_i es la matriz o DataFrame a la que se aplica la función.
#1 indica el margen a lo largo del cual se aplica la función.
#En este caso, 1 indica que la función debe aplicarse a las filas.
#Si fuera 2, la función se aplicaría a las columnas.
#max es la función que se va a aplicar.
#Por lo tanto, apply(f_i, 1, max) aplicará la función
#max a cada fila de la matriz o DataFrame f_i.
#El resultado será un vector que contiene el valor máximo de cada fila.
Mat_Dec_Optimo[,Tmax] = decisiones[apply(f_i,1,which.max)]
#----------------------Recursion hacia atras------------------------------#
for(t in (Tmax-1):1){
# Crear las funciones de Bellman - guarda la ecuacion
f_i<- matrix(0,nrow=length(estados),ncol=length(decisiones))
dimnames(f_i) <- list(estados,decisiones)
f_i[,"Reemplazar"] <- retorno_inmediato[,"Reemplazar"] + p_Reemplazar%*%Ft_optimo[,t+1]
f_i[,"No reemplazar"] <- retorno_inmediato[,"No reemplazar"] + p_NO_reemplazar%*%Ft_optimo[,t+1]
# Maximo
Ft_optimo[,t] <- apply(f_i, 1, max)
Mat_Dec_Optimo[,t]<- decisiones[apply(f_i, 1, which.max)]
}
Mat_Dec_Optimo
1 2 3
Excelente "No reemplazar" "No reemplazar" "No reemplazar"
Bueno "No reemplazar" "No reemplazar" "No reemplazar"
Promedio "No reemplazar" "No reemplazar" "No reemplazar"
Malo "Reemplazar" "No reemplazar" "No reemplazar"
# Mapa de Calor -----------------------------------------------------------
library(magrittr)
library(dplyr)
library(tidyr)
library(ggplot2)
Mat_Dec_Optimo <- data.frame(Mat_Dec_Optimo)
dimnames(Mat_Dec_Optimo) <- list(estados,seq(1:Tmax))
# Unir todas las épocas y decisiones
Mat_Dec_Optimo <- gather(Mat_Dec_Optimo, Epocas, Decision)
# rep genera una lista de valores iguales a los estados
Mat_Dec_Optimo$Estado <- rep(estados,Tmax)
# Convertir a número
Mat_Dec_Optimo$Epocas <- as.numeric(Mat_Dec_Optimo$Epocas)
# Graficar
ggplot(data = Mat_Dec_Optimo, aes(x = Epocas, y = Estado, fill = Decision)) + geom_tile()+ ylim("Malo","Promedio","Bueno","Excelente") + labs(x = "Epocas")

LS0tDQp0aXRsZTogIlNEUCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyfQ0KDQojTnVtZXJvIGRlIGVwb2Nhcw0KVG1heCA9IDMNCg0KI0VzdGFkb3MgDQplc3RhZG9zID0gYygnRXhjZWxlbnRlJywnQnVlbm8nLCdQcm9tZWRpbycsJ01hbG8nKQ0KDQojRGVjaXNpb25lcw0KZGVjaXNpb25lcyA9IGMoIlJlZW1wbGF6YXIiLCdObyByZWVtcGxhemFyJykNCg0KI1JldG9ybm9zIGlubWVkaWF0b3MNCg0KZGF0b3NfcmV0b3Jub3MgPSBjKC0xZTcsMTAwLA0KICAgICAgICAgICAgICAgICAgIC0xMDAsODAsDQogICAgICAgICAgICAgICAgICAgLTEwMCw1MCwNCiAgICAgICAgICAgICAgICAgICAtMTAwLDEwKQ0KDQpyZXRvcm5vX2lubWVkaWF0byA9IG1hdHJpeChkYXRvc19yZXRvcm5vcyxieXJvdyA9IFQsIG5yb3cgPSA0LCBuY29sID0gMikNCmRpbW5hbWVzKHJldG9ybm9faW5tZWRpYXRvKSA9IGxpc3QoZXN0YWRvcyxkZWNpc2lvbmVzKQ0KcmV0b3Jub19pbm1lZGlhdG8NCg0KI0VzdGFkbyBmdXR1cm8gLSBNYXRyaWNlcyBkZSBwcm9iYWJpbGlkYWQNCg0KI0RlY2lzacOzbiBkZSByZWVtcGxhemFyDQpkYXRvc19SZWVtcGxhemFyID0gYygwICAsMCAgLDAsMCwNCiAgICAgICAgICAgICAgICAgICAgIDAuNywwLjMsMCwwLA0KICAgICAgICAgICAgICAgICAgICAgMC43LDAuMywwLDAsDQogICAgICAgICAgICAgICAgICAgICAwLjcsMC4zLDAsMCkNCg0KcF9SZWVtcGxhemFyID0gbWF0cml4KGRhdG9zX1JlZW1wbGF6YXIsIGJ5cm93ID0gVCwgbmNvbCA9IDQsIG5yb3cgPSA0KQ0KZGltbmFtZXMocF9SZWVtcGxhemFyKSA9IGxpc3QoZXN0YWRvcyxlc3RhZG9zKQ0KcF9SZWVtcGxhemFyDQoNCiNEZWNpc2nDs24gZGUgTk8gcmVlbXBsYXphcg0KDQpkYXRvc19Ob3JlZW1wbGF6YXIgPSBjKDAuNywwLjMsMCwwLA0KICAgICAgICAgICAgICAgICAgICAgICAwLDAuNywwLjMsMCwNCiAgICAgICAgICAgICAgICAgICAgICAgMCwwLDAuNiwwLjQsDQogICAgICAgICAgICAgICAgICAgICAgIDAsMCwwLDEpDQoNCnBfTk9fcmVlbXBsYXphciA9IG1hdHJpeChkYXRvc19Ob3JlZW1wbGF6YXIsIGJ5cm93ID0gVCwgbmNvbCA9IDQsIG5yb3cgPSA0KQ0KZGltbmFtZXMocF9OT19yZWVtcGxhemFyKSA9IGxpc3QoZXN0YWRvcyxlc3RhZG9zKQ0KcF9OT19yZWVtcGxhemFyDQoNCiNNYXRyaXogY29uIGxhcyBlY3VhY2lvbmVzIGRlIEJlbGxtYW5uDQpGdF9vcHRpbW8gPSBtYXRyaXgoMCxucm93ID0gbGVuZ3RoKGVzdGFkb3MpLCBuY29sID0gVG1heCkNCmRpbW5hbWVzKEZ0X29wdGltbykgPSBsaXN0KGVzdGFkb3Msc2VxKDE6VG1heCkpDQoNCg0KI01hdHJpeiBjb24gbGFzIGRlY2lzaW9uZXMgb3B0aW1hcw0KTWF0X0RlY19PcHRpbW8gPSBtYXRyaXgoMCxucm93ID0gbGVuZ3RoKGVzdGFkb3MpLCBuY29sID0gVG1heCkNCmRpbW5hbWVzKE1hdF9EZWNfT3B0aW1vKSA9IGxpc3QoZXN0YWRvcyxzZXEoMTpUbWF4KSkNCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLVJlY3Vyc2nDs24gaGFjaWEgYXRyYXMgZGUgbGEgc2VtYW5hIDMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojQ3JlYXIgbGFzIGZ1bmNpb25lcyBkZSBCZWxsbWFuIGZfMyhpKQ0KZl9pID0gbWF0cml4KDAsIG5yb3cgPSBsZW5ndGgoZXN0YWRvcyksIG5jb2wgPSBsZW5ndGgoZGVjaXNpb25lcykpDQpkaW1uYW1lcyhmX2kpID0gbGlzdChlc3RhZG9zLGRlY2lzaW9uZXMpDQoNCiNFbiBsYSB1bHRpbWEgZXBvY2EgbGEgZWN1YWNpw7NuIGRlIEJlbGxtYW4gZXMgZWwgcmV0b3JubyBpbm1lZGlhdG8NCmZfaSA9IHJldG9ybm9faW5tZWRpYXRvDQpmX2kNCg0KI0VzY29nZXIgbGEgbWVqb3IgZGVjaXNpw7NuIHBhcmEgY2FkYSBlc3RhZG8NCkZ0X29wdGltb1ssVG1heF0gPSBhcHBseShmX2ksMSxtYXgpDQpGdF9vcHRpbW8NCiNhcHBseSBlcyB1bmEgZnVuY2nDs24gcXVlIGFwbGljYSB1bmEgZnVuY2nDs24gZXNwZWNpZmljYWRhIGEgbGFzIGZpbGFzIA0KI28gY29sdW1uYXMgZGUgdW5hIG1hdHJpeiBvIERhdGFGcmFtZS4NCg0KI2ZfaSBlcyBsYSBtYXRyaXogbyBEYXRhRnJhbWUgYSBsYSBxdWUgc2UgYXBsaWNhIGxhIGZ1bmNpw7NuLg0KDQojMSBpbmRpY2EgZWwgbWFyZ2VuIGEgbG8gbGFyZ28gZGVsIGN1YWwgc2UgYXBsaWNhIGxhIGZ1bmNpw7NuLiANCiNFbiBlc3RlIGNhc28sIDEgaW5kaWNhIHF1ZSBsYSBmdW5jacOzbiBkZWJlIGFwbGljYXJzZSBhIGxhcyBmaWxhcy4gDQojU2kgZnVlcmEgMiwgbGEgZnVuY2nDs24gc2UgYXBsaWNhcsOtYSBhIGxhcyBjb2x1bW5hcy4NCg0KI21heCBlcyBsYSBmdW5jacOzbiBxdWUgc2UgdmEgYSBhcGxpY2FyLg0KDQojUG9yIGxvIHRhbnRvLCBhcHBseShmX2ksIDEsIG1heCkgYXBsaWNhcsOhIGxhIGZ1bmNpw7NuIA0KI21heCBhIGNhZGEgZmlsYSBkZSBsYSBtYXRyaXogbyBEYXRhRnJhbWUgZl9pLiANCiNFbCByZXN1bHRhZG8gc2Vyw6EgdW4gdmVjdG9yIHF1ZSBjb250aWVuZSBlbCB2YWxvciBtw6F4aW1vIGRlIGNhZGEgZmlsYS4NCg0KTWF0X0RlY19PcHRpbW9bLFRtYXhdID0gZGVjaXNpb25lc1thcHBseShmX2ksMSx3aGljaC5tYXgpXQ0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVJlY3Vyc2lvbiBoYWNpYSBhdHJhcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMNCg0KDQpmb3IodCBpbiAoVG1heC0xKToxKXsNCiAgDQogICMgQ3JlYXIgbGFzIGZ1bmNpb25lcyBkZSBCZWxsbWFuIC0gZ3VhcmRhIGxhIGVjdWFjaW9uDQogIGZfaTwtIG1hdHJpeCgwLG5yb3c9bGVuZ3RoKGVzdGFkb3MpLG5jb2w9bGVuZ3RoKGRlY2lzaW9uZXMpKQ0KICBkaW1uYW1lcyhmX2kpIDwtIGxpc3QoZXN0YWRvcyxkZWNpc2lvbmVzKQ0KICANCiAgZl9pWywiUmVlbXBsYXphciJdIDwtIHJldG9ybm9faW5tZWRpYXRvWywiUmVlbXBsYXphciJdICsgcF9SZWVtcGxhemFyJSolRnRfb3B0aW1vWyx0KzFdDQogIGZfaVssIk5vIHJlZW1wbGF6YXIiXSA8LSByZXRvcm5vX2lubWVkaWF0b1ssIk5vIHJlZW1wbGF6YXIiXSArIHBfTk9fcmVlbXBsYXphciUqJUZ0X29wdGltb1ssdCsxXQ0KICANCiAgIyBNYXhpbW8NCiAgRnRfb3B0aW1vWyx0XSA8LSBhcHBseShmX2ksIDEsIG1heCkNCiAgTWF0X0RlY19PcHRpbW9bLHRdPC0gZGVjaXNpb25lc1thcHBseShmX2ksIDEsIHdoaWNoLm1heCldDQogIA0KfQ0KTWF0X0RlY19PcHRpbW8NCg0KIyBNYXBhIGRlIENhbG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCg0KbGlicmFyeShtYWdyaXR0cikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQpNYXRfRGVjX09wdGltbyA8LSBkYXRhLmZyYW1lKE1hdF9EZWNfT3B0aW1vKQ0KZGltbmFtZXMoTWF0X0RlY19PcHRpbW8pIDwtIGxpc3QoZXN0YWRvcyxzZXEoMTpUbWF4KSkNCg0KIyBVbmlyIHRvZGFzIGxhcyDDqXBvY2FzIHkgZGVjaXNpb25lcw0KTWF0X0RlY19PcHRpbW8gPC0gZ2F0aGVyKE1hdF9EZWNfT3B0aW1vLCBFcG9jYXMsIERlY2lzaW9uKQ0KDQojIHJlcCBnZW5lcmEgdW5hIGxpc3RhIGRlIHZhbG9yZXMgaWd1YWxlcyBhIGxvcyBlc3RhZG9zDQpNYXRfRGVjX09wdGltbyRFc3RhZG8gPC0gcmVwKGVzdGFkb3MsVG1heCkNCg0KIyBDb252ZXJ0aXIgYSBuw7ptZXJvDQpNYXRfRGVjX09wdGltbyRFcG9jYXMgPC0gYXMubnVtZXJpYyhNYXRfRGVjX09wdGltbyRFcG9jYXMpDQoNCiMgR3JhZmljYXINCmdncGxvdChkYXRhID0gTWF0X0RlY19PcHRpbW8sIGFlcyh4ID0gRXBvY2FzLCB5ID0gRXN0YWRvLCBmaWxsID0gRGVjaXNpb24pKSArIGdlb21fdGlsZSgpKyB5bGltKCJNYWxvIiwiUHJvbWVkaW8iLCJCdWVubyIsIkV4Y2VsZW50ZSIpICsgbGFicyh4ID0gIkVwb2NhcyIpDQpgYGANCg0KDQo=