好吧,首先,我意识到这段代码是纯意大利面,我事先表示歉意(欢迎提示,但最重要的是我需要它来工作)。但是它可以按我期望的方式工作,当我使用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]]
谁能看到我的问题吗?
答案 0 :(得分:0)
找出问题所在。显然,nudged_fs = fs.copy()只是传递了一个引用,并且每次我修改nudged_fs时,原始副本和副本都被修改。一旦我改为通过嵌套循环手动复制每个值时,这种情况就停止了。