2011-03-20 3 views
3

최적화 문제가 있습니다.스타 검색 : 많은 노드와 노드 간의 "느린"CheckLink ... 어떤 제안?

평면이있는 점을 나타내는 많은 노드 (10^5) 그래프가 있습니다.

"시작 노드"에서 시작하여 "끝 노드"에 도달하려면 그래프에서 최단 경로를 찾아야합니다.

노드 쌍을 연결하거나 연결하지 않을 수 있습니다. 그들이 연결되어 있는지 확인하는 것은 매우 비용이 많이 드는 작업입니다. 링크가 연결된 경우 링크에 연결된 가중치는 두 노드 사이의 유클리드 거리입니다.

현재 "현재 노드"에서 모든 다른 노드로의 모든 링크 만 확인하여 A *의 "열린 목록"을 채 웁니다. 나는 A *를 선택했다. 그것은 길 찾기에서 최고의 알고리즘 인 것처럼 보이고 노드 J (H = 목표 거리)에 대해 빠르고 허용 가능한 휴리스틱 H를 가졌지 만 그것이 내 문제에 대해 좋은지 확신 할 수 없다.

그래프를 앞면으로 작성하는 것이 관리하기 어렵습니다. N^2 링크를 확인해야합니다. 너무 느립니다. 현재 (almst) 전체 그래프는 솔루션이 없으면 처음부터 끝까지 경로가 만들어지지 않습니다.

더 나은 솔루션에 대한 힌트를 얻고 싶습니다 ... 감사합니다!

+1

CheckLink는 어떻게 구현됩니까? 해결책을 찾을 수 없을 때 거의 완전한 그래프를 작성해야합니다. –

+0

Bresenham 알고리즘 "이미지와 같은"격자 – ugasoft

답변

1

최적의 솔루션을 보장하지 못하는 욕심 많은 알고리즘을 다룰 수있는 경우가 아니라면이 A * 접근 방식은 얻을 수있는 것만 큼 좋습니다. 알고리즘을 사용하면 일부 정점을 프 i (prune) 할 수있는 추가 정보없이 경로가 존재하지 않으면 모든 정점을 검사하지 않을 수 있습니다. 아마도 CheckLink 작업을 최적화 할 수 있을까요? 링크 정보를 더 빠르게 액세스 할 수있는 형식으로 캐싱 할 수 있습니까? 아니면 모든 실행에 대해 "이미지와 같은"데이터가 변경 될 수 있습니까?

+0

+1, A * 여전히 저장 될 수 있지만; 내 대답을 보라. –

2

이것은 실제로 하나의 문제입니다. Bresenham 알고리즘에 익숙하지 않아서 Wikipedia에있는 최적화와 링크를 확인하는 것이 좋습니다.

A *의 경우 : 거의 모든 그래프를 작성하는 것은 이전에 말한 것처럼 거의 피할 수없는 것입니다. 메모리가 느린 경우 반복적 인 최우수 검색이나 IDA * (Russell & Norvig, 2 판의 4 장)와 같은 변형을 사용하여 메모리를 절약하고 메모리를 절약 할 수 있습니다.

그래프에 따라 구조이기 때문에 양방향 검색을 구현하는 것이 좋습니다. 가장 간단한 bidir 알고리즘은 하나의 스레드에서는 A에서 B로, 다른 스레드에서는 B에서 A로 A * 검색을 실행합니다. 둘 중 하나가 솔루션 또는이 멈추었다 고 판단 할 때까지 실행됩니다. 그런 다음 다른 스레드를 죽일 수 있습니다. (하나의 문제는 솔루션이 있다면 많은 시간을 낭비했기 때문에 여분의 프로세서 코어가 유휴 상태 일 경우에만 유용하다는 것입니다.)

더 복잡한 알고리즘을 사용하는 경우에도 두 그래프가 같은 점을 찾았는지 확인한 다음 스레드를 제거하고 결과를 결합하십시오. 이는 두 검색에서 단계를 인터리빙하여 구현할 수 있습니다. 병렬 버전은 상당히 복잡 할 수 있습니다.

+0

나는 양쪽 끝에서 시작하는 것을 잊었다. 그것은 좋은 제안입니다. CheckLink가 잠금을 필요로하지 않으면 병렬 처리가 도움이 될 수도 있습니다. –