Asumiendo que usted tiene un simple directed acyclic graph (DAG), el siguiente enfoque de trabajo para el conteo:
(A^n)_ij
le da el número de caminos de longitud n
entre los nodos y i
j
. Por lo tanto, debe calcular A + A^2 + ... + A^n + ...
para obtener el número total de rutas entre dos nodos. Es esencial que trabaje con un DAG, ya que esto garantiza que sea lo suficientemente grande n
, A^n = 0
. Entonces el resultado se puede escribir como A . (I - A)^(-1)
donde I
es la matriz de identidad.
EDIT:
Realmente no sé R por lo que sólo puede darle un cierto pseudocódigo o explicaciones.
Primero, vamos a encontrar el conjunto de nodos accesibles desde el nodo i
. Definamos el vector v
para que contenga solo ceros, excepto en la posición i
, donde contiene 1. Por ej. para la primera nodo tendrá
v = (1,0,0, ..., 0)
Ahora vamos v_(n+1) = sign(v_n + A . v_n)
, en el que el objetivo de la función es reemplazar sign()
elementos no nulos en 1 y 0. mantener ceros hacer esta iteración hasta que llegue al punto fijo, y usted Tendremos un vector v
con elementos distintos de cero en las posiciones correspondientes a los nodos accesibles desde el nodo i
.
Si en lugar del vector v
comienza con la matriz de identidad (del mismo tamaño que A
), obtendrá los nodos alcanzables para cada otro nodo de una vez.
Ahora tiene el conjunto de nodos alcanzables para cualquier nodo inicial. De forma similar, puede obtener la lista de nodos a partir de los cuales se puede acceder a cualquier nodo objetivo (simplemente invierta los bordes dirigidos, es decirtransponer A
)
A continuación, vamos a recorrer el gráfico y encontrar todas las rutas que necesita.
Esta función recursiva debe hacerlo (pseudocódigo):
traverse(path-so-far, target):
let S = the last element of path-so-far
if S == target:
output path-so-far
return
let N = the set of nodes reachable from S in one step
remove all nodes from N from which the target is not reachable
for each K in N:
traverse(append(path-so-far, K), target)
path-so-far
es la lista de nodos ya visitados; target
es el nodo de destino.
Para un par determinado de nodos de inicio y destino, simplemente haga traverse({start}, target)
.
Tenga en cuenta que el paso en el que eliminamos todos los nodos de la cual el objetivo no es alcanzable sólo está allí para acelerar el recorrido, y no ingresar en "callejones sin salida"
Por ruta, ¿te refieres a rutas sin vértices repetidos? De lo contrario, en tu ejemplo, tendrías infinitas ya que hay un bucle. – Szabolcs
Solo quería encontrar todas las rutas entre dos vértices. El ejemplo es un gráfico dirigido sin ciclos. – malhom