# Nodos de la cadena PERT
nodos <- c(1, 2, 3, 4)
names(nodos) <- as.character(nodos)
nodos
## 1 2 3 4 
## 1 2 3 4
nodos["1"]
## 1 
## 1
# Arcos de la cadena PERT
arcos <- list(c(1, 2),
              c(2, 3),
              c(2, 4),
              c(3, 4))
names(arcos) <- as.character(arcos)
arcos
## $`c(1, 2)`
## [1] 1 2
## 
## $`c(2, 3)`
## [1] 2 3
## 
## $`c(2, 4)`
## [1] 2 4
## 
## $`c(3, 4)`
## [1] 3 4
arcos["c(1, 2)"]
## $`c(1, 2)`
## [1] 1 2
# Duracion actividades
duracion <- c(2, 5, 8, 4)

names(duracion) <- names(arcos)
duracion
## c(1, 2) c(2, 3) c(2, 4) c(3, 4) 
##       2       5       8       4
duracion["c(1, 2)"]
## c(1, 2) 
##       2
n <- length(nodos)
m <- length(arcos)


# ignorar -----------------------------------------------------------------

# for (i in 1:length(arcos)){
#   print(1 == arcos[[i]])
# }
# 
# for (i in 1:length(arcos)){
#   print(any(1 == arcos[[i]]))
# }
# 
# for (i in 1:length(arcos)){
#   print(1 %in% arcos)
# }

# map_lgl(arcos, ~ 2 %in% .x)

# for (j in nodos){
#   for (i in 1:length(arcos)){
#     print(j == arcos[[i]])
#   }
# }


# utiles ------------------------------------------------------------------


# Para cada nodo, ver si está en un arco
for (n in nodos){
  for (a in arcos){
    print(n == a)
  }
}
## [1]  TRUE FALSE
## [1] FALSE FALSE
## [1] FALSE FALSE
## [1] FALSE FALSE
## [1] FALSE  TRUE
## [1]  TRUE FALSE
## [1]  TRUE FALSE
## [1] FALSE FALSE
## [1] FALSE FALSE
## [1] FALSE  TRUE
## [1] FALSE FALSE
## [1]  TRUE FALSE
## [1] FALSE FALSE
## [1] FALSE FALSE
## [1] FALSE  TRUE
## [1] FALSE  TRUE
# Para cada nodo, ver si está al final de un arco
for (n in nodos){
  for (a in arcos){
    print(n == a[2])
  }
}
## [1] FALSE
## [1] FALSE
## [1] FALSE
## [1] FALSE
## [1] TRUE
## [1] FALSE
## [1] FALSE
## [1] FALSE
## [1] FALSE
## [1] TRUE
## [1] FALSE
## [1] FALSE
## [1] FALSE
## [1] FALSE
## [1] TRUE
## [1] TRUE
# Función antecesor -------------------------------------------------------

antecesores <- function(vertice, nodos, arcos){
  ant <- c() # vector de antecendentes
  for(i in 1:length(arcos)){ # recorrer cada arco
    for(j in 1:length(nodos)){ # probar con cada nodo
      arco_prueba <- c(nodos[j], vertice) # arco de prueba
      prueba <- arco_prueba == arcos[[i]] # ¿el arco generado está en la lista de arocs?
      if( sum(prueba) == 2 ) # en caso de que el arco generado esté en la lista:
        ant = c(ant, nodos[j]) # añadir al conjunto de antecesores
    }
  }
  
  return(ant)
}

# Ejemplo
# cada vector tiene nombres:
antecesores(vertice = 2, nodos = nodos, arcos = arcos) 
## 1 
## 1
antecesores(vertice = 3, nodos = nodos, arcos = arcos)
## 2 
## 2
antecesores(vertice = 4, nodos = nodos, arcos = arcos)
## 2 3 
## 2 3
# Fechas próximas ---------------------------------------------------------

# Paso 1 

# Conjunto de nodos etiquetados
S <- 1

# Conjunto de etiquetas de fecha más próxima
a <- rep(NA, length(nodos))
names(a) <- names(nodos)
a[1] = 0
a
##  1  2  3  4 
##  0 NA NA NA
no_etiquetados_a <- nodos[! nodos %in% S] # nodos no etiquetados
names(no_etiquetados_a) <- NULL # quitar nombres

# Paso 2 - encerrar en un ciclo while minetras alguna entrada del vector a sea NA

# Probar si los antecesores del nodo ya están etiquetados
antecesores_etiquetados_a <- function(nodo){
  ant_nodo <- antecesores(vertice = nodo, 
                          nodos = nodos, 
                          arcos = arcos)
  n <- length(ant_nodo)
  k = 0 # aumentara en 1 por cada nodo etiquetado
  
  for(antecesor in ant_nodo){
    if(antecesor %in% S){
      k = k + 1
    }
  }
  
  return(k == n)
}

# ejemplo
antecesores_etiquetados_a(2)
## [1] TRUE
antecesores_etiquetados_a(3)
## [1] FALSE
antecesores_etiquetados_a(4)
## [1] FALSE
# que nodos se pueden etiquetar?
nodos_por_etiquetar_a <- c()
for (i in no_etiquetados_a){ # Nodos no etiquetados
  if(antecesores_etiquetados_a(i)) # ¿Antecesores etiquetados?
    # En caso de que si, entonces se puede etiquetar:
    nodos_por_etiquetar_a = c(nodos_por_etiquetar_a, i) 
}

# Ahora se pone la etiqueta de fecha más próxima, i.e., etiqueta "a"
for (i in nodos_por_etiquetar_a) { # se recorre los nodos que se etiquetarán
  candidatos_a <- c() # posibles etiquetas
  for (j in antecesores(i, nodos, arcos)) { # se recorre los antecesores
    etiqueta_arco = paste0("c(", as.character(j), ", ", as.character(i), ")")
    valor = a[as.character(j)] + duracion[etiqueta_arco]
    candidatos_a = c(candidatos_a, valor)
  }
  a[as.character(i)] = max(candidatos_a) # etiqueta del nodo
}

# Actualizar S
S = c(S, nodos_por_etiquetar_a)
no_etiquetados_a = nodos[! nodos %in% S]