私は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))
ようこそStackOverflow。ヘルプドキュメントの投稿ガイドラインを読み、それに従ってください。 [最小、完全で検証可能な例](http://stackoverflow.com/help/mcve)がここに適用されます。 MCVEコードを投稿して問題を正確に記述するまでは、効果的にお手伝いすることはできません。 投稿したコードをテキストファイルに貼り付け、説明した問題を再現できるはずです。 "私のコードはうまく動作しません"は問題の仕様ではありません。 – Prune
@roganjoshそれは間違っています。これは一般的なグラフであり、Hausdorff空間ではありません。三角不等式は保持する必要はありません。 AB + BC
Prune
もちろんあります。実際、船積みの世界は、二足歩行がある意味では直接ルートよりも安価なケースでいっぱい続いています。フェデックスはその原則に基づいて設立されました。直接船積みする代わりに、すべてをメンフィスに発送し、「飛行機」から「飛行機」へパッケージを移動させ、飛行機から出発してすべての飛行機を送り返します。実際には、あなたの車両のルーティングの問題は、より短い旅行時間のために長いルートを交換して、それらのケースを持っている必要があります。 – Prune