2016-10-19 3 views
0

원본 경로와 대상 노드 (OD 쌍) 간의 최단 경로를 찾기 위해 무차별 방식을 적용하려고합니다. networkX를 사용하여 네트워크를 만들고 순열을 호출 한 다음 무차별 대입을 적용합니다.
네트워크의 모든 노드가 다른 모든 노드와 연결되어 있으면이 작업이 정상입니다. 그러나 일부 또는 많은 가장자리가 없으면이 방법은 효과가 없을 것입니다. 맞도록, 나는 불법적 인 가장자리를 포함하는 모든 permuations을 삭제해야합니다. 예를 들어 퍼뮤 테이션 세트 (파이썬)에서 불법 에지 제거

개의 순열 튜플

[(1,2,3,4,5), (1,2,4,3,5)]

및에 있다면 내 네트워크 노드 2와 3 사이의 가장자리가 존재하지 않는 경우 언급 된 목록의 첫 번째 튜플을 삭제해야합니다.

첫 번째 질문 : 우선 순열을 만들고 거기에 가서 불법적 인 가장자리를 포함하는 것을 삭제하는 것이 효율적인 방법입니까? 만약 내가 뭘해야하지?

두 번째 질문 : 그래, 내 전략은 처음 "G.has_edge (U, V)"명령 networkx에서 모든 불법 가장자리를 포함하는 튜플의 목록을 만든 다음 순열로가는 경우 찾고 있다는 것입니다 경우 그런 가장자리는 존재하고, 그 순열을 삭제한다. 좋은 전략입니까? 그렇지 않다면, 당신은 또 무엇을 제안합니다.

감사합니다 :)

+0

, 나는 OD 쌍 사이에 발생하는 모든 노드를 방문해야한다는 말을 잊어 버렸습니다. – Achter

+0

저는 예제를 이해하지 못합니다. 순열 튜플의 의미와 그 튜플로 무엇을하려고합니까? – TurtleIzzy

+0

실제로이 코드 다음입니다 : 각 노드가 연결되어 있음을 알 수있다 다음 http://codereview.stackexchange.com/questions/81865/travelling-salesman-using-brute-force-and-heuristics 모든 다른 것들과 많은 순열이 존재하지만 도로 네트워크에서는 많은 노드가 서로 직접 연결되지 않습니다. 순열 튜플이 가능한 경로입니다. 첫 번째 경로는 노드 1에서 시작하여 2 - 3 - 4로 이동하여 5로 끝납니다.하지만 노드 2와 3은 네트워크에 직접 연결되어 있지 않으므로 조합은 불법이며 삭제해야합니다. – Achter

답변

0

일반 TSP에 대한 정확한 솔루션이 아닌 다항식으로 인식하고 있습니다. 가장 순진한 접근법 인 모든 순열을 열거하는 것은 그 복잡성이 O(n!) 임에도 불구하고 유효합니다. 자세한 내용은 wikipedia page of TSP을 참조하십시오.

특정 문제에 대해서는 그래프를 통해 depth-first search을 사용하여 올바른 순열을 생성 할 수 있습니다. 이 알고리즘을 보여주는

파이썬 같은 의사 코드는 다음과 같습니다 :

죄송합니다
def dfs(vertex, visited): 
    if vertex == target_vertex: 
     visited.append(target_vertex) 
     if visited != graph.vertices: 
      return 
     do_it(visited)  # visited is a valid permutation 
    for i in graph.vertices: 
     if not i in visited and graph.has_edge(vertex, i): 
      dfs(i, visited + [i]) 

dfs(start_vertex, [start_vertex]) 
+0

이 문제를 해결하고이를 수행 할 수있었습니다. 하지만 이제는 또 다른 질문이 있습니다 : http : // stackoverflow.co.kr/questions/40221199/최단 경로 방문 중 일부 노드 - 감사합니다. – Achter