2017-11-28 12 views
1

함수 경로를 쓰고 있습니다. 이 함수는 포인트 목록을 취하는 필수 매개 변수 점이 있습니다. 함수는 주어진 목록의 각 점을 차례로 방문 할 경우 여행 한 총 거리를 반환해야합니다. 필수 매개 변수 외에도이 함수에는 다음과 같은 두 개의 선택적 매개 변수가 있습니다.포인트 목록에서 포인트 간 거리를 측정하는 함수 (x, y)

주기 : 경로의 끝이 시작 지점과 같거나 (False) 여부를 나타내는 부울 값을가집니다. 이 매개 변수의 기본값은 False입니다.

distance : 주어진 경로에서 두 개의 연속 점 사이의 총 거리를 계산하는 데 사용되는 거리 함수를 사용합니다. 명시 적 값이이 매개 변수에 전달되지 않은 경우, 유클리드 거리가

문제를 사용해야합니다

route([(41.79, 13.59), (41.68, 14.65), (21.16, -4.79)], distance=lambda p1, p2: abs(p1[0] + p2[0])) 

정답 : 146.31 누구는 경우에 그것을 해결하는 방법) 마지막 정의 경로 (로 알고있다 나는 첫 번째 규칙에 추가로 붙어있어이 부분에서

if cycle == False and distance is λ(p1, p2): abs(p1[0] + p2[0]): 

      l = list() 
      count = 0 

      for items in range(len(points)-1): 
       a = points[items] 
       b = points[items+1] 
       d = euclidean(a[0], b[0]) 
       l.append(d) 
       count += 1 

      return sum(l) 

: 내 코드의

부분은 내가 참조하십시오. (위의 부분을 제외하고) 잘 작동

전체 코드 : 나는 던컨에 동의

def euclidean(a, b): 
    ''' 
    >>> euclidean((42.36, 56.78), (125.65, 236.47)) 
    198.05484139500354 
    ''' 

    from math import sqrt 

    return sqrt(sum((a - b)**2 for a, b in zip(a, b))) 




def manhattan(c, d): 
    ''' 
    >>> manhattan((42.36, 56.78), (125.65, 236.47)) 
    262.98 
    ''' 

    return sum(abs(c - d) for c, d in zip(c, d)) 



def chessboard(e, f): 
    ''' 
    >>> chessboard((42.36, 56.78), (125.65, 236.47)) 
    179.69 
    ''' 

    return max(abs(e - f) for e, f in zip(e, f)) 



def route(points, cycle=False, distance=None): 
    ''' 
    >>> route([(6.59, 6.73), (4.59, 5.54), (5.33, -13.98)]) 
    21.861273201261746 
    >>> route(cycle=True, points=[(6.59, 6.73), (4.59, 5.54), (5.33, -13.98)]) 
    42.60956710702662 
    >>> route([(6.59, 6.73), (4.59, 5.54), (5.33, -13.98)], distance=manhattan) 
    23.45 
    >>> route([(6.59, 6.73), (4.59, 5.54), (5.33, -13.98)], cycle=True, distance=manhattan) 
    45.42 
    ''' 



    if cycle == False and distance is None: 

     l = list() 
     count = 0 

     for items in range(len(points)-1): 
      a = points[items] 
      b = points[items+1] 
      d = euclidean(a, b) 
      l.append(d) 
      count += 1 

     return sum(l) 


    if cycle == False and distance is euclidean: 

     l = list() 
     count = 0 

     for items in range(len(points)-1): 
      a = points[items] 
      b = points[items+1] 
      d = euclidean(a, b) 
      l.append(d) 
      count += 1 

     return sum(l) 


    if cycle == False and distance is λ(p1, p2): abs(p1[0] + p2[0]): 

     l = list() 
     count = 0 

     for items in range(len(points)-1): 
      a = points[items] 
      b = points[items+1] 
      d = euclidean(a[0], b[0]) 
      l.append(d) 
      count += 1 

     return sum(l) 



    if cycle == True and distance is None: 

     l = list() 
     count = 0 

     for items in range(len(points)-1): 
      a = points[items] 
      b = points[items+1] 
      d = euclidean(a, b) 
      l.append(d) 
      count += 1 

     f = points[0] 
     g = points[-1] 
     r = euclidean(g, f) 

     k = sum(l) + r 

     return k 


    if cycle == True and distance is euclidean: 

     l = list() 
     count = 0 

     for items in range(len(points)-1): 
      a = points[items] 
      b = points[items+1] 
      d = euclidean(a, b) 
      l.append(d) 
      count += 1 

     f = points[0] 
     g = points[-1] 
     r = euclidean(g, f) 

     k = sum(l) + r 

     return k 



    if cycle is False and distance is manhattan: 

     l = list() 
     count = 0 

     for items in range(len(points)-1): 
      a = points[items] 
      b = points[items+1] 
      d = manhattan(a, b) 
      l.append(d) 
      count += 1 

     return sum(l) 


    if cycle is True and distance is manhattan: 

     l = list() 
     count = 0 

     for items in range(len(points)-1): 
      a = points[items] 
      b = points[items+1] 
      d = manhattan(a, b) 
      l.append(d) 
      count += 1 

     f = points[0] 
     g = points[-1] 
     r = manhattan(g, f) 

     k = sum(l) + r 

     return k 
+1

함수를 비교하지 마십시오 : 서로 다른 두 개의 람다 식은'is' 또는'=='와 동일한 비교를하지 않습니다. 'distance (a, b)'를 호출하고 그 중복을 모두 제거하십시오. – Duncan

답변

1

. 너는 너무 많은 중복을 가지고있다. 여기에 더 직접적인 방법 :

euclidean = lambda p1, p2: sqrt(sum((p1_i - p2_i)**2 for p1_i, p2_i in zip(p1, p2))) 
manhattan = lambda p1, p2: sum(abs(p1_i - p2_i) for p1_i, p2_i in zip(p1, p2)) 
chessboard = lambda p1, p2: max(abs(p1_i - p2_i) for p1_i, p2_i in zip(p1, p2)) 

def route(points, cycle=False, metric=euclidean): 
    l = 0.0 
    for i in range(len(points) - 1): 
     l += metric(points[i], points[i + 1]) 

    if cycle: 
     l += metric(points[-1], points[0]) 

    return l 

모든 메트릭 연료 소모량이 전달 될 수 후 대신 유클리드 메트릭 사용됩니다.

+0

유용한 답변이었습니다. –

관련 문제