하자 그래프, 그리고하자 과 두 꼭지점 . 우리는 효율적 짧은 샘플링 수 - 사이에있는 모든 최단 경로들의 세트로부터 임의로 독립적으로 클리핑 및 ? 간단히하기 위해 는 단순하고 방향이 지정되지 않고 가중치가 없다고 가정 할 수 있습니다 .G
많은 제한된 그래프에서도 가장 짧은 경로의 수 s
이것은 누군가가 전에 고려해야했던 것 같습니다. 이것에 대한 기존 연구가 있습니까? 아니면 일반 그래프에서도 간단하게 수행 할 수 있습니까?
하자 그래프, 그리고하자 과 두 꼭지점 . 우리는 효율적 짧은 샘플링 수 - 사이에있는 모든 최단 경로들의 세트로부터 임의로 독립적으로 클리핑 및 ? 간단히하기 위해 는 단순하고 방향이 지정되지 않고 가중치가 없다고 가정 할 수 있습니다 .G
많은 제한된 그래프에서도 가장 짧은 경로의 수 s
이것은 누군가가 전에 고려해야했던 것 같습니다. 이것에 대한 기존 연구가 있습니까? 아니면 일반 그래프에서도 간단하게 수행 할 수 있습니까?
답변:
나는이 대답이 정확하다는 것을 100 % 확신하지 못하지만 여기에 간다.
단일 소스와 단일 싱크가있는 DAG 에서 s - t 에서 임의의 경로를 균일하게 무작위로 줄이기 위해 이것을 줄일 수 있다고 생각합니다 .
주어진 그래프 G
기본적으로 가장 짧은 경로에서 사용할 수있는 모든 가능한 노드를 수집하여 H에 배치합니다 .
작동 방식에 대한 추가 정보 :
Dijkstra의 최단 경로 알고리즘은 먼저 BFS를 실행하고 모든 노드 v ∈ G 에 s - v 의 최단 경로를 표시하여 작동합니다 . 다음 단계는 t - s 에서 되돌아 가서 가장 적은 이웃 노드를 다시 따르는 것입니다.
v∈G s−v t−s 문제는 여기에 당신이 선택할 수 있습니다 어떤 최소한의 이웃 노드를. 여기서하는 것은 각 단계마다 가장 적은 이웃 노드를 모두 모으는 것 입니다. 즉, 모든 최단 경로를 설명합니다.
이제 당신은 빨리 생각하지만, 왜 그것들을 기하 급수적 으로 열거하고 있지만 내 방식은 그렇지 않습니까?
대답은 동일한 노드를 두 번 추가하지 않도록 세트를 사용하기 때문에 가능한 각 경로에 대해 다시 계산하지 않는 것입니다.
이제 우리는 t - s 에서 어떤 식 으로든 통과하고 s - t 에서 최단 역전 경로를 얻을 수있는 DAG를 갖습니다 . 그래프는 유일한 소스로 t 를, 유일한 싱크로 s 를 가져야합니다 .
위의 내용이 맞으면 다음 단계로 진행하여 문제를 해결할 수 있다고 생각합니다.
DAG의 각 노드에 노드 가중치를 부여하십시오. 노드 가중치는 해당 노드에서 s 까지의 경로 수입니다 . 이것을 w ( v ) 라고하자 .
이를 빠르게 계산할 수 있습니다 . G에서 s에서 t까지의 간단한 경로 수를 찾는 알고리즘을 참조하십시오 .
노드 가중치가 있으면 다음과 같이 경로를 균일하게 선택할 수 있습니다.
다음은 Realz Slaw의 아이디어를 기반으로 한 솔루션입니다. 기본적으로 그의 아이디어를 더 명확하고 쉽게 따라 할 수있는 표현입니다. 계획은 다음 두 단계로 진행됩니다.
첫째, 우리는 그래프 만들 것이다 S를 다음의 속성 : 어떠한 경로 들 에 t 에서 S는 최단 경로 들 로 t 에서 G 와 매주 최단 경로 들 로 t 에서 G 로도 존재 S . 따라서 S 에는 G 에서 가장 짧은 경로가 포함됩니다 . 모든 가장 짧은 경로는 더 이상 없습니다. 공교롭게도, S는 DAG에있을 것입니다.
다음 으로 S 의 s 에서 t 까지 모든 경로에서 무작위로 균일하게 샘플링 합니다.
이 접근법 은 모든 모서리가 양의 가중치 를 갖는 한 임의의 지향성 그래프 G로 일반화 하므로 알고리즘에 대해 설명하겠습니다. 보자 승 ( 유 , V ) 가장자리에 무게를 나타내는 U를 → V . (이것은 당신이 준 문제 진술을 일반화합니다. 비가 중 그래프가있는 경우, 모든 모서리의 가중치가 1이라고 가정하십시오. 비 방향 그래프가있는 경우, 각각의 비 방향성 에지 ( u , v ) 를 두 개의 방향성 모서리 u → v 및 v로 취급하십시오 → 유 .)
단계 1 : 추출 S .
이제 다음과 같이 그래프 S 를 정의하십시오 . (1) u → v 가 G 의 모서리 이고 (2) d ( s , v ) = d ( s , u ) + w ( u , v ) 가되도록 모든 모서리 u → v 로 구성됩니다 .
그래프 S 에는 몇 가지 편리한 속성이 있습니다.
매주 최단 경로 들 로 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
S 에서 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 )
마지막으로, G 에 제로 웨이트 엣지가 없다는 것은 S 가 무시 된다는 것을 의미합니다 .
2 단계 : 임의의 경로를 샘플링합니다. 이제 우리는의 가장자리에 가중치 멀리 던질 수있는 S를 , 그리고에서 임의의 경로 샘플 들 에 t 에서 S .
이를 돕기 위해 S의 각 정점 v 에 대해 n ( v ) 을 계산하기 위해 사전 계산을 수행합니다 . 여기서 n ( v ) 는 v 에서 t 까지의 고유 경로 수를 계산합니다 . 이 사전 계산은 다음과 같은 반복 관계를 사용하여 S 의 정점을 위상 적으로 정렬 된 순서 로 스캔하여 선형 시간으로 수행 할 수 있습니다 .
n ( v ) = ∑ w ∈ succ ( v ) n ( w )
여기서 succ ( v ) 는 v 의 후속 작업을 나타냅니다. 즉, succ ( v ) = { w : v → w 는 S } 의 모서리이며 기본 사례는 n ( t ) = 1 입니다.
다음으로, n ( ⋅ ) 주석을 사용하여 임의의 경로를 샘플링합니다. 우리 처음 방문 노드 들 . 그 후, 우리는 임의의 후속의 하나를 선택 (S)을 후속으로, 승 의해 가중 N ( 승 ) . 다시 말해:
choosesuccessor(v):
n = 0
for each w in succ(w):
n = n + n(w)
r = a random integer between 0 and n-1
n = 0
for each w in succ(w):
n = n + n(w)
if r < n:
return w
임의의 경로를 선택하기 위해이 프로세스를 반복적으로 반복합니다. 즉, v 0 = s 및 v i + 1 = ( v i ) . 결과 경로는 원하는 경로이며 s 에서 t 까지 의 모든 최단 경로에서 무작위로 균일하게 샘플링됩니다 .choosesuccessor
이것이 Realz Slaw의 솔루션을 더 쉽게 이해하는 데 도움이되기를 바랍니다. 이 문제에 대한 아름답고 깨끗한 해결책에 대한 Realz Slaw의 모든 공로!
이것이 처리하지 않는 한 가지 경우는 일부 모서리의 무게가 0이거나 음의 가중치입니다. 그러나 최단 경로가 무한히 많을 수 있으므로이 경우 문제가 잘 정의되지 않습니다.