Код работает с пустым массивом, но не с 2D списком - PullRequest
0 голосов
/ 06 мая 2019

Хорошо, во-первых, я понимаю, что этот код - чистые спагетти, и заранее прошу прощения (советы приветствуются, но самое главное, чтобы он работал). Но это работает так, как я ожидаю, когда использую массив 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]]

Кто-нибудь может понять, в чем моя проблема?

1 Ответ

0 голосов
/ 06 мая 2019

Разобрался с проблемой.Очевидно, nudged_fs = fs.copy () просто передавал ссылку, и каждый раз, когда я изменял nudged_fs, изменялись и оригинал, и копия.Это прекратилось, когда я вместо этого скопировал каждое значение вручную через вложенный цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...