Deixe ser um gráfico, e deixá- e seja dois vértices de . Podemos amostrar eficientemente um caminho - mais curto de maneira uniforme e independente, aleatoriamente, a partir do conjunto de todos os caminhos mais curtos entre e ? Por simplicidade, podemos assumir que é simples, sem direção e sem ponderação.s t G s t s t G
Mesmo em muitos gráficos limitados, o número de caminhos mais curtos entre e podem ser exponencial do tamanho de . Portanto, gostaríamos naturalmente de evitar calcular todos os caminhos - curtos. Não conheço o caso geral, mas parece-me que podemos conseguir isso para algumas classes gráficas especiais.t G s t
Parece algo que alguém deve ter considerado antes. Existe alguma pesquisa existente sobre isso, ou é de fato simples, mesmo para gráficos gerais?
Respostas:
Não tenho 100% de certeza de que esta resposta esteja correta, mas aqui vai:
Eu acho que você pode reduzir isso para qualquer caminho uniformemente aleatório, de , em um DAG com uma única fonte e um único coletor.s - t
Dado um gráficoG
Essencialmente, estou recolher todos os nós possíveis que podem ser usados no caminho mais curto, e colocando-os em .H
Mais sobre como isso funciona:
Agora temos um DAG que podemos percorrer de qualquer forma a partir de e obter um caminho mais curto e invertido de . O gráfico deve ter como a única fonte como o único coletor.s - t t st−s s−t t s
Se o exposto acima estiver correto, acho que podemos dar um passo adiante e resolver o problema da seguinte maneira.
Atribua a cada nó no DAG um peso de nó; o peso do nó será o número de caminhos desse nó para . Vamos chamar isso de .w ( v )s w ( v )
Você pode calcular estes rapidamente, ver algoritmo que encontra o número de caminhos simples de s para t em G .
Depois de termos o peso do nó, podemos escolher um caminho uniformemente:
Layout do DAG como uma estrutura de nível (para visualização)Em cada nível, escolha uma ordem arbitrária entre os nós, ie. uma noção de "esquerda para a direita".fonte
Aqui está uma solução baseada nas idéias da resposta de Realz Slaw. É basicamente uma reexposição de suas idéias que pode ser mais clara ou mais fácil de seguir. O plano é que prosseguiremos em duas etapas:
Em primeiro lugar, vamos construir um gráfico com a seguinte propriedade: qualquer caminho de a em é um caminho mais curto de a em , e cada caminho mais curto de a em também está presente em . Assim, contém exatamente os caminhos mais curtos em : todos os caminhos mais curtos e nada mais. Por acaso, será um DAG.s t S s t L s T L S S G SS s t S s t G s t G S S G S
Em seguida, vamos amostra uniformemente aleatoriamente a partir de todos os caminhos de a em .t Ss t S
Essa abordagem generaliza para um gráfico direcionado arbitrário , desde que todas as arestas tenham peso positivo, então vou explicar meu algoritmo nesses termos. Seja o peso na borda . (Este generaliza a declaração do problema que você deu. Se você tem um gráfico não ponderado, simplesmente assumir cada aresta tem peso 1. Se você tiver um grafo não direcionado, tratar cada aresta sem direção como as duas arestas dirigidas e )w ( u , v ) u → v ( u , v ) u → v v → uG w(u,v) u→v (u,v) u→v v→u
Passo 1: extracto de .S Execute um algoritmo de caminhos mais curtos de fonte única (por exemplo, algoritmo de Dijkstra) em , iniciando na fonte . Para cada vértice em , deixe denotar a distância de a .s v G d ( s , v ) s vG s v G d(s,v) s v
Agora defina o gráfico seguinte maneira. Consiste em toda aresta modo que (1) seja uma aresta em G e (2) d ( s , v ) = d ( s , u ) + w ( u , v ) .u → v u → vS u→v u→v G d(s,v)=d(s,u)+w(u,v)
O gráfico possui algumas propriedades convenientes:S
Todo caminho mais curto de a em existe como um caminho em : um caminho mais curto em tem a propriedade de que , assim que a borda está presente em .t G S s = v 0 , v 1 , v 2 , … , v k = t G d ( s , v i + 1 ) = d ( s , v i ) + w ( v i , v i + 1 ) v i → v i + 1 Ss t G S s=v0,v1,v2,…,vk=t G d(s,vi+1)=d(s,vi)+w(vi,vi+1) vi→vi+1 S
Cada caminho em a partir de a é um caminho mais curto em . Em particular, considere qualquer caminho em de a , diga . Seu comprimento é dado pela soma dos pesos de suas arestas, ou seja, , mas pela definição de , essa soma é , que é telescópico para . este caminho é um caminho mais curto de a em .s t G S s t s = v 0 , v 1 , v 2 , … , v k = t ∑ k i = 1 w ( v i - 1 , v i ) S ∑ k i = 1 ( d ( s , v i ) - d ( s , v i -S s t G S s t s=v0,v1,v2,…,vk=t ∑ki=1w(vi−1,vi) S d(s,t)-d(s,s)=d(s,t)stG∑ki=1(d(s,vi)−d(s,vi−1) d(s,t)−d(s,s)=d(s,t) s t G
Finalmente, a ausência de arestas de peso zero em implica que é um dag.SG S
Etapa 2: experimente um caminho aleatório. Agora podemos jogar fora os pesos nas bordas em , e provar um caminho aleatório de para em .s t SS s t S
Para ajudar, faremos uma pré-computação para calcular para cada vértice em , em que conta o número de caminhos distintos de a . Essa pré-computação pode ser feita em tempo linear, varrendo os vértices de na ordem classificada topologicamente, usando a seguinte relação de recorrência:v S n ( v ) v t Sn(v) v S n(v) v t S
onde indica os sucessores de , ou seja, e onde temos o caso base .v succ ( v ) = { w : v → w é uma aresta em S } n ( t ) = 1succ(v) v succ(v)={w:v→w is an edge in S} n(t)=1
Em seguida, usamos a anotação para provar um caminho aleatório. Primeiro visitamos o nó . Em seguida, escolhemos aleatoriamente um dos sucessores de , com o sucessor ponderado por . Em outras palavras:s s w n ( w )n(⋅) s s w n(w)
Para escolher um caminho aleatório, repetimos repetidamente este processo: ou seja, e v i + 1 = ( v i ) . O caminho resultante é o caminho desejado e será amostrado uniformemente aleatoriamente em todos os caminhos mais curtos, de s a t .v0=s vi+1= (vi) s t
choosesuccessor
Espero que isso ajude você a entender a solução de Realz Slaw mais facilmente. Todo o crédito a Realz Slaw pela solução bonita e limpa para esse problema!
O único caso que não trata é o caso em que algumas arestas têm peso 0 ou peso negativo. No entanto, o problema potencialmente não está bem definido nesse caso, pois você pode ter infinitamente muitos caminhos mais curtos.
fonte