我尝试构建最近邻算法,通过选择权重最小的节点到所有节点,然后重复直到遍历所有节点,从而找到所有节点的路由我已经测试过了,代码似乎没有工作,因为数组是通过引用传递的,而不是通过值传递的尽管使用了[:]
我哪里做错了?任何帮助都会被告知的
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
循环体。我不知道你到底想计算什么,所以我没有具体的修正建议。