代码适用于numpy数组,但不适用于2D列表

时间:2019-05-06 04:54:25

标签: python numpy

好吧,首先,我意识到这段代码是纯意大利面,我事先表示歉意(欢迎提示,但最重要的是我需要它来工作)。但是它可以按我期望的方式工作,当我使用numpy数组时,而不是当我使用2D列表时,我只是发现出于任何原因我都不允许使用numpy。

本质上,我想做的是扰动此2D矩阵,以确保每一列都具有一个正确的非零条目。同样,每一列都具有关联的权重,并且对于每一行,非零列权重的总和必须小于droneCapacity。

满足这些条件后,将通过ObjectiveFunction()计算与原始矩阵和被摄动矩阵关联的总长度,如果被摄动矩阵的长度较短,则将其返回。

def nudgeSolution(fs, fr, spf, warehouse, orders, id_offset, droneCapacity):
    max_itr = 200

    pivot_col = random.randint(0, len(orders) - 1)
    nudge = random.randint(0, len(orders) - 1)
    nudged_fs = np.copy(fs) #Want to change to nudged_fs = fs.copy()


    fs_length = objectiveFunction(fs, spf, warehouse, orders, id_offset)
    nudged_fs_length = objectiveFunction(nudged_fs, spf, warehouse, orders, id_offset)

    i = 0
    while nudged_fs_length >= fs_length and i <= max_itr:
        for row in range(len(fs)):
            if nudged_fs[row][pivot_col] == 1:
                while ((fr.orderWeight(pivot_col) + fr.groupWeight(fs[nudge])) > droneCapacity):
                    nudge = random.randint(0, len(orders) - 1)
                    pivot_col = random.randint(0, len(orders) - 1)
                nudged_fs[row][pivot_col] = 0
                nudged_fs[nudge][pivot_col] = 1
                break

        fs_length = objectiveFunction(fs, spf, warehouse, orders, id_offset)
        nudged_fs_length = objectiveFunction(nudged_fs, spf, warehouse, orders, id_offset)

        i += 1

    if nudged_fs_length > fs_length:
        return fs
    else:
        return nudged_fs

当我使用numpy数组时,它可以顺利运行。但是,当我尝试使用2D列表时,我最终得到的列包含多个非零条目(但是,总行权重仍然小于droneCapacity)。

Sample output with numpy array:

Original:
[[1 0 1 0]
 [0 1 0 0]
 [0 0 0 1]
 [0 0 0 0]]



Perturbed:
[[1 0 1 0]
 [0 1 0 1]
 [0 0 0 0]
 [0 0 0 0]]



Sample output with 2D-List:

Original:
[[1 0 1 0]
 [0 1 0 0]
 [0 0 0 1]
 [0 0 0 0]]

Perturbed:
[[1 1 0 0]
[0 1 0 0]
[0 0 1 1]
[0 0 0 0]]

谁能看到我的问题吗?

1 个答案:

答案 0 :(得分:0)

找出问题所在。显然,nudged_fs = fs.copy()只是传递了一个引用,并且每次我修改nudged_fs时,原始副本和副本都被修改。一旦我改为通过嵌套循环手动复制每个值时,这种情况就停止了。