我尝试构建最近邻算法,通过选择权重最小的节点到所有节点,然后重复直到遍历所有节点,从而找到所有节点的路由我已经测试过了,代码似乎没有工作,因为数组是通过引用传递的,而不是通过值传递的尽管使用了[:]
我哪里做错了?任何帮助都会被告知的

def nearest_neighbour(matrix):
    shortest = sum(row[0] for row in matrix[:])+1
    best_route = None

    for row_index in range(len(matrix[:])):
        test_time = 0
        route = [row_index]
        temp_matrix = matrix[:]
        index = row_index
        for i in temp_matrix:

            for row in temp_matrix:
                row[index] = sum(row)

            current_row = temp_matrix[row_index]
            score = min(current_row)
            index = current_row.index(score)
            test_time += score
            route.append(index)
        if shortest > test_time:
                    shortest = test_time
                    best_route = route
    return shortest, best_route[:-1]



a = [
    [0, 3610, 2959, 3536],
    [3861, 0, 1828, 243],
    [3129, 1706, 0, 1632],
    [3731, 242, 1698, 0]
    ]

nearest_neighbour(a[:])

编辑:我在函数末尾添加了一个if语句,其中最初没有

最佳答案

使用类似matrix[:]的切片只会生成列表列表的浅拷贝也就是说,您已经复制了外部列表,但是新列表包含对原始列表所做的相同内部列表的引用。如果要重写内部列表的值,并且不希望看到原始列表中的效果,则可能还需要复制内部列表。
使用copy.deepcopy复制嵌套数据结构可能是个好主意也就是说,您当前的代码生成了一大堆可能不必要的副本。如果您只是要对它调用len或在不添加或删除元素的情况下对它进行迭代,则不需要复制它。
我也很怀疑你的for i in temp_matrix[:]循环,因为你从不使用i循环体。我不知道你到底想计算什么,所以我没有具体的修正建议。

10-06 11:50