用Python解决TSP问题(2)――贪心算法

匿名 (未验证) 提交于 2019-12-02 22:54:36

文章源码在Github:https://github.com/jinchenghao/TSP

本介绍用python解决TSP问题的第二个方法――动态规划法

算法介绍

动态规划算法根据的原理是,可以将原问题细分为规模更小的子问题,并且原问题的最优解中包含了子问题的最优解。也就是说,动态规划是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略。

我使用DP求解TSP问题的主要分为三个主要部分:


T(s,init)代表的意思是从init点出发经过s中全部的点回到init的距离。

程序

输入:

1 2066 2333 2 935 1304 3 1270 200 4 1389 700 5 984 2810 6 2253 478 7 949 3025 8 87 2483 9 3094 1883 10 2706 3130

代码:

""" 动态规划法 name:xxx date:6.8 """ import pandas as pd import numpy as np import math import time  dataframe = pd.read_csv("./data/TSP10cities.tsp",sep=" ",header=None) v = dataframe.iloc[:,1:3]  train_v= np.array(v) train_d=train_v dist = np.zeros((train_v.shape[0],train_d.shape[0]))  #计算距离矩阵 for i in range(train_v.shape[0]):     for j in range(train_d.shape[0]):         dist[i,j] = math.sqrt(np.sum((train_v[i,:]-train_d[j,:])**2))  """ N:城市数 s:二进制表示,遍历过得城市对应位为1,未遍历为0 dp:动态规划的距离数组 dist:城市间距离矩阵 sumpath:目前的最小路径总长度 Dtemp:当前最小距离 path:记录下一个应该到达的城市 """  N=train_v.shape[0] path = np.ones((2**(N+1),N)) dp = np.ones((2**(train_v.shape[0]+1),train_d.shape[0]))*-1  def TSP(s,init,num):     if dp[s][init] !=-1 :         return dp[s][init]     if s==(1<<(N)):         return dist[0][init]     sumpath=1000000000     for i in range(N):         if s&(1<<i):             m=TSP(s&(~(1<<i)),i,num+1)+dist[i][init]             if m<sumpath:                 sumpath=m                 path[s][init]=i     dp[s][init]=sumpath     return dp[s][init]  if __name__ == "__main__":     init_point=0     s=0     for i in range(1,N+1):         s=s|(1<<i)     start = time.clock()     distance=TSP(s,init_point,0)     end = time.clock()     s=0b11111111110     init=0     num=0     print(distance)     while True:         print(path[s][init])         init=int(path[s][init])         s=s&(~(1<<init))         num+=1         if num>9:             break     print("程序的运行时间是:%s"%(end-start)) 

结果:


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!