2017-03-14 2 views
0

나는 경로를 끝내기 위해 A와 B 사이에 조니가 있습니다. 경로는 초기 및 최종 킬로미터로 정의됩니다.겹치는 동일한 경로의 다른 경로

path 0 -> (0, 10) 
path 1 -> (10, 25) 
path 2 -> (10, 15) 
path 3 -> (15, 20) 
path 4 -> (20, 30) 
path 5 -> (25, 35) 
path 6 -> (30, 35) 
path 7 -> (35, 40) 
path 8 -> (40, 50) 

위에서 볼 수 있듯이 겹치는 경로가 있습니다.

path 0 -> NONE 
path 1 -> 2,3,4 
path 2 -> 1 
path 3 -> 1 
path 4 -> 1,5 
path 5 -> 4,6 
path 6 -> 5 
path 7 -> NONE 
path 8 -> NONE 

내가 싶어하면 경로에서 중복 경로없이 모든 가능한 경로하지만 하나는주의해야한다 : 사실, 우리는 중복 경로의 목록을 얻을 수 있습니다. 이 문제를 해결할 수있는 알고리즘이 있습니까? 재귀 또는 스택과 같은 유용한 데이터 구조로 구현하려고 시도했지만 최종 가능한 경로 목록을 얻기가 매우 어려웠고 문제를 역으로 처리하고 폐기 된 경로의 목록을 얻으려고 시도했습니다. :

route 0-2-3-4-6-7-8 -> [1,5] discarded 
route 0-2-3-5-7-8 -> [1,4,6] discarded 
route 0-1-6-7-8 -> [2,3,4,5] discarded 
route 0-1-5-7-8 -> [2,3,4,6] discarded 

답변

0

예. 이것은 간단한 그래프 문제입니다. 이러한 경로를 겹치는 경로로 보는 대신 마일스톤이 연결되지 않은 노드라는 사실을 인식하십시오. 예를 들어, 당신이 마일스톤 20에 있다면, 당신이 할 수있는 유일한 전진 이동은 30입니다 - 그리고 다른 세그먼트와 중복은 전혀 중요하지 않습니다. 아마도 당신이 도시를 번호가 매겨진 도시로 향하는 노선으로 생각할 때 더 효과적 일 수 있습니다.

다양한 그래프 탐색 알고리즘을 찾아 알고리즘을 선택할 수 있습니다. 이것은 간단합니다. 결정 사항은 단 하나뿐입니다 (마일스톤 10). 선택을하면 나머지 경로가 결정됩니다.

거기에서 가져갈 수 있습니까?

+0

의사 알고리즘을 작성하거나이 알고리즘에 대한 참조를 제공 할 수 있습니까? 한 경로를 가져 오는 방법을 볼 수 없으며 나머지 경로를 얻기 위해 이전 겹치는 경로로 돌아가는 등 모든 가능한 경로가있을 때까지 계속됩니다. 고맙습니다. – RobinHood

+0

일반적으로 StackOverflow 응답을 넘어서고 있습니다. 찾은 알고리즘의 의사 코드에 어디서 붙어 있습니까? 그 코멘트를 게시하기 전에 적어도 "그래프 트래버 설 알고리즘"을 완료해야합니다. 많은 사람들이 의사 코드를 사용합니다. Dijkstra의 알고리즘으로 시작하여 거기에서 분기하십시오. – Prune

+0

사실, 나는 "그래프 탐색"을 원하지 않습니다. 내가 시도한 것은 중첩 목록을 반복하고 현재 경로에 겹침이 있는지 확인하는 것입니다. 그렇다면 새 경로 (재귀)를 유지하고 다음 단계에서 중복 경로를 삭제하십시오. 그런 다음 새로운 겹치는 경로가있는 경로를 발견하면 경로를 완료하고 경로를 얻을 때까지 다른 경로 (재귀)를 작성합니다. 마지막으로, 모든 경로를 얻어야하지만, 무한 재귀가 있거나 폐기 된 경로 목록이 제대로 업데이트되지 않기 때문에 무언가가 내 접근법에 없습니다. 여기에 일부 코드를 업로드하는 데 도움이 될 수 있습니까? – RobinHood

0

마지막으로 코드가 생깁니다. (가능하면 개선 될 수 있음) :

from copy import deepcopy 

discarded_overlapped = [] 
def overlap(overlapped,discarded): 
    if all(x is None for x in overlapped): 
     discarded.sort() 
     if discarded not in discarded_overlapped: 
      discarded_overlapped.append(discarded) 
     return 
    for i in range(len(overlapped)): 
     if not overlapped[i] == None: 
      overlapped_copy = deepcopy(overlapped) 
      discarded_copy = deepcopy(discarded) 
      for j in overlapped[i]: 
       if j not in discarded: 
        discarded_copy.append(j) 
        overlapped_copy[j] = None 
      overlapped_copy[i] = None 
      overlap(overlapped_copy,discarded_copy) 


Data = [None,[2,3,4],[1],[1],[1,5],[4,6],[5],None,None] 
overlap(Data,[]) 
print(discarded_overlapped) 
# [[2, 3, 4, 6], [2, 3, 4, 5], [1, 5], [1, 4, 6]] 
관련 문제