Хорошо, во-первых, я понимаю, что этот код - чистые спагетти, и заранее прошу прощения (советы приветствуются, но самое главное, чтобы он работал). Но это работает так, как я ожидаю, когда использую массив NumPy, а не когда я использую 2D-список, и я только что узнал, что по какой-либо причине мне не разрешено использовать NUMPY.
По сути, я пытаюсь изменить эту двумерную матрицу так, чтобы каждый столбец имел ровно одну ненулевую запись. Кроме того, каждый столбец имеет связанный вес, и для каждой строки сумма ненулевых весов столбцов должна быть меньше, чем droneCapacity.
Как только эти условия выполняются, общая длина, связанная с исходной матрицей и возмущенной матрицей, вычисляется с помощью targetFunction (), и, если возмущенная матрица имеет меньшую длину, она возвращается.
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]]
Кто-нибудь может понять, в чем моя проблема?