バックトラッキング サブセット ツリー テンプレートに基づいた巡回セールスマン問題 (TSP) に対する Python の解決策を説明する例

巴扎黑
リリース: 2017-09-07 10:14:07
オリジナル
2914 人が閲覧しました

この記事では主に、バックトラッキング手法サブセット ツリー テンプレートに基づいて巡回セールスマン問題 (TSP) を解決するための Python を紹介します。巡回セールスマン問題について簡単に説明し、バックトラッキング手法サブセット ツリー テンプレートを使用した Python の関連実装手順と実装手順を分析します。例の形式で巡回セールスマン問題を解決します。運用スキルを必要とする友人はそれを参照できます

この記事では、バックトラッキング手法のサブセット ツリー テンプレートに基づいて Python で巡回セールスマン問題 (TSP) を解く例について説明します。詳細は次のとおりです:

問題

巡回セールスマン問題 (TSP) は複数の都市を旅行したいと考えており、各都市間のコストがわかっています。コストを節約するために、巡回セールスマンは、自分がいる都市から出発して、各都市に一度移動し、その後、元の都市に戻ることにしました。総コストを最小化するにはどのルートを選択すればよいでしょうか?

分析

この問題は次のように説明できます: G=(V,E) は、V の各ノードを含む有向リング、つまり、次のツアー ルートを見つけます。この有向リング上のすべてのエッジ コストの合計を最小化します。

この質問と前の記事 http://www.jb51.net/article/122933.htm の違いは、この質問が重み付けされた画像であることです。ほんの少しの変更を加えるだけで十分です。

解の長さはn+1に固定されています。

グラフ内のすべてのノードには、独自の隣接ノードがあります。ノードの場合、そのノードに隣接するすべてのノードがこのノードの状態空間を構成します。パスがこのノードに到達すると、その状態空間が横断されます。

最終的には、最適な解決策が必ず見つかります!

もちろん、バックトラッキング手法のサブセット ツリー テンプレートを適用し続けてください! ! !

コード


'''旅行商问题(Traveling Salesman Problem,TSP)'''
# 用邻接表表示带权图
n = 5 # 节点数
a,b,c,d,e = range(n) # 节点名称
graph = [
  {b:7, c:6, d:1, e:3},
  {a:7, c:3, d:7, e:8},
  {a:6, b:3, d:12, e:11},
  {a:1, b:7, c:12, e:2},
  {a:3, b:8, c:11, d:2}
]
x = [0]*(n+1) # 一个解(n+1元数组,长度固定)
X = []     # 一组解
best_x = [0]*(n+1) # 已找到的最佳解(路径)
min_cost = 0    # 最小旅费
# 冲突检测
def conflict(k):
  global n,graph,x,best_x,min_cost
  # 第k个节点,是否前面已经走过
  if k < n and x[k] in x[:k]:
    return True
  # 回到出发节点
  if k == n and x[k] != x[0]:
    return True
  # 前面部分解的旅费之和超出已经找到的最小总旅费
  cost = sum([graph[node1][node2] for node1,node2 in zip(x[:k], x[1:k+1])])
  if 0 < min_cost < cost:
    return True
  return False # 无冲突
# 旅行商问题(TSP)
def tsp(k): # 到达(解x的)第k个节点
  global n,a,b,c,d,e,graph,x,X,min_cost,best_x
  if k > n: # 解的长度超出,已走遍n+1个节点 (若不回到出发节点,则 k==n)
    cost = sum([graph[node1][node2] for node1,node2 in zip(x[:-1], x[1:])]) # 计算总旅费
    if min_cost == 0 or cost < min_cost:
      best_x = x[:]
      min_cost = cost
      #print(x)
  else:
    for node in graph[x[k-1]]: # 遍历节点x[k-1]的邻接节点(状态空间)
      x[k] = node
      if not conflict(k): # 剪枝
        tsp(k+1)
# 测试
x[0] = c # 出发节点:路径x的第一个节点(随便哪个)
tsp(1)  # 开始处理解x中的第2个节点
print(best_x)
print(min_cost)
ログイン後にコピー

レンダリング

以上がバックトラッキング サブセット ツリー テンプレートに基づいた巡回セールスマン問題 (TSP) に対する Python の解決策を説明する例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート