You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 07:10:28