2009-11-25 6 views
1

나는 이 적어도 인 경로를 찾기 위해 길 찾기를 수행해야하는 프로젝트에서 작업 중입니다. 나는 그것이 가능한 가장 짧은 루트인지 정말로 신경 쓰지 않는다. 지금까지는 A *가 문제가되지 않았고 솔직히 Prim의 알고리즘을 이해하지 못합니다.가중 경로로 길 찾기

경로를 찾는 데 필요한 종류의지도를 설명하겠습니다. 다음은 예시지도입니다.

+------|-*---- 
+------|----|- 
+--|--------|- 
[email protected]|---------- 

"*"은 시작 위치이고 "@"는 대상입니다. 한 줄의 "+"기호는 a) 한 단계와 동일한 비용을 지불하고 b) 전체 경로의 비용을 반으로 줄이는 직접 경로를 나타냅니다.

이것은 시작 위치에서부터 목적지까지 "+"경로를 통해 10 단계가 있다는 것을 의미하며, 비용은 5가됩니다. 가장 왼쪽의 "|" route "("| "는"- "보다 비용이 적지 만"+ "보다 나쁨)입니다. 비용은 15로 끝납니다. 비용이 5 인 경로는 사용하는 경로입니다.

이제 C#에서 구현하는 데 문제가 있습니다. 나는 현재 방법이 막혔거나 단계의 비용과 새로운 위치로 이동하고 리턴하는 "단계"기능을 가지고있다. 이것은 잘 작동하지만, 현재는 "|" "+"앞에 하나를 발견하면 (즉, 더 빠른 경로를 찾지 못했기 때문에 전체 여행 비용이 훨씬 더 높습니다.)

저는 각 위치를 "방문한"것으로 표시하려고했지만, 가장 저렴한 경로가 다시 루프백 될 가능성이 완전히 있습니다. 또한 각기 고유 한 여러 경로가 있으며 각 경로는 다른 경로 세그먼트 (이전 실행에서 이미 방문했을 수 있음)를 사용할 수 있습니다. 물론 가장 저렴한 경로를 찾으려면 각 경로를 횡단해야하지만 동일한 경로를 반복해서 검색하지 않고이를 수행하는 방법을 알아낼 수는 없습니다.

간단하게 만들면 대상으로 이동할 때만 이동을 제한 할 수 있습니다 (예 : 이동 후 다시 올라갈 수 없음).

누구나 통찰력을 제공 할 수 있다면 좋을 것입니다.

+0

숙제 냄새? –

+0

왜 A *가 문제가되지 않습니까? –

+0

왜 A *가 문제가되지 않습니까? –

답변

4

내가 이해 한 바로는 맵의 '-'필드가 그래프 노드입니다. 각 '-'노드는 이웃 '-'필드에 최대 8 개의 가장자리를가집니다. 대각선 운동을 허용하는 경우 8, 그렇지 않으면 4 개의 인접 '-'노드 만 유효합니다. '-'노드와 '|'노드 사이에 가장자리가 없습니다. 마디.

비어있는 노드 (깊이 우선 LIFO, 너비 우선 FIFO) 및 방문한 노드 목록을 유지하는 간단한 깊이 우선 검색/너비 우선 검색을 구현하기에 충분합니다 (사이클링을 피하기 위해). 두 알고리즘 모두 상대적으로 비효율적이지만 쉽게 개선 할 수 있습니다.

'+'노드의 의미가 확실하지 않습니다. '+'모드에서 다음 '+'모드로 자유로운 이동이 가능합니까? 그렇다면 가장자리 비용을 사용하여이를 모델링 할 수 있습니다. '-'노드로 이동하는 비용은 1이고, '+'에서 '+'노드로 이동하는 것은 비용이 0입니다.

너비 우선 탐색 알고리즘은 가장 짧은 거리를 계산하는 다이 즘 트라 알고리즘으로 확장 될 수 있습니다 한 모든 그래프 에지 음수이기 때문에 소스와 목적지 간의 경로 :

http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

익스트라 알고리즘있어서이를 A* algorithm 만드는 간단한 휴리스틱의 첨가로 개선 될 수있다.2D 좌표계에서 목표의 좌표가있는 경우, 노드와 목표 사이의 유클리드 거리를 사용하여 노드가 가장 적합한 대략적인 추정치를 사용할 수 있습니다. '+'필드가 이동 비용이없는지도를 통과하는 터널 인 경우 A * 알고리즘이 터널을 향해 이동해야하는 경우 목적지까지의 경험적 이동이 잘못 될 수 있기 때문에 그다지 도움이되지 않을 수 있습니다. 목적지로 연결되지 않는 터널이나 터널이 여러 개 있으면 순진한 Dijkstra 알고리즘보다 경험적으로 더 나은 방법이 없을 수 있습니다.

최저 비용 경로에 루프가 포함될 수 없다는 점에 유의하십시오. 최저 비용 경로에 루프가 포함 된 경우 루프를 스트립하면 저렴한 비용으로 목표에 대한 유효한 경로가 만들어집니다. 우리는 최저 비용으로 출발했습니다.

Cormen's Introduction to Algorithms에서보세요, 또는 관련 위키 백과 페이지 :

http://en.wikipedia.org/wiki/Shortest_path

http://en.wikipedia.org/wiki/Breadth-first_search

http://en.wikipedia.org/wiki/Depth-first_search

http://en.wikipedia.org/wiki/A*_search_algorithm

+0

예, + 노드의 비용은 0입니다. 이것이 A * 알고리즘이 반드시 터널을 사용할 필요가 없기 때문에이 알고리즘이 제대로 작동하지 않는다고 생각하는 이유입니다. 내가 게시 한 자료를 살펴 보겠습니다 - 감사합니다. –

+1

A * 알고리즘이 완료되었습니다. 즉, 간단한 Dijkstra와 같은 솔루션을 항상 찾습니다. 실제로 두 가지 방법 모두 일부 휴리스틱 유형과 동일합니다. 유일한 질문은 A *가 단순한 Dijkstra보다 빠르다는 것입니다. – Sebastian

+0

도움을 주셔서 감사합니다. 지금 프로젝트 진행 단계가 있습니다. –