读取 TSP 文件 Python
Reading in TSP file Python
我需要弄清楚如何读取文件名的数据 'berlin52.tsp'
这是我正在使用的格式
NAME: berlin52
TYPE: TSP
COMMENT: 52 locations in Berlin (Groetschel)
DIMENSION : 52
EDGE_WEIGHT_TYPE : EUC_2D
NODE_COORD_SECTION
1 565.0 575.0
2 25.0 185.0
3 345.0 750.0
4 945.0 685.0
5 845.0 655.0
6 880.0 660.0
7 25.0 230.0
8 525.0 1000.0
9 580.0 1175.0
10 650.0 1130.0
这是我当前的代码
# Open input file
infile = open('berlin52.tsp', 'r')
# Read instance header
Name = infile.readline().strip().split()[1] # NAME
FileType = infile.readline().strip().split()[1] # TYPE
Comment = infile.readline().strip().split()[1] # COMMENT
Dimension = infile.readline().strip().split()[1] # DIMENSION
EdgeWeightType = infile.readline().strip().split()[1] # EDGE_WEIGHT_TYPE
infile.readline()
# Read node list
nodelist = []
N = int(intDimension)
for i in range(0, int(intDimension)):
x,y = infile.readline().strip().split()[1:]
nodelist.append([int(x), int(y)])
# Close input file
infile.close()
代码应读入文件,输出值为“1、2、3 ...”等的旅行列表,同时存储 x 和 y 值以计算距离。它至少可以收集 headers。创建节点列表时出现问题。
这是我得到的错误
ValueError: invalid literal for int() with base 10: '565.0'
我做错了什么?
您正在将字符串“565.0”输入 nodelist.append([int(x), int(y)])
。
它告诉您它不喜欢那样,因为该字符串不是整数。最后的 .0 使它成为一个浮点数。
因此,如果您将其更改为 nodelist.append([float(x), float(y)])
,作为一种可能的解决方案,那么您会发现问题消失了。
或者,您可以尝试从字符串输入中删除或分隔“.0”。
这是一个 TSPLIB 格式的文件。要在 python 中加载它,请查看 python 包 tsplib95
,可通过 PyPi or on Github
获得
文档可在 https://tsplib95.readthedocs.io/
上找到
您可以将 TSPLIB 文件转换为 networkx 图形并从中检索必要的信息。
代码有两个问题 above.I 有 运行 代码并在下面的行中发现以下问题:
Dimension = infile.readline().strip().split()[1]
这一行应该是这样的
`Dimension = infile.readline().strip().split()[2]`
而不是 1,它将是 2,因为对于 1 Dimension = :
和 2 Dimension = 52
。
都是字符串类型
第二个问题与第
行有关
N = int(intDimension)
会是
N = int(Dimension)
最后一行
for i in range(0, int(intDimension)):
只需使用
for i in range(0, N):
我想现在一切都会好起来的。
nodelist.append([int(x), int(y)])
整数(x)
函数 int() 无法将 x(string(565.0)) 转换为 int 因为“.”
添加
x=x[:len(x)-2]
y=y[:len(y)-2]
删除“.0”
我需要弄清楚如何读取文件名的数据 'berlin52.tsp'
这是我正在使用的格式
NAME: berlin52
TYPE: TSP
COMMENT: 52 locations in Berlin (Groetschel)
DIMENSION : 52
EDGE_WEIGHT_TYPE : EUC_2D
NODE_COORD_SECTION
1 565.0 575.0
2 25.0 185.0
3 345.0 750.0
4 945.0 685.0
5 845.0 655.0
6 880.0 660.0
7 25.0 230.0
8 525.0 1000.0
9 580.0 1175.0
10 650.0 1130.0
这是我当前的代码
# Open input file
infile = open('berlin52.tsp', 'r')
# Read instance header
Name = infile.readline().strip().split()[1] # NAME
FileType = infile.readline().strip().split()[1] # TYPE
Comment = infile.readline().strip().split()[1] # COMMENT
Dimension = infile.readline().strip().split()[1] # DIMENSION
EdgeWeightType = infile.readline().strip().split()[1] # EDGE_WEIGHT_TYPE
infile.readline()
# Read node list
nodelist = []
N = int(intDimension)
for i in range(0, int(intDimension)):
x,y = infile.readline().strip().split()[1:]
nodelist.append([int(x), int(y)])
# Close input file
infile.close()
代码应读入文件,输出值为“1、2、3 ...”等的旅行列表,同时存储 x 和 y 值以计算距离。它至少可以收集 headers。创建节点列表时出现问题。
这是我得到的错误
ValueError: invalid literal for int() with base 10: '565.0'
我做错了什么?
您正在将字符串“565.0”输入 nodelist.append([int(x), int(y)])
。
它告诉您它不喜欢那样,因为该字符串不是整数。最后的 .0 使它成为一个浮点数。
因此,如果您将其更改为 nodelist.append([float(x), float(y)])
,作为一种可能的解决方案,那么您会发现问题消失了。
或者,您可以尝试从字符串输入中删除或分隔“.0”。
这是一个 TSPLIB 格式的文件。要在 python 中加载它,请查看 python 包 tsplib95
,可通过 PyPi or on Github
文档可在 https://tsplib95.readthedocs.io/
上找到您可以将 TSPLIB 文件转换为 networkx 图形并从中检索必要的信息。
代码有两个问题 above.I 有 运行 代码并在下面的行中发现以下问题:
Dimension = infile.readline().strip().split()[1]
这一行应该是这样的
`Dimension = infile.readline().strip().split()[2]`
而不是 1,它将是 2,因为对于 1 Dimension = :
和 2 Dimension = 52
。
都是字符串类型
第二个问题与第
行有关N = int(intDimension)
会是
N = int(Dimension)
最后一行
for i in range(0, int(intDimension)):
只需使用
for i in range(0, N):
我想现在一切都会好起来的。
nodelist.append([int(x), int(y)]) 整数(x) 函数 int() 无法将 x(string(565.0)) 转换为 int 因为“.”
添加 x=x[:len(x)-2] y=y[:len(y)-2] 删除“.0”