This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.


#Creando el espacio de estados conjunto

#Creando un vector vacio
estados = c()

#Debemos generar todas las posibles combinaciones entre las tres variables, para eso haremos 3 ciclos que
#recorra cada uno de los indices de las variables.

for(i in 0:3){
  for(j in 0:2){
    for(k in 0:2){
      #La funcion paste combinara los argumentos i,j,k y los agrupara como un character separandolos por coma
      #Despues se agregaran al vector de estados
      estados = c(estados,paste(i,j,k, sep = ","))
    }
  }
}

#Creacion de la matriz Q

matrizQ=matrix(0, nrow=length(estados), ncol=length(estados))
dimnames(matrizQ) = list(estados, estados)


#Ahora, al llenar la matriz con las respectivas tasas hay un problema y es que los estados son 
#strings, no solo eso, tambien queremos saber el valor del estado de cada variable.

#Ejemplo

estados[1]
[1] "0,0,0"
strsplit(estados[1],split = ',')[[1]][1]
[1] "0"
for (fila in estados) {
  for (columna in estados) {
    
    #Dividiendo cada estado en sus 3 componentes.Para mayor facilidad convertiremos 
    #los estados en valores numericos
    
    
    # strsplit devuelve una fila. El [[1]] accede al primer elemento de la lista,
    # es decir el vector resultante, el [1] accede al primer elemento del vector
    # resultante
    
    i = as.numeric(strsplit(fila, ',')[[1]][1])
    j = as.numeric(strsplit(fila, ',')[[1]][2])
    k = as.numeric(strsplit(fila, ',')[[1]][3])
    
    ip = as.numeric(strsplit(columna,',')[[1]][1]) #l
    jp = as.numeric(strsplit(columna,',')[[1]][2]) #m
    kp = as.numeric(strsplit(columna,',')[[1]][3]) #n
    
    #Llegadas a la primera zona (prensas presión)
    if(i<3 & ip==i+1 & jp==j & kp==k){
      matrizQ[fila,columna] = (3/60)
    }
    
    #Procesamiento prensa presión
    if(i>0 & j<2 & ip==i-1 & jp==j+1 & kp==k){
      matrizQ[fila,columna] = 0.104
    }
    
    #Procesamiento zona recubrimiento
    if(j>0 & k<2 & ip==i & jp==j-1 & kp==k+1){
      matrizQ[fila,columna] = (1/8)*min(j,2)
    }
    
    #Procesamiento máquina satinadora
    if(k>0 & ip==i & jp==j & kp==k-1){
      matrizQ[fila,columna] = (11/12)*(1/5)
    }
    
  }
}

#Asignar los valores correspondientes a la diagonal de la matriz

for(fila in estados){
  for(columna in estados){
    if(fila==columna){
      matrizQ[fila,columna] = -rowSums(matrizQ)[fila]
    }
  }
}

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 
#Crear la cadena de markov con la libreria markovchain

library(markovchain)

CMTC = new('ctmc', states = estados,
           byrow = TRUE, generator = matrizQ)



# Literal D ---------------------------------------------------------------


#Forma Manual
Qrecortada = matrizQ[-36,-36]

matrizInversa = -solve(Qrecortada)

sum(matrizInversa['1,1,1',])
[1] 44224.58
#Usando la libreria markovchain

#Usando la funcion ExpectedTime que recibe como parametro la cadena de markov,
#el indice del estado inicial y el indice del estado deseado

ExpectedTime(CMTC,14,36)
[1] 44224.58
#Sin embargo es un poco tedioso saber manualmente en que indice esta el estado, para ello
#vamos a usar la funcion which
estado_inicial = which(estados == '1,1,1')
estado_deseado = which(estados == '3,2,2')

