#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=