어떤 k-best short-path 알고리즘을 고려해야합니까?


13

그래프 검색 최적화 문제를 해결하고 있습니다. 직접 가중 그래프를 통해 k 개의 비순환 최단 경로를 찾아야합니다.

나는 정확하고 근사한 k-best 알고리즘이 많이 있다는 것을 알고 있지만 최근 연구의 대부분은 매우 크고 매우 드물게 연결된 그래프 (예 : 도로 라우팅 및 방향)를 지향하는 것으로 보이며 내 그래프도 마찬가지입니다.

내 문제의 구별 측면 :

  • 그래프는 대략 160 개의 정점으로 구성됩니다.

  • 그래프는 거의 완전히 연결되어 있습니다 (양방향으로 ~ 160 ^ 2 ~ = 25k 가장자리)

  • k는 매우 작을 것입니다 (아마도 10보다 작음)

  • 최대 경로 길이는 아마도 제한적이며 매우 작을 것입니다 (예 : 3-5 가장자리)

  • 위의 '비순환'이라고 말했지만 반복하기 위해 솔루션에는주기가 포함되어서는 안됩니다. 이것은 1- 최단 최단 경로의 문제는 아니지만 k- 최고의 경우 문제가됩니다. 예를 들어 도로 경로를 고려하십시오. A에서 B까지의 2 번째 최단 경로는 1- 최고와 동일 할 수 있습니다. 어딘가에 블록 주위에 빠른 여행. 수학적으로 최적이지만 매우 유용한 솔루션은 아닙니다. ;-)

  • 계산할 때마다 가장자리의 무게를 다시 조정해야 할 수도 있습니다. 간선 비용은 여러 요인의 가중치 합계로 구성되며 최종 요구 사항 (가져올 때마다)은 가중치를 변경하여 가중치 요소의 우선 순위를 사용자가 지정할 수 있습니다. 상대적으로 작은 그래프이므로 (수백 KB로 표시 할 수 있어야 함) 메모리에서 그래프를 복제하고 다시 가중치를 적용한 다음 복제 된 그래프에서 검색을 실행하는 것이 합리적입니다. 그러나 가중치를 즉시 계산하는 동안 검색을 수행하는보다 효과적인 방법이 있다면 관심이 있습니다.

Santos (K 최단 경로 알고리즘), Eppstein 1997 (k 최단 경로 찾기) 및 기타에 설명 된 알고리즘을보고 있습니다. 엔의 알고리즘은 주로 기존 Java 구현 때문에 중요 합니다 . 나는 연구 논문을 읽는 것이 무서워하지 않지만 문제의 세부 사항을 버리고 독서 시간을 절약하기 위해 포인터를 요구하는 것이 가치 있다고 생각했습니다.

Java 구현에 대한 포인터가 있다면 더 좋습니다.


+1. 사람들이 제안한 것에 관심이 있기 때문에이 사이트에 대한 정확한 질문 유형 인 것 같습니다.
KChaloux

비 주기적 조건이 시작부터 목표까지의 다른 경로가 첫 번째 경로와 함께주기를 생성한다는 것을 의미하지 않습니까? 그리고 출발과 목표가 맹목적인 골목에 있다면, 모든 길은이 두 가장자리를 사용해야합니다.
user470365

어쩌면 나는 명확하지 않았다. 비순환 구속 조건은 단일 경로에만 적용됩니다. 당연히 A에서 B까지의 2 개의 개별 경로가 사이클을 형성합니다.
AaronD

@AaronD : 그렇다면 어느 쪽을 사용하셨습니까?
dagnelies

@arnaud : 아직 알고리즘을 설정했는지 확신 할 수 없습니다. 이 질문에 대한 업데이트를 추가하겠습니다. Eppstein은 비순환 (일명 '간단한') 솔루션을 보장하지 않기 때문에 제거했습니다. 현재 엔의 알고리즘으로 작업하고 있지만 아직 자세한 프로파일 링이나 최적화를 얻지 않았으므로 다른 알고리즘으로 바꿔야 할 수도 있습니다. 다음 주나 2 주 후에 업데이트하겠습니다.
AaronD

답변:


2

내 자신의 질문에 부분적으로 대답하려면 :

이 질문을 게시 한 이후, 우리는 양의 에지 가중치와 양의 값을 처리해야한다는 것을 발견했습니다 (비순환 / 단순 / 루프리스 경로의 제한은 최상의 솔루션이 정의됨을 의미하지만 그 한계가없는 음의 그래프를 통한 최단 경로는 비용주기는 정의되어 있지 않습니다).

엔의 알고리즘과 내가 조사한 다른 것들의 대부분은 일련의 1-best 검색에 의존한다. 대부분 중간 검색에 Dijkstra를 사용합니다. Dijkstra는 네거티브 엣지 웨이트를 지원하지 않지만 Bellman-Ford를 대신 할 수 있습니다 (적어도 엔, 아마도 Lawler 또는 Eppstein에서도). 나는 경로 길이 제한 (가장자리)과 검색 중 명시적인 사이클 검사 (표준 사후 검색주기 감지 대신)로 Bellman-Ford의 수정을 개발했습니다. 계산 복잡성은 나빠지지만 여전히 내 요구 사항에 맞습니다. 이 답변을 수정하고 게시 권한이 있으면 기술 보고서에 연결하겠습니다.


1

나는이 질문을 쉽게 googled 할 수 있으며 복제본이라고 말합니다.

즉, 나는 이미 Eppstein을 사용하고 구현했으며 권장합니다. 나는 그것이 매우 우아하다는 것을 알았다. 내가 올바르게 기억한다면, 그것은 또한 최적 일 수 있으며, 다음 논문은 그것을 아주 잘 설명합니다.

http://pdf.aminer.org/001/059/121/finding_the_k_shortest_paths.pdf


먼저 Eppstein의 추천에 감사드립니다. 더 볼게요. 나는 이것이 정확한 복제본이 아니며 구글하기 쉽지 않다고 주장한다. k-best 알고리즘을 찾는 것은 쉽지만, 그 중에서 현명하게 선택하기는 쉽지 않습니다. 나는이 문제에 대한 것보다 수백만 개의 정점으로 희박하게 연결된 그래프에 대해 매우 다른 알고리즘을 원할 것으로 기대합니다. 10-best 대신 1000-best를 원한다면 k의 복잡성에 대해 더 관심이 있습니다. 그리고 논문을 게시 할 때 지속적인 요소는 그다지 중요하지 않지만, 프로덕션 코드를 배송 할 때는 확실히 중요합니다.
AaronD

@AaronD : 귀하의 정보를 위해서만, 알고리즘은 어떤 경우에도 매우 효율적이라고 생각합니다. 휴리스틱 기반 검색이이를 능가하는 특수한 경우가있을 수 있지만 일반적인 경우에는 매우 효과적이라고 생각합니다. 정확한 성능은 정확히 구현하는 방식, 데이터 구조의 효율성 및 문제에 맞는 방식에 따라 달라질 수 있습니다.
dagnelies

@arnaud 안녕하세요, 귀하의 eppstein 구현을 공유 할 수 있습니까? 비슷한 질문이 여기에 게시되어 있습니다. math.stackexchange.com/questions/1661737/…
Tina J
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.