ExpectedTime(CMTC,estado_inicial,estado_deseado)
[1] 44224.58

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tDQp0aXRsZTogIkNvbXBsZW1ldGFyaWEgNCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNClRoaXMgaXMgYW4gW1IgTWFya2Rvd25dKGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20pIE5vdGVib29rLiBXaGVuIHlvdSBleGVjdXRlIGNvZGUgd2l0aGluIHRoZSBub3RlYm9vaywgdGhlIHJlc3VsdHMgYXBwZWFyIGJlbmVhdGggdGhlIGNvZGUuIA0KDQpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ3RybCtTaGlmdCtFbnRlciouIA0KDQpgYGB7cn0NCg0KI0NyZWFuZG8gZWwgZXNwYWNpbyBkZSBlc3RhZG9zIGNvbmp1bnRvDQoNCiNDcmVhbmRvIHVuIHZlY3RvciB2YWNpbw0KZXN0YWRvcyA9IGMoKQ0KDQojRGViZW1vcyBnZW5lcmFyIHRvZGFzIGxhcyBwb3NpYmxlcyBjb21iaW5hY2lvbmVzIGVudHJlIGxhcyB0cmVzIHZhcmlhYmxlcywgcGFyYSBlc28gaGFyZW1vcyAzIGNpY2xvcyBxdWUNCiNyZWNvcnJhIGNhZGEgdW5vIGRlIGxvcyBpbmRpY2VzIGRlIGxhcyB2YXJpYWJsZXMuDQoNCmZvcihpIGluIDA6Myl7DQogIGZvcihqIGluIDA6Mil7DQogICAgZm9yKGsgaW4gMDoyKXsNCiAgICAgICNMYSBmdW5jaW9uIHBhc3RlIGNvbWJpbmFyYSBsb3MgYXJndW1lbnRvcyBpLGosayB5IGxvcyBhZ3J1cGFyYSBjb21vIHVuIGNoYXJhY3RlciBzZXBhcmFuZG9sb3MgcG9yIGNvbWENCiAgICAgICNEZXNwdWVzIHNlIGFncmVnYXJhbiBhbCB2ZWN0b3IgZGUgZXN0YWRvcw0KICAgICAgZXN0YWRvcyA9IGMoZXN0YWRvcyxwYXN0ZShpLGosaywgc2VwID0gIiwiKSkNCiAgICB9DQogIH0NCn0NCg0KI0NyZWFjaW9uIGRlIGxhIG1hdHJpeiBRDQoNCm1hdHJpelE9bWF0cml4KDAsIG5yb3c9bGVuZ3RoKGVzdGFkb3MpLCBuY29sPWxlbmd0aChlc3RhZG9zKSkNCmRpbW5hbWVzKG1hdHJpelEpID0gbGlzdChlc3RhZG9zLCBlc3RhZG9zKQ0KDQoNCiNBaG9yYSwgYWwgbGxlbmFyIGxhIG1hdHJpeiBjb24gbGFzIHJlc3BlY3RpdmFzIHRhc2FzIGhheSB1biBwcm9ibGVtYSB5IGVzIHF1ZSBsb3MgZXN0YWRvcyBzb24gDQojc3RyaW5ncywgbm8gc29sbyBlc28sIHRhbWJpZW4gcXVlcmVtb3Mgc2FiZXIgZWwgdmFsb3IgZGVsIGVzdGFkbyBkZSBjYWRhIHZhcmlhYmxlLg0KDQojRWplbXBsbw0KDQplc3RhZG9zWzFdDQoNCnN0cnNwbGl0KGVzdGFkb3NbMV0sc3BsaXQgPSAnLCcpW1sxXV1bMV0NCg0KDQpmb3IgKGZpbGEgaW4gZXN0YWRvcykgew0KICBmb3IgKGNvbHVtbmEgaW4gZXN0YWRvcykgew0KICAgIA0KICAgICNEaXZpZGllbmRvIGNhZGEgZXN0YWRvIGVuIHN1cyAzIGNvbXBvbmVudGVzLlBhcmEgbWF5b3IgZmFjaWxpZGFkIGNvbnZlcnRpcmVtb3MgDQogICAgI2xvcyBlc3RhZG9zIGVuIHZhbG9yZXMgbnVtZXJpY29zDQogICAgDQogICAgDQogICAgIyBzdHJzcGxpdCBkZXZ1ZWx2ZSB1bmEgZmlsYS4gRWwgW1sxXV0gYWNjZWRlIGFsIHByaW1lciBlbGVtZW50byBkZSBsYSBsaXN0YSwNCiAgICAjIGVzIGRlY2lyIGVsIHZlY3RvciByZXN1bHRhbnRlLCBlbCBbMV0gYWNjZWRlIGFsIHByaW1lciBlbGVtZW50byBkZWwgdmVjdG9yDQogICAgIyByZXN1bHRhbnRlDQogICAgDQogICAgaSA9IGFzLm51bWVyaWMoc3Ryc3BsaXQoZmlsYSwgJywnKVtbMV1dWzFdKQ0KICAgIGogPSBhcy5udW1lcmljKHN0cnNwbGl0KGZpbGEsICcsJylbWzFdXVsyXSkNCiAgICBrID0gYXMubnVtZXJpYyhzdHJzcGxpdChmaWxhLCAnLCcpW1sxXV1bM10pDQogICAgDQogICAgaXAgPSBhcy5udW1lcmljKHN0cnNwbGl0KGNvbHVtbmEsJywnKVtbMV1dWzFdKSAjbA0KICAgIGpwID0gYXMubnVtZXJpYyhzdHJzcGxpdChjb2x1bW5hLCcsJylbWzFdXVsyXSkgI20NCiAgICBrcCA9IGFzLm51bWVyaWMoc3Ryc3BsaXQoY29sdW1uYSwnLCcpW1sxXV1bM10pICNuDQogICAgDQogICAgI0xsZWdhZGFzIGEgbGEgcHJpbWVyYSB6b25hIChwcmVuc2FzIHByZXNpw7NuKQ0KICAgIGlmKGk8MyAmIGlwPT1pKzEgJiBqcD09aiAmIGtwPT1rKXsNCiAgICAgIG1hdHJpelFbZmlsYSxjb2x1bW5hXSA9ICgzLzYwKQ0KICAgIH0NCiAgICANCiAgICAjUHJvY2VzYW1pZW50byBwcmVuc2EgcHJlc2nDs24NCiAgICBpZihpPjAgJiBqPDIgJiBpcD09aS0xICYganA9PWorMSAmIGtwPT1rKXsNCiAgICAgIG1hdHJpelFbZmlsYSxjb2x1bW5hXSA9IDAuMTA0DQogICAgfQ0KICAgIA0KICAgICNQcm9jZXNhbWllbnRvIHpvbmEgcmVjdWJyaW1pZW50bw0KICAgIGlmKGo+MCAmIGs8MiAmIGlwPT1pICYganA9PWotMSAmIGtwPT1rKzEpew0KICAgICAgbWF0cml6UVtmaWxhLGNvbHVtbmFdID0gKDEvOCkqbWluKGosMikNCiAgICB9DQogICAgDQogICAgI1Byb2Nlc2FtaWVudG8gbcOhcXVpbmEgc2F0aW5hZG9yYQ0KICAgIGlmKGs+MCAmIGlwPT1pICYganA9PWogJiBrcD09ay0xKXsNCiAgICAgIG1hdHJpelFbZmlsYSxjb2x1bW5hXSA9ICgxMS8xMikqKDEvNSkNCiAgICB9DQogICAgDQogIH0NCn0NCg0KI0FzaWduYXIgbG9zIHZhbG9yZXMgY29ycmVzcG9uZGllbnRlcyBhIGxhIGRpYWdvbmFsIGRlIGxhIG1hdHJpeg0KDQpmb3IoZmlsYSBpbiBlc3RhZG9zKXsNCiAgZm9yKGNvbHVtbmEgaW4gZXN0YWRvcyl7DQogICAgaWYoZmlsYT09Y29sdW1uYSl7DQogICAgICBtYXRyaXpRW2ZpbGEsY29sdW1uYV0gPSAtcm93U3VtcyhtYXRyaXpRKVtmaWxhXQ0KICAgIH0NCiAgfQ0KfQ0KDQpyb3dTdW1zKG1hdHJpelEpDQoNCiNDcmVhciBsYSBjYWRlbmEgZGUgbWFya292IGNvbiBsYSBsaWJyZXJpYSBtYXJrb3ZjaGFpbg0KDQpsaWJyYXJ5KG1hcmtvdmNoYWluKQ0KDQpDTVRDID0gbmV3KCdjdG1jJywgc3RhdGVzID0gZXN0YWRvcywNCiAgICAgICAgICAgYnlyb3cgPSBUUlVFLCBnZW5lcmF0b3IgPSBtYXRyaXpRKQ0KDQoNCg0KIyBMaXRlcmFsIEQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCg0KI0Zvcm1hIE1hbnVhbA0KUXJlY29ydGFkYSA9IG1hdHJpelFbLTM2LC0zNl0NCg0KbWF0cml6SW52ZXJzYSA9IC1zb2x2ZShRcmVjb3J0YWRhKQ0KDQpzdW0obWF0cml6SW52ZXJzYVsnMSwxLDEnLF0pDQoNCg0KI1VzYW5kbyBsYSBsaWJyZXJpYSBtYXJrb3ZjaGFpbg0KDQojVXNhbmRvIGxhIGZ1bmNpb24gRXhwZWN0ZWRUaW1lIHF1ZSByZWNpYmUgY29tbyBwYXJhbWV0cm8gbGEgY2FkZW5hIGRlIG1hcmtvdiwNCiNlbCBpbmRpY2UgZGVsIGVzdGFkbyBpbmljaWFsIHkgZWwgaW5kaWNlIGRlbCBlc3RhZG8gZGVzZWFkbw0KDQpFeHBlY3RlZFRpbWUoQ01UQywxNCwzNikNCg0KI1NpbiBlbWJhcmdvIGVzIHVuIHBvY28gdGVkaW9zbyBzYWJlciBtYW51YWxtZW50ZSBlbiBxdWUgaW5kaWNlIGVzdGEgZWwgZXN0YWRvLCBwYXJhIGVsbG8NCiN2YW1vcyBhIHVzYXIgbGEgZnVuY2lvbiB3aGljaA0KZXN0YWRvX2luaWNpYWwgPSB3aGljaChlc3RhZG9zID09ICcxLDEsMScpDQplc3RhZG9fZGVzZWFkbyA9IHdoaWNoKGVzdGFkb3MgPT0gJzMsMiwyJykNCg0KRXhwZWN0ZWRUaW1lKENNVEMsZXN0YWRvX2luaWNpYWwsZXN0YWRvX2Rlc2VhZG8pDQoNCg0KDQpgYGANCg0KQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkN0cmwrQWx0K0kqLg0KDQpXaGVuIHlvdSBzYXZlIHRoZSBub3RlYm9vaywgYW4gSFRNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvZGUgYW5kIG91dHB1dCB3aWxsIGJlIHNhdmVkIGFsb25nc2lkZSBpdCAoY2xpY2sgdGhlICpQcmV2aWV3KiBidXR0b24gb3IgcHJlc3MgKkN0cmwrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4NCg0KVGhlIHByZXZpZXcgc2hvd3MgeW91IGEgcmVuZGVyZWQgSFRNTCBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yLiBDb25zZXF1ZW50bHksIHVubGlrZSAqS25pdCosICpQcmV2aWV3KiBkb2VzIG5vdCBydW4gYW55IFIgY29kZSBjaHVua3MuIEluc3RlYWQsIHRoZSBvdXRwdXQgb2YgdGhlIGNodW5rIHdoZW4gaXQgd2FzIGxhc3QgcnVuIGluIHRoZSBlZGl0b3IgaXMgZGlzcGxheWVkLg0K