Python新手求助:读取TXT矩阵到TSP代码的错误排查
TSP代码读取.txt矩阵报错排查
我是Python新手,现需将.txt文件中的矩阵读取并整合到旅行商问题(TSP)代码中,但运行时出现错误,恳请协助排查问题。
input.txt内容
Place; date1;date2;date3 #1;65;27;16 #2;46;56;11 #3;36;14;28
使用的脚本代码
import csv f= open("input1.txt","r") sum=(1 for line in open("input1.txt","r")) print (sum) def Min(lst, myindex): return min(x for idx, x in enumerate(lst) if idx != myindex) def Delete(matrix, index1, index2): del matrix[index1] for i in matrix: del i[index2] return matrix n = sum matrix = [] H = 0 PathLenght = 0 Str = [] Stb = [] res = [] result = [] StartMatrix = [] for i in range(n): Str.append(i) Stb.append(i) for i in range(n): matrix.append(map(float, row) for row in csv.reader(f,delimiter=";")) print (matrix) for i in range(n): StartMatrix.append(matrix[i].copy()) for i in range(1,n): matrix[i][i] = float('inf') while True: for i in range(1,len(matrix)): temp = min(matrix[i]) H += temp for j in range(1,len(matrix)): matrix[i][j] -= temp for i in range(1,len(matrix)): temp = min(row[i] for row in matrix) H += temp for j in range(1,len(matrix)): matrix[j][i] -= temp NullMax = 0 index1 = 0 index2 = 0 tmp = 0 for i in range(1,len(matrix)): for j in range(1,len(matrix)): if matrix[i][j] == 0: tmp = Min(matrix[i], j)+Min((row[j] for row in matrix), i) if tmp >= NullMax: NullMax = tmp index1 = i index2 = j res.append(Str[index1]+1) res.append(Stb[index2]+1) oldIndex1 = Str[index1] oldIndex2 = Stb[index2] if oldIndex2 in Str and oldIndex1 in Stb: NewIndex1 = Str.index(oldIndex2) NewIndex2 = Stb.index(oldIndex1) matrix[NewIndex1][NewIndex2] = float('inf') del Str[index1] del Stb[index2] matrix = Delete(matrix, index1, index2) while 1: if len(matrix) == 1: break for i in range(1, len(res)-1, 2): if res.count(res[i]) < 2: result.append(res[i]) result.append(res[i+1]) for i in range(1, len(res)-1, 2): for j in range(1, len(res)-1, 2): if result[len(result)-1] == res[j]: result.append(res[j]) result.append(res[j+1]) print(result) for i in range(1, len(result)-1, 2): if i == len(result)-2: PathLenght += StartMatrix[result[i]-1][result[i+1]-1] PathLenght += StartMatrix[result[i+1]-1][result[1]-1] else: PathLenght += StartMatrix[result[i]-1][result[i+1]-1] print(PathLenght) input()
运行后错误输出
<generator object at 0x038341B0>
[<generator object at 0x038341B0>,<generator object at 0x038341B0>,<generator object at 0x038341B0>,<generator object at 0x038341B0>]
问题根源及修复方案
1. 行数统计错误:生成器赋值给变量n
代码中sum=(1 for line in open("input1.txt","r"))创建的是生成器对象,不是实际的行数数值,导致后续range(n)无法正常执行。
修复代码:
# 正确统计数据行数(跳过表头) with open("input1.txt","r") as f: n = sum(1 for line in f) - 1 # 减1是排除第一行表头
- 使用
with语句可自动关闭文件,避免资源泄漏; - 减1是因为input.txt第一行是表头,实际有效数据为3行。
2. 矩阵读取错误:嵌套生成器导致无法访问元素
原代码中matrix.append(map(float, row) for row in csv.reader(f,delimiter=";"))将生成器添加到列表,导致matrix中存储的都是生成器对象,而非可操作的二维数值列表,后续无法通过matrix[i][j]访问元素。
修复代码:
# 一次性读取并转换为二维数值矩阵 import csv with open("input1.txt", "r") as f: reader = csv.reader(f, delimiter=";") next(reader) # 跳过表头行 matrix = [] for row in reader: # 提取每行从第二列开始的数值,转为float类型 numeric_row = list(map(float, row[1:])) matrix.append(numeric_row) n = len(matrix) # 直接用矩阵长度作为n,更准确
这样matrix会成为标准的二维列表,每个元素都是可直接访问的浮点数。
3. 其他语法与逻辑问题修复
- Delete函数缩进错误:原函数中
return matrix缩进在for循环内,导致仅删除第一行的指定列就返回,需将return移到循环外:
def Delete(matrix, index1, index2): del matrix[index1] for i in matrix: del i[index2] return matrix # 修正缩进
- while True无限循环:原代码中
while True没有终止条件,会导致程序卡死,需根据TSP逻辑添加终止判断或直接移除该循环; - 索引越界问题:原代码中
for i in range(1,n)会跳过索引0,导致矩阵对角线初始化不完整,应改为range(n); - 变量名拼写错误:
PathLenght应为PathLength。
修复后的核心代码片段
import csv # 读取矩阵数据 with open("input1.txt", "r") as f: reader = csv.reader(f, delimiter=";") next(reader) # 跳过表头行 matrix = [] for row in reader: # 提取每行从第二列开始的数值,转为float numeric_row = list(map(float, row[1:])) matrix.append(numeric_row) n = len(matrix) StartMatrix = [row.copy() for row in matrix] # 保存原始矩阵 # 初始化对角线为无穷大 for i in range(n): matrix[i][i] = float('inf') # 后续TSP逻辑...
内容的提问来源于stack exchange,提问作者Rachel Dorn
相关产品推荐
相关产品推荐

