# Creando el vector de estados --------------------------------------------
estados = c()
for (i in 0:3) {
for (j in 0:2) {
for (k in 0:2) {
#la funcion paste une los indices i,j,k y los separa con una coma
estados = c(estados, paste(i,j,k, sep = ","))
}
}
}
estados
[1] "0,0,0" "0,0,1" "0,0,2" "0,1,0" "0,1,1" "0,1,2" "0,2,0" "0,2,1" "0,2,2" "1,0,0"
[11] "1,0,1" "1,0,2" "1,1,0" "1,1,1" "1,1,2" "1,2,0" "1,2,1" "1,2,2" "2,0,0" "2,0,1"
[21] "2,0,2" "2,1,0" "2,1,1" "2,1,2" "2,2,0" "2,2,1" "2,2,2" "3,0,0" "3,0,1" "3,0,2"
[31] "3,1,0" "3,1,1" "3,1,2" "3,2,0" "3,2,1" "3,2,2"
# ¿Cuantos estados tengo?
length(estados)
[1] 36
# Creando la matriz de tasas ----------------------------------------------
matrizQ = matrix(data = 0, nrow = length(estados), ncol = length(estados),
dimnames = list(estados,estados))
#Noten que debemos separar mi string para conocer el valor de cada varible y convertirlo a #
estados[1]
[1] "0,0,0"
as.numeric(strsplit(estados[1],split = ",")[[1]][3])
[1] 0
for (fila in estados){
for (columna in estados){
#Para conocer los valores de cada variable de estado, vamos a dividir cada estado en sus tres componentes, utilizando strsplit. Para mayor facilidad, convertimos los estados de cada una de las variables en un valor numérico.
i = as.numeric(strsplit(fila, ",")[[1]][1])
j = as.numeric(strsplit(fila, ",")[[1]][2])
k = as.numeric(strsplit(fila, ",")[[1]][3])
#Una vez más, realizamos la división de cada estado en sus tres componentes.
l = as.numeric(strsplit(columna, ",")[[1]][1])
m = as.numeric(strsplit(columna, ",")[[1]][2])
n = as.numeric(strsplit(columna, ",")[[1]][3])
#Definición de la matriz de tasas de transición, de acuerdo con la formulación general mostrada antes.
#Llegadas a la primera zona (prensas presión)
if(i<3 & l==i+1 & m==j & n==k){
matrizQ[fila,columna] = 0.05
}
#Procesamiento máquina satinadora (zona 3)
if(k>0 & l==i & m==j & n==k-1){
matrizQ[fila,columna] = (11/12)*0.2
}
#Procesamiento zona recubrimiento (zona 2)
if(j>0 & k<2 & l==i & m==j-1 & n==k+1){
matrizQ[fila,columna] = 0.125*min(j,2)
}
#Procesamiento prensa presión (zona 1)
if(i>0 & j<2 & l==i-1 & m==j+1 & n==k){
matrizQ[fila,columna] = 0.104
}
}
}
#Llenar la diagonal
for (i in 1:length(estados)) {
matrizQ[i,i] = -sum(matrizQ[i,])
}
rowSums(matrizQ)
0,0,0 0,0,1 0,0,2 0,1,0 0,1,1 0,1,2
0.000000e+00 1.387779e-17 1.387779e-17 1.387779e-17 1.387779e-17 1.387779e-17
0,2,0 0,2,1 0,2,2 1,0,0 1,0,1 1,0,2
1.387779e-17 1.387779e-17 1.387779e-17 0.000000e+00 -2.775558e-17 -2.775558e-17
1,1,0 1,1,1 1,1,2 1,2,0 1,2,1 1,2,2
-2.775558e-17 -2.775558e-17 -2.775558e-17 1.387779e-17 1.387779e-17 1.387779e-17
2,0,0 2,0,1 2,0,2 2,1,0 2,1,1 2,1,2
0.000000e+00 -2.775558e-17 -2.775558e-17 -2.775558e-17 -2.775558e-17 -2.775558e-17
2,2,0 2,2,1 2,2,2 3,0,0 3,0,1 3,0,2
1.387779e-17 1.387779e-17 1.387779e-17 0.000000e+00 1.387779e-17 1.387779e-17
3,1,0 3,1,1 3,1,2 3,2,0 3,2,1 3,2,2
1.387779e-17 1.387779e-17 1.387779e-17 0.000000e+00 0.000000e+00 0.000000e+00
library(markovchain)
cadenaContinua = new(Class = "ctmc", states = estados, byrow = T,
generator = matrizQ)
#Para calcular el tiempo de primera pasada en cadenas continuas usamos la funcion
#expected tie, que recibe como parametros la cadena, el indice del estado inicial y el
#indice del estado final.
ExpectedTime(cadenaContinua, 14, 36)
[1] 44224.58
# a veces tenemos muchos estaods y puedeo ser laborioso encontrar los indices correpondientes
# para eso utilizamos la funcion which
estado_inicial = which(estados == "1,1,1")
estado_final = which(estados == "3,2,2")
ExpectedTime(cadenaContinua, estado_inicial, estado_final)
[1] 44224.58
LS0tDQp0aXRsZTogIkFuYWxpc2lzIGRlIHRpZW1wb3MgcHJvbWVkaW8iDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCg0KYGBge3J9DQoNCg0KDQojIENyZWFuZG8gZWwgdmVjdG9yIGRlIGVzdGFkb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KZXN0YWRvcyA9IGMoKQ0KDQpmb3IgKGkgaW4gMDozKSB7DQogIGZvciAoaiBpbiAwOjIpIHsNCiAgICBmb3IgKGsgaW4gMDoyKSB7DQogICAgICAjbGEgZnVuY2lvbiBwYXN0ZSB1bmUgbG9zIGluZGljZXMgaSxqLGsgeSBsb3Mgc2VwYXJhIGNvbiB1bmEgY29tYQ0KICAgICAgZXN0YWRvcyA9IGMoZXN0YWRvcywgcGFzdGUoaSxqLGssIHNlcCA9ICIsIikpDQogICAgfQ0KICB9DQp9DQplc3RhZG9zDQojIMK/Q3VhbnRvcyBlc3RhZG9zIHRlbmdvPw0KbGVuZ3RoKGVzdGFkb3MpDQoNCg0KIyBDcmVhbmRvIGxhIG1hdHJpeiBkZSB0YXNhcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCm1hdHJpelEgPSBtYXRyaXgoZGF0YSA9IDAsIG5yb3cgPSBsZW5ndGgoZXN0YWRvcyksIG5jb2wgPSBsZW5ndGgoZXN0YWRvcyksDQogICAgICAgICAgICAgICAgIGRpbW5hbWVzID0gbGlzdChlc3RhZG9zLGVzdGFkb3MpKQ0KDQojTm90ZW4gcXVlIGRlYmVtb3Mgc2VwYXJhciBtaSBzdHJpbmcgcGFyYSBjb25vY2VyIGVsIHZhbG9yIGRlIGNhZGEgdmFyaWJsZSB5IGNvbnZlcnRpcmxvIGEgIw0KZXN0YWRvc1sxXQ0KDQoNCmFzLm51bWVyaWMoc3Ryc3BsaXQoZXN0YWRvc1sxXSxzcGxpdCA9ICIsIilbWzFdXVszXSkNCg0KZm9yIChmaWxhIGluIGVzdGFkb3Mpew0KICBmb3IgKGNvbHVtbmEgaW4gZXN0YWRvcyl7DQogICAgDQogICAgI1BhcmEgY29ub2NlciBsb3MgdmFsb3JlcyBkZSBjYWRhIHZhcmlhYmxlIGRlIGVzdGFkbywgdmFtb3MgYSBkaXZpZGlyIGNhZGEgZXN0YWRvIGVuIHN1cyB0cmVzIGNvbXBvbmVudGVzLCB1dGlsaXphbmRvIHN0cnNwbGl0LiBQYXJhIG1heW9yIGZhY2lsaWRhZCwgY29udmVydGltb3MgbG9zIGVzdGFkb3MgZGUgY2FkYSB1bmEgZGUgbGFzIHZhcmlhYmxlcyBlbiB1biB2YWxvciBudW3DqXJpY28uDQogICAgDQogICAgaSA9IGFzLm51bWVyaWMoc3Ryc3BsaXQoZmlsYSwgIiwiKVtbMV1dWzFdKQ0KICAgIGogPSBhcy5udW1lcmljKHN0cnNwbGl0KGZpbGEsICIsIilbWzFdXVsyXSkNCiAgICBrID0gYXMubnVtZXJpYyhzdHJzcGxpdChmaWxhLCAiLCIpW1sxXV1bM10pDQogICAgDQogICAgI1VuYSB2ZXogbcOhcywgcmVhbGl6YW1vcyBsYSBkaXZpc2nDs24gZGUgY2FkYSBlc3RhZG8gZW4gc3VzIHRyZXMgY29tcG9uZW50ZXMuDQogICAgDQogICAgbCA9IGFzLm51bWVyaWMoc3Ryc3BsaXQoY29sdW1uYSwgIiwiKVtbMV1dWzFdKQ0KICAgIG0gPSBhcy5udW1lcmljKHN0cnNwbGl0KGNvbHVtbmEsICIsIilbWzFdXVsyXSkNCiAgICBuID0gYXMubnVtZXJpYyhzdHJzcGxpdChjb2x1bW5hLCAiLCIpW1sxXV1bM10pDQogICAgDQogICAgI0RlZmluaWNpw7NuIGRlIGxhIG1hdHJpeiBkZSB0YXNhcyBkZSB0cmFuc2ljacOzbiwgZGUgYWN1ZXJkbyBjb24gbGEgZm9ybXVsYWNpw7NuIGdlbmVyYWwgbW9zdHJhZGEgYW50ZXMuDQogICAgDQogICAgI0xsZWdhZGFzIGEgbGEgcHJpbWVyYSB6b25hIChwcmVuc2FzIHByZXNpw7NuKQ0KICAgIGlmKGk8MyAmIGw9PWkrMSAmIG09PWogJiBuPT1rKXsNCiAgICAgIG1hdHJpelFbZmlsYSxjb2x1bW5hXSA9IDAuMDUNCiAgICB9DQogICAgDQogICAgI1Byb2Nlc2FtaWVudG8gbcOhcXVpbmEgc2F0aW5hZG9yYSAoem9uYSAzKQ0KICAgIGlmKGs+MCAmIGw9PWkgJiBtPT1qICYgbj09ay0xKXsNCiAgICAgIG1hdHJpelFbZmlsYSxjb2x1bW5hXSA9ICgxMS8xMikqMC4yDQogICAgfQ0KICAgIA0KICAgICNQcm9jZXNhbWllbnRvIHpvbmEgcmVjdWJyaW1pZW50byAoem9uYSAyKQ0KICAgIGlmKGo+MCAmIGs8MiAmIGw9PWkgJiBtPT1qLTEgJiBuPT1rKzEpew0KICAgICAgbWF0cml6UVtmaWxhLGNvbHVtbmFdID0gMC4xMjUqbWluKGosMikNCiAgICB9DQogICAgDQogICAgI1Byb2Nlc2FtaWVudG8gcHJlbnNhIHByZXNpw7NuICh6b25hIDEpDQogICAgaWYoaT4wICYgajwyICYgbD09aS0xICYgbT09aisxICYgbj09ayl7DQogICAgICBtYXRyaXpRW2ZpbGEsY29sdW1uYV0gPSAwLjEwNA0KICAgIH0NCiAgICANCiAgfQ0KfQ0KI0xsZW5hciBsYSBkaWFnb25hbCANCmZvciAoaSBpbiAxOmxlbmd0aChlc3RhZG9zKSkgew0KICBtYXRyaXpRW2ksaV0gPSAtc3VtKG1hdHJpelFbaSxdKQ0KfQ0KDQpyb3dTdW1zKG1hdHJpelEpDQoNCg0KbGlicmFyeShtYXJrb3ZjaGFpbikNCg0KY2FkZW5hQ29udGludWEgPSBuZXcoQ2xhc3MgPSAiY3RtYyIsIHN0YXRlcyA9IGVzdGFkb3MsIGJ5cm93ID0gVCwgDQogICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3IgPSBtYXRyaXpRKQ0KDQoNCiNQYXJhIGNhbGN1bGFyIGVsIHRpZW1wbyBkZSBwcmltZXJhIHBhc2FkYSBlbiBjYWRlbmFzIGNvbnRpbnVhcyB1c2Ftb3MgbGEgZnVuY2lvbg0KI2V4cGVjdGVkIHRpZSwgcXVlIHJlY2liZSBjb21vIHBhcmFtZXRyb3MgbGEgY2FkZW5hLCBlbCBpbmRpY2UgZGVsIGVzdGFkbyBpbmljaWFsIHkgZWwNCiNpbmRpY2UgZGVsIGVzdGFkbyBmaW5hbC4NCg0KRXhwZWN0ZWRUaW1lKGNhZGVuYUNvbnRpbnVhLCAxNCwgMzYpDQoNCiMgYSB2ZWNlcyB0ZW5lbW9zIG11Y2hvcyBlc3Rhb2RzIHkgcHVlZGVvIHNlciBsYWJvcmlvc28gZW5jb250cmFyIGxvcyBpbmRpY2VzIGNvcnJlcG9uZGllbnRlcw0KIyBwYXJhIGVzbyB1dGlsaXphbW9zIGxhIGZ1bmNpb24gd2hpY2gNCg0KZXN0YWRvX2luaWNpYWwgPSB3aGljaChlc3RhZG9zID09ICIxLDEsMSIpDQplc3RhZG9fZmluYWwgPSB3aGljaChlc3RhZG9zID09ICIzLDIsMiIpDQoNCkV4cGVjdGVkVGltZShjYWRlbmFDb250aW51YSwgZXN0YWRvX2luaWNpYWwsIGVzdGFkb19maW5hbCkNCg0KDQpgYGANCg0KDQo=