2017-10-31 16 views
0

私はPythonで初心者です。現在のルートに新しいノードを挿入してルートが短くなっているかどうかをチェックします。しかし、私のコードはうまく動かないので、間違いを教えてください。手順は次のとおりです。 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

もちろんあります。実際、船積みの世界は、二足歩行がある意味では直接ルートよりも安価なケースでいっぱい続いています。フェデックスはその原則に基づいて設立されました。直接船積みする代わりに、すべてをメンフィスに発送し、「飛行機」から「飛行機」へパッケージを移動させ、飛行機から出発してすべての飛行機を送り返します。実際には、あなたの車両のルーティングの問題は、より短い旅行時間のために長いルートを交換して、それらのケースを持っている必要があります。 – Prune

答えて

0

ことがあるので、あなたのコードは実行されません:random:あなたが使用しようとしているパッケージと同じローカル関数を命名するので、構文エラーがあります。関数randomの中では、名前を再定義したため、その名前のパッケージにアクセスできなくなりました。

それが解決されたら、あなたのコードは、この出力でハング:

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

あなたはこの組み合わせでのロジックの問題を抱えている:

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) 

whileループからあなたの唯一の出口はすべてを削除することですnotVisitedから。それが起こらないという論理的な保証はありません。存在しない場合、あなたは存在しない短いルートを見つけようと無限ループに陥っています。

+0

ありがとう!私はここであなたの視点を理解しています。私はここでwhileループを削除する必要があります。なぜなら、ルートを保証できる保証がないからです。 – Anna

+0

恐らくそれを排除するのではなく、利用可能な短縮がない場合の代わりにチェックしてください。 – Prune

+0

この場合、if文を使うべきですか?しかし、私の先生は都市が残るまで繰り返し挿入する必要があります。私は何をすべきか? – Anna

関連する問題