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