2017-11-28 11 views
1

私は関数ルートを書いています。この関数にはポイントのリストを取る必須のパラメータポイントがあります。この関数は、指定されたリスト内の各点が順番に訪問された場合、移動した合計距離を返す必要があります。ポイント(x、y)のリスト内のポイント間の距離を測定する関数を解く

サイクル:ルートの終わりが開始点(True)かどうかを示すブール値を取る(False)かどうかを指定します。このパラメータの既定値はFalseです

距離:与えられたルートの2つの連続するポイント間の合計距離の計算に使用される距離関数を使用します。誰が最後の定義のルートに知っている()場合のためにそれを解決する方法:

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) 

:私のコードの

第I部を参照してください。

(上記一部を除く)正常に動作し完全なコード:

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

関数を比較しないでください。2つの異なるラムダ式は、 '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

有用な答えでした。 –