2017-10-31 7 views
0

저는 파이썬에서 초보자입니다. 현재 경로에 새 노드를 삽입하여 경로가 짧아 지는지 여부를 확인하려고합니다. 그러나 내 코드가 잘 돌아 가지 않으면 내게 실수를 보여주십시오. 단계는 다음과 같습니다. 1. 임의 하위 집합 만들기 (예 : 0-2-0) 2. 방문하지 않은 노드를 임의로 가져 와서 현재 경로의 각 노드 쌍에서이 노드를 확인합니다. 노드가 더 짧은 요구 사항을 만족하면 현재 노드에 삽입합니다 (예 : 0-4-2-0). 3. 경로에 모든 노드가 삽입 될 때까지 계속하십시오. 그대로삽입 알고리즘이 모든 노드를 삽입 할 수 없습니다

import random 
distMatrix = [ 
     [100, 14, 20, 10, 35, 18, 5], 
     [6, 100, 7, 35, 17, 9, 24], 
     [8, 35, 100, 36, 27, 3, 15], 
     [21, 7, 12, 100, 7, 4, 26], 
     [33, 25, 6, 18, 100, 19, 11], 
     [6, 2, 22, 30, 9, 100, 8], 
     [24, 3, 12, 5,17, 16, 100], 
     ] 
def get_total_distance(route,d): 
    total = 0 
    for i in range (len(route)-1): 
     pre = route[i] 
     succ = route[i+1] 
     total += d[pre][succ] 
    return total 
def insertion(d): 
    numNodes = len(d) 
    notVisited = list(range(1, numNodes)) 
    first_random_node = random.choice(notVisited) 
    route = [0] 
    route.append(first_random_node) 
    notVisited.remove(first_random_node) 
    route.append(0) #create first subtour 
    print("1st",route) 
    location = 0 
    while len(notVisited) != 0: 
     for j in notVisited: 
      for i in range (len(route)-1): 
       pre = route[i] 
       succ = route[i+1] 
       check_route = d[pre][j] + d[j][succ] 
       current_distance = d[pre][succ] 
       if check_route <= current_distance: 
        print(j) 
        route.insert(i + 1, j) 
        notVisited.remove(j) 
        print("2nd", route) 
    return route 
solution = insertion(distMatrix) 
print("The solution for the route is:",solution) 
print("The total distance is:", get_total_distance(solution,distMatrix)) 
+1

StackOverflow에 오신 것을 환영합니다. 도움말 설명서의 게시 지침을 읽고 따르십시오. [최소한의 완전하고 검증 가능한 예제] (http://stackoverflow.com/help/mcve)가 여기에 적용됩니다. MCVE 코드를 게시하고 문제를 정확하게 설명하기 전까지는 효과적으로 도움을 드릴 수 없습니다. 게시 된 코드를 텍스트 파일에 붙여넣고 설명한 문제를 재현 할 수 있어야합니다. "내 코드가 제대로 실행되지 않습니다"는 문제 사양이 아닙니다. – Prune

+0

@roganjosh 그건 맞지 않아. 이것은 Hausdorff 공간이 아닌 일반적인 그래프입니다. 삼각형 부등식은 유지할 필요가 없습니다. AB + BC Prune

+0

물론 있습니다. 실제로 배송 세계는 양방향 여행이 어떤 의미에서는 직접적인 경로보다 저렴 한 경우가 많습니다. FedEx는 직접 운송하는 대신 Memphis로 모든 것을 보내고 "출발"항공편에서부터 "도착"항공편으로 패키지를 옮기고 출발 한 모든 비행기를 다시 보냅니다. 실제로, 당신의 차량 배정 문제는 더 짧은 여행 시간을위한 더 긴 경로 떨어져 무역하는 그 케이스가 있어야한다. – Prune

답변

0

, 코드가 실행되지 않습니다 random : 로컬 기능을 사용하려는 패키지와 같은 이름 때문에 구문 오류가있다. 함수 random 안에 이름을 다시 정의했기 때문에 해당 이름의 패키지에 더 이상 액세스 할 수 없습니다. 그 문제가 해결되면

, 당신의 코드는 출력을 중단 :

1st [0, 5, 0] 
3 
2nd [0, 3, 5, 0] 
6 
2nd [0, 6, 3, 5, 0] 

이 조합 논리에 문제가 :

while 루프에서 유일한 출구가 모든 것을 제거하는 것입니다
while len(notVisited) != 0: 
    print("WHILE", len(notVisited)) 
    for j in notVisited: 
     .... 
      if check_route <= current_distance: 
       print(j) 
       route.insert(i + 1, j) 
       notVisited.remove(j) 
       print("2nd", route) 

notVisited에서. 논리적 인 보장은 일어나지 않습니다. 그렇지 않을 경우, 존재하지 않는 더 짧은 경로를 찾기 위해 무한 루프에 빠지게됩니다.

+0

감사합니다. 나는 너의 관점을 여기에서 이해한다. 나는 여기서 while 루프를 제거해야한다. 왜냐하면 내가 루트를 보장 할 수 있다고 보장하지 않기 때문이다. – Anna

+0

아마 그것을 없애지는 않을 것이지만, 사용할 수있는 단축 번호가 없을 때 대문자로 확인한다. – Prune

+0

이 경우 if 문을 사용해야합니다. 그러나 선생님은 더 이상 도시가 없어 질 때까지 반복해서 삽입해야합니다. 내가해야 할 일? – Anna