#Definir los componentes del modelo
E = c(1,2,3) #Epocas (1:Bloqueador, 2:Agua, 3:Enlatados)
S = seq(0, 3000, by = 500) #Espacio de estados
A = 0:6 #Decisiones
W = c(500,1000,1500) #Pesos
B = c(8,15,20) #Beneficios
#Definir funcion de costo inmediato
costo = function(t, i, a){
if (a*W[t] <= i) {
resultado = a*B[t] #Si hay espacio disponible para meter 'a objetos (decisión factible)
} else {
resultado = -1e6 #Si no hay espacio disponible para meter 'a objetos (decisión infactible)
}
return(resultado)
}
#Matriz con los valores de las ecuaciones de Bellman
matF <- matrix(0, nrow = length(S), ncol = length(E))
rownames(matF) = S
#Matriz con las decisiones optimas
matDec = matrix('-', nrow = length(S), ncol = length(E))
rownames(matDec) = S
#----------------------------Recursion hacia atras. Ultima epoca--------------------------#
#Definir los valores de las ecuaciones de Bellman en la ultima epoca para cada estado
for (i in S) {
valor = 0
for (a in A) { #Iterar sobre las decisiones
#Calcular el costo inmediato de tomar la decision 'a' en el estado 'i'
valor = costo(length(E), i, a)
#Debemos revisar si la decision 'a' es mejor a las otras decisiones
if (valor > matF[as.character(i),length(E)]) {
#Actualizar el valor de la ecuación de Bellman
matF[as.character(i),length(E)] = valor
#Actualizar la matriz de decisiones optimas
matDec[as.character(i),length(E)] = a
}
}
}
#Recursion hacia atras. Desde la penultima epoca hasta la primera epoca.
for (t in (length(E)-1):1) { #Recorriendo las epocas
for (i in S) { #Recorriendo los estados
valor = -1e6
for (a in A) { # Recorrer las decisiones
#Solo considerar las decisiones factibles
if (a*W[t] <= i) {
#Calcular la suma del costo inmediato y el valor de la ecuación de Bellman en t+1
valor = costo(t, i, a) + matF[as.character(i-a*W[t]),t+1]
#Evaluar si la decision 'a' es mejor que las anteriores decisiones
if (valor >= matF[as.character(i),t]) {
#Actualizar el valor de la ecuación de Bellman
matF[as.character(i),t] = valor
#Actualizar la matriz de las decisiones optimas
matDec[as.character(i),t] = a
}
}
}
}
}
print(matDec)
print(matF)
#Mapa calor
library(reshape2)
library(ggplot2)
# Melt the matrix
decisionesOptimasLista <- melt(matDec)
# Rename columns
colnames(decisionesOptimasLista) <- c("Estado", "Epoca", "Decision")
# Crear el mapa de calor
ggplot(data = decisionesOptimasLista, aes(x = Epoca, y = Estado, fill = Decision)) +
geom_tile() +
scale_fill_brewer(palette = "Reds")
LS0tDQp0aXRsZTogIkREUCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCg0KYGBge3J9DQoNCiNEZWZpbmlyIGxvcyBjb21wb25lbnRlcyBkZWwgbW9kZWxvDQoNCkUgPSBjKDEsMiwzKSAgICAgICAgICAgICAgICAgI0Vwb2NhcyAoMTpCbG9xdWVhZG9yLCAyOkFndWEsIDM6RW5sYXRhZG9zKQ0KUyA9IHNlcSgwLCAzMDAwLCBieSA9IDUwMCkgICAjRXNwYWNpbyBkZSBlc3RhZG9zDQpBID0gMDo2ICAgICAgICAgICAgICAgICAgICAgICNEZWNpc2lvbmVzDQpXID0gYyg1MDAsMTAwMCwxNTAwKSAgICAgICAgICNQZXNvcw0KQiA9IGMoOCwxNSwyMCkgICAgICAgICAgICAgICAjQmVuZWZpY2lvcw0KDQoNCiNEZWZpbmlyIGZ1bmNpb24gZGUgY29zdG8gaW5tZWRpYXRvDQoNCmNvc3RvID0gZnVuY3Rpb24odCwgaSwgYSl7DQogIGlmIChhKldbdF0gPD0gaSkgew0KICAgIHJlc3VsdGFkbyA9IGEqQlt0XSAjU2kgaGF5IGVzcGFjaW8gZGlzcG9uaWJsZSBwYXJhIG1ldGVyICdhIG9iamV0b3MgKGRlY2lzacOzbiBmYWN0aWJsZSkNCiAgfSBlbHNlIHsNCiAgICByZXN1bHRhZG8gPSAtMWU2ICNTaSBubyBoYXkgZXNwYWNpbyBkaXNwb25pYmxlIHBhcmEgbWV0ZXIgJ2Egb2JqZXRvcyAoZGVjaXNpw7NuIGluZmFjdGlibGUpDQogIH0NCiAgcmV0dXJuKHJlc3VsdGFkbykNCn0NCg0KDQojTWF0cml6IGNvbiBsb3MgdmFsb3JlcyBkZSBsYXMgZWN1YWNpb25lcyBkZSBCZWxsbWFuDQptYXRGIDwtIG1hdHJpeCgwLCBucm93ID0gbGVuZ3RoKFMpLCBuY29sID0gbGVuZ3RoKEUpKQ0Kcm93bmFtZXMobWF0RikgPSBTDQoNCiNNYXRyaXogY29uIGxhcyBkZWNpc2lvbmVzIG9wdGltYXMNCm1hdERlYyA9IG1hdHJpeCgnLScsIG5yb3cgPSBsZW5ndGgoUyksIG5jb2wgPSBsZW5ndGgoRSkpDQpyb3duYW1lcyhtYXREZWMpID0gUw0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVJlY3Vyc2lvbiBoYWNpYSBhdHJhcy4gVWx0aW1hIGVwb2NhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jDQoNCg0KI0RlZmluaXIgbG9zIHZhbG9yZXMgZGUgbGFzIGVjdWFjaW9uZXMgZGUgQmVsbG1hbiBlbiBsYSB1bHRpbWEgZXBvY2EgcGFyYSBjYWRhIGVzdGFkbw0KDQpmb3IgKGkgaW4gUykgew0KICB2YWxvciA9IDANCiAgZm9yIChhIGluIEEpIHsgI0l0ZXJhciBzb2JyZSBsYXMgZGVjaXNpb25lcw0KICAgIA0KICAgICNDYWxjdWxhciBlbCBjb3N0byBpbm1lZGlhdG8gZGUgdG9tYXIgbGEgZGVjaXNpb24gJ2EnIGVuIGVsIGVzdGFkbyAnaScNCiAgICB2YWxvciA9IGNvc3RvKGxlbmd0aChFKSwgaSwgYSkNCiAgICANCiAgICAjRGViZW1vcyByZXZpc2FyIHNpIGxhIGRlY2lzaW9uICdhJyBlcyBtZWpvciBhIGxhcyBvdHJhcyBkZWNpc2lvbmVzDQogICAgaWYgKHZhbG9yID4gbWF0Rlthcy5jaGFyYWN0ZXIoaSksbGVuZ3RoKEUpXSkgew0KICAgICAgDQogICAgICAjQWN0dWFsaXphciBlbCB2YWxvciBkZSBsYSBlY3VhY2nDs24gZGUgQmVsbG1hbg0KICAgICAgbWF0Rlthcy5jaGFyYWN0ZXIoaSksbGVuZ3RoKEUpXSA9IHZhbG9yDQogICAgICANCiAgICAgICNBY3R1YWxpemFyIGxhIG1hdHJpeiBkZSBkZWNpc2lvbmVzIG9wdGltYXMNCiAgICAgIG1hdERlY1thcy5jaGFyYWN0ZXIoaSksbGVuZ3RoKEUpXSA9IGENCiAgICAgIA0KICAgIH0NCiAgICANCiAgfQ0KfQ0KDQoNCiNSZWN1cnNpb24gaGFjaWEgYXRyYXMuIERlc2RlIGxhIHBlbnVsdGltYSBlcG9jYSBoYXN0YSBsYSBwcmltZXJhIGVwb2NhLg0KDQpmb3IgKHQgaW4gKGxlbmd0aChFKS0xKToxKSB7ICNSZWNvcnJpZW5kbyBsYXMgZXBvY2FzDQogIGZvciAoaSBpbiBTKSB7ICAgICAgICAgICAgICNSZWNvcnJpZW5kbyBsb3MgZXN0YWRvcw0KICAgIA0KICAgIHZhbG9yID0gLTFlNg0KICAgIGZvciAoYSBpbiBBKSB7ICAgICAgICAgICAjIFJlY29ycmVyIGxhcyBkZWNpc2lvbmVzDQogICAgICANCiAgICAgICNTb2xvIGNvbnNpZGVyYXIgbGFzIGRlY2lzaW9uZXMgZmFjdGlibGVzDQogICAgICBpZiAoYSpXW3RdIDw9IGkpIHsNCiAgICAgICAgDQogICAgICAgICNDYWxjdWxhciBsYSBzdW1hIGRlbCBjb3N0byBpbm1lZGlhdG8geSBlbCB2YWxvciBkZSBsYSBlY3VhY2nDs24gZGUgQmVsbG1hbiBlbiB0KzENCiAgICAgICAgdmFsb3IgPSBjb3N0byh0LCBpLCBhKSArIG1hdEZbYXMuY2hhcmFjdGVyKGktYSpXW3RdKSx0KzFdDQogICAgICAgIA0KICAgICAgICAjRXZhbHVhciBzaSBsYSBkZWNpc2lvbiAnYScgZXMgbWVqb3IgcXVlIGxhcyBhbnRlcmlvcmVzIGRlY2lzaW9uZXMNCiAgICAgICAgaWYgKHZhbG9yID49IG1hdEZbYXMuY2hhcmFjdGVyKGkpLHRdKSB7DQogICAgICAgICAgDQogICAgICAgICAgI0FjdHVhbGl6YXIgZWwgdmFsb3IgZGUgbGEgZWN1YWNpw7NuIGRlIEJlbGxtYW4NCiAgICAgICAgICBtYXRGW2FzLmNoYXJhY3RlcihpKSx0XSA9IHZhbG9yDQogICAgICAgICAgDQogICAgICAgICAgI0FjdHVhbGl6YXIgbGEgbWF0cml6IGRlIGxhcyBkZWNpc2lvbmVzIG9wdGltYXMNCiAgICAgICAgICBtYXREZWNbYXMuY2hhcmFjdGVyKGkpLHRdID0gYQ0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICB9DQp9DQpwcmludChtYXREZWMpDQpwcmludChtYXRGKQ0KDQojTWFwYSBjYWxvcg0KbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkoZ2dwbG90MikNCg0KIyBNZWx0IHRoZSBtYXRyaXgNCmRlY2lzaW9uZXNPcHRpbWFzTGlzdGEgPC0gbWVsdChtYXREZWMpDQoNCiMgUmVuYW1lIGNvbHVtbnMNCmNvbG5hbWVzKGRlY2lzaW9uZXNPcHRpbWFzTGlzdGEpIDwtIGMoIkVzdGFkbyIsICJFcG9jYSIsICJEZWNpc2lvbiIpDQoNCg0KIyBDcmVhciBlbCBtYXBhIGRlIGNhbG9yDQpnZ3Bsb3QoZGF0YSA9IGRlY2lzaW9uZXNPcHRpbWFzTGlzdGEsIGFlcyh4ID0gRXBvY2EsIHkgPSBFc3RhZG8sIGZpbGwgPSBEZWNpc2lvbikpICsNCiAgZ2VvbV90aWxlKCkgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlJlZHMiKQ0KDQoNCg0KDQoNCg0KYGBgDQoNCg0K