python读取.tsp类型文件
最近在学习使用python写优化算法求解tsp问题,因此会导入一些.tsp类型的算例,如:berbin8等、berlin52等、a208.tsp等,那么如何用python导入.tsp文件呢?浅浅记录一下问题。1.先来看看berlin8.tsp文件的数据格式,可以看到,第7行开始记录节点的坐标,最后一行是结束标志也没有用,基本所有的算例都是这样的格式;2.这里我使用pandas导入数据,注意需要跳过
最近在学习使用python写优化算法求解tsp问题,因此会导入一些.tsp类型的算例,如:berbin8等、berlin52等、a208.tsp等,那么如何用python导入.tsp文件呢?浅浅记录一下问题。
1.先来看看berlin8.tsp文件的数据格式,可以看到,第7行开始记录节点的坐标,最后一行是结束标志也没有用,基本所有的算例都是这样的格式;

2.这里我使用pandas导入数据,注意需要跳过前六行不读取(skiprows=6)
df = pd.read_csv(r".\组合优化学习\demo_tsp\berlin8.tsp",sep=" ",skiprows=6,header=None,encoding='utf8')
然后再读取节点和坐标,代码如下所示:
df = pd.read_csv(r".\组合优化学习\demo_tsp\berlin8.tsp",sep=" ",skiprows=6,header=None,encoding='utf8')
node=list(df[0][0:-1])
num_points=len(node)
city_x = np.array(df[1][0:-1])
city_y = np.array(df[2][0:-1])
points= list(zip(city_x, city_y))
打印一下读入的节点坐标,成功啦,接下来就可以写算法解决tsp问题了。

3.还没有完,,,,,我用了同样的方法打开berlin52.tsp文件时,报错了!这句报错的意思是在读取文件的17行的时候期待3个字段,即df有三列,但是出现了四个字段,源文件的字段出了问题。
ParserError: Error tokenizing data. C error: Expected 3 fields in line 17, saw 4
4.在网上找了很多办法都比较繁琐且不一定有用,我用了一个简单粗暴的方法。先设置error_bad_lines=False,然后读取文件时会print哪几行有错直接跳过没读取,以及错误的原因。
df = pd.read_csv(r".\组合优化学习\demo_tsp\berlin52.tsp",sep=" ",skiprows=6,header=None,error_bad_lines=False)结果:
b'Skipping line 17: expected 3 fields, saw 4\nSkipping line 25: expected 3 fields, saw 5\n
结果可以看出第17行和第25行有多出来了几个字符,是换行符\n;
最简单的办法是直接打开.tsp文件,找到17和25行,删掉该行,再重新输入一遍保存就好了。
5.再运行第四步的代码重新读取不再报错,全部读入。
更多推荐

所有评论(0)