用Python解决TSP问题(1)——贪心算法

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

关于TSP问题网上有很多介绍,这里再简单描述一下。旅行商问题(TravelingSalesmanProblem,TSP)一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要遍历所有城市一次且只能一次,回到出发地。应如何选择行进路线,以使总的行程最短。目前解决TSP问题的方法有许多种,比如:贪心算法、动态规划算法、分支限界法;也有智能算法,比如:蚁群算法、遗传算法、A*等。由于网上使用python解决这类问题的比较少,所以我会用python实现这些算法。本文先介绍贪心算法:

数据格式

数据格式如下:

城市XY
City1100200
City2150200
City3345313
...  

即输入的数据有3列,第一列是城市编号,第二列和第三列是城市坐标(x,y)。

算法简介

贪心算法非常容易理解,是一种解决实际问题中的常用方法,经常用来和其他算法进行比较。所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。

在TSP问题上,假设城市集合为B,我们每次只选择距离当前城市最近的城市移动。同时集合s记录已经遍历过得城市,下次从集合(B-s)中选择。

程序

输入:

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

代码如下:

#贪心法
import pandas as pd
import numpy as np
import math
import time

dataframe = pd.read_csv("./data/TSP100cities.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))
"""
s:已经遍历过的城市
dist:城市间距离矩阵
sumpath:目前的最小路径总长度
Dtemp:当前最小距离
flag:访问标记
"""
i=1
n=train_v.shape[0]
j=0
sumpath=0
s=[]
s.append(0)
start = time.clock()
while True:
    k=1
    Detemp=10000000
    while True:
        l=0
        flag=0
        if k in s:
            flag = 1
        if (flag==0) and (dist[k][s[i-1]] < Detemp):
            j = k;
            Detemp=dist[k][s[i - 1]];
        k+=1
        if k>=n:
            break;
    s.append(j)
    i+=1;
    sumpath+=Detemp
    if i>=n:
        break;
sumpath+=dist[0][j]
end = time.clock()
print("结果:")
print(sumpath)
for m in range(n):
    print("%s-> "%(s[m]),end='')
print()
print("程序的运行时间是:%s"%(end-start))

结果:


  • 19
    点赞
  • 119
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
TSP(Traveling Salesman Problem,旅行商问题)是一个经典的组合优化问题,目标是找到一条经过所有城市且路径最短的路线。贪心算法是一种常用的解决TSP问题的方法。 TSP问题贪心算法思路如下:首先选择一个起始城市,然后每次选择距离当前城市最近且未被访问过的城市作为下一个要访问的城市,直到所有城市都被访问过,最后回到起始城市形成闭环。 使用Python实现TSP问题贪心算法可以按照以下步骤进行: 1. 首先创建一个n x n的距离矩阵,其中n为城市数量,矩阵每个元素表示城市之间的距离。 2. 初始化一个记录已访问城市的列表visited,起始城市设置为已访问。 3. 初始化一个空的路径列表path,将起始城市添加到路径。 4. 从起始城市开始,依次遍历每个城市,选择距离当前城市最近的未访问城市,将其添加到路径中,并将该城市标记为已访问。 5. 重复步骤4,直到所有城市都被访问过。 6. 计算路径长度,即遍历路径列表中的城市并累加对应的距离矩阵元素。 7. 将最后一个城市与起始城市形成闭环,计算闭环长度。 8. 返回路径和闭环长度作为结果。 以下是Python代码实现TSP问题贪心算法: ```python import numpy as np def tsp_greedy(distance_matrix): n = len(distance_matrix) visited = [0] * n # 记录已访问的城市 visited[0] = 1 # 设置起始城市为已访问 path = [0] # 路径列表,开始时只包含起始城市 current_city = 0 # 当前城市为起始城市 while len(path) < n: closest_city = -1 # 距离当前城市最近的未访问城市 min_dist = float('inf') # 最短距离 for i in range(n): if visited[i] == 0 and distance_matrix[current_city][i] < min_dist: closest_city = i min_dist = distance_matrix[current_city][i] path.append(closest_city) # 将最近城市添加到路径中 visited[closest_city] = 1 # 标记最近城市为已访问 current_city = closest_city # 更新当前城市 path_length = sum(distance_matrix[path[i-1]][path[i]] for i in range(1, n)) # 计算路径长度 cyclic_length = path_length + distance_matrix[path[-1]][path[0]] # 计算闭环长度 return path, cyclic_length # 距离矩阵示例 distance_matrix = np.array([[0, 1, 2, 3], [1, 0, 4, 5], [2, 4, 0, 6], [3, 5, 6, 0]]) path, cyclic_length = tsp_greedy(distance_matrix) print("最短路径:", path) print("最短路径长度:", cyclic_length) ``` 以上是使用贪心算法解决TSP问题的简单示例,将根据距离矩阵计算最短路径和最短路径长度。实际应用中,可能需要对贪心算法进行改进和优化,以得到更好的解。 注意:以上代码仅作为示例,具体实现还需要根据实际问题进行适当的调整。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值