Laissez un graphe, et que et deux sommets de . Pouvons-nous échantillonner efficacement un chemin - plus court de manière uniforme et indépendante au hasard dans l'ensemble de tous les chemins les plus courts entre et ? Pour simplifier, nous pouvons supposer que est simple, non orienté et non pondéré.
Même dans de nombreux graphiques restreints, le nombre de chemins les plus courts entre et t peut être exponentielle de la taille de G . Par conséquent, nous aimerions naturellement éviter de calculer réellement tous les chemins s - t les plus courts. Je ne connais pas le cas général, mais il me semble que nous pouvons y parvenir pour certaines classes de graphes spéciales.
Cela ressemble à quelque chose que quelqu'un a dû considérer auparavant. Existe-t-il des recherches à ce sujet, ou est-ce en fait simple à faire, même pour les graphiques généraux?
Réponses:
Je ne suis pas sûr à 100% que cette réponse est correcte, mais voici:
Je pense que vous pouvez réduire cela à n'importe quel chemin uniformément aléatoire, de , dans un DAG avec une seule source et un seul puits.s−t
Étant donné un graphiqueG
Essentiellement, je collectionne tous les nœuds possibles qui peuvent être utilisés dans le plus court chemin, et en les plaçant dans .H
En savoir plus sur le fonctionnement:
Nous avons maintenant un DAG que nous pouvons parcourir de n'importe quelle manière à partir de , et obtenir un chemin inversé le plus court à partir de s - t . Le graphique doit avoir t comme seule source et s comme seul puits.t−s s−t t s
Si ce qui précède est correct, je pense que nous pouvons aller plus loin et résoudre le problème comme suit.
Donnez à chaque nœud du DAG un poids de nœud; le poids du nœud sera le nombre de chemins allant de ce nœud à . Appelons cela w ( v ) .s w(v)
Vous pouvez calculer ces rapidement, voir l' algorithme qui trouve le nombre de chemins simples de s à t dans G .
Une fois que nous avons le poids du nœud, nous pouvons choisir uniformément un chemin en:
Disposition du DAG en tant que structure de niveau (pour la visualisation)À chaque niveau, choisissez un ordre arbitraire entre les nœuds, c'est-à-dire. une notion de "gauche à droite".la source
Voici une solution basée sur les idées de la réponse de Realz Slaw. Il s'agit essentiellement d'une ré-exposition de ses idées qui pourrait être plus claire ou plus facile à suivre. Le plan est que nous allons procéder en deux étapes:
Tout d' abord, nous allons construire un graphique avec la propriété suivante: tout chemin de s à t dans S est un plus court chemin de s à t dans G , et chaque chemin le plus court de s à t dans G est également présent dans S . Ainsi, S contient exactement les chemins les plus courts dans G : tous les chemins les plus courts, et rien de plus. En l'occurrence, S sera un DAG.S s t S s t G s t G S S G S
Ensuite, nous allons prélever uniformément au hasard dans tous les chemins de à t dans S .s t S
This approaches generalizes to an arbitrary directed graphG , as long as all edges have positive weight, so I'll explain my algorithm in those terms. Let w(u,v) denote the weight on the edge u→v . (This generalizes the problem statement you gave. If you have an unweighted graph, just assume every edge has weight 1. If you have an undirected graph, treat each undirected edge (u,v) as the two directed edges u→v and v→u .)
Step 1: extractS . Run a single-source shortest-paths algorithm (e.g., Dijkstra's algorithm) on G , starting from source s . For each vertex v in G , let d(s,v) denote the distance from s to v .
Now define the graphS as follows. It consists of every edge u→v such that (1) u→v is an edge in G , and (2) d(s,v)=d(s,u)+w(u,v) .
The graphS has some convenient properties:
Every shortest path froms to t in G exists as a path in S : a shortest path s=v0,v1,v2,…,vk=t in G has the property that d(s,vi+1)=d(s,vi)+w(vi,vi+1) vi→vi+1 is present in S .
Every path inS from s to t is a shortest path in G . In particular, consider any path in S from s to t , say s=v0,v1,v2,…,vk=t . Its length is given by the sum of the weights of its edges, namely ∑ki=1w(vi−1,vi) , but by the definition of S , this sum is ∑ki=1(d(s,vi)−d(s,vi−1) , which telescopes to d(s,t)−d(s,s)=d(s,t) . Therefore, this path is a shortest path from s to t in G .
Finally, the absence of zero-weight edges inG implies that S is a dag.
Step 2: sample a random path. Now we can throw away the weights on the edges inS , and sample a random path from s to t in S .
To help with this, we will do a precomputation to computen(v) for each vertex v in S , where n(v) counts the number of distinct paths from v to t . This precomputation can be done in linear time by scanning the vertices of S in topologically sorted order, using the following recurrence relation:
wheresucc(v) denotes the successors of v , i.e., succ(v)={w:v→w is an edge in S} , and where we have the base case n(t)=1 .
Next, we use then(⋅) annotation to sample a random path. We first visit node s . Then, we randomly choose one of the successors of s , with successor w weighted by n(w) . In other words:
To choose a random path, we repeatedly iterate this process: i.e.,v0=s , and vi+1= (vi) . The resulting path is the desired path, and it will be sampled uniformly at random from all shortest paths from s to t .
choosesuccessor
Hopefully this helps you understand Realz Slaw's solution more easily. All credit to Realz Slaw for the beautiful and clean solution to this problem!
The one case this doesn't handle is the case where some edges have weight 0 or negative weight. However, the problem is potentially not well-defined in that case, as you can have infinitely many shortest paths.
la source