Словарь умножения в PuLP - реализация ограничений - PullRequest
0 голосов
/ 23 декабря 2018

Я создаю большую модель LP, которой нужно назначить продукт k из производственного объекта i клиенту j.У меня возникли проблемы с выполнением ограничения, связанного с доставкой продуктов в контейнерах.

z_ij - количество контейнеров, которые необходимо отправить из местоположения i в j.

x_ijk - это количество продукта k, отправленного от i до j.

Если продукт занимает 1% контейнера, мне нужно, чтобы модель знала, что ему следует назначить 2 контейнера, еслиМы отправляем 150 товаров.

Я реализую ограничение с помощью переменной решения x_ijk.Сумма переменной решения должна быть умножена на коэффициент для каждого i и каждого j (сколько контейнера занимает продукт).

Я попытался создать словарь container_cap, показывающий, сколько изконтейнер продукт занимает.Умножая это на мою переменную решения, мы получим требуемое количество контейнеров.

#Containers to ship
for i in production:
    for j in warehouse:
            prob += lpSum([x[i][j][k]] * container_cap[k] for k in product) <= lpSum([z[i][j]])

Однако я получаю сообщение «Невозможно умножить последовательность на не-int типа« список »» - ошибка.

Есть предложения?

1 Ответ

0 голосов
/ 28 декабря 2018

В приведенном выше коде произошла ошибка в один символ.Вы написали:

prob += lpSum([x[i][j][k]] * container_cap[k] for k in product) <= lpSum([z[i][j]])

В этом примере вы пытаетесь умножить список одного элемента [x[i][j][k]] на потенциально нецелое число container_cap[k].Вот почему вы выдаете ошибку.В python вы можете дублировать список n раз, умножив его на n.Но n должно быть целым числом.

Я думаю, что вы хотели написать:

prob += lpSum([x[i][j][k] * container_cap[k] for k in product]) <= lpSum([z[i][j]])

Здесь вы берете сумму списка элементов, по одному элементу для каждого элемента.k в списке product, который вы предположительно уже определили, и затем говорите, что список должен быть меньше, чем другое значение.

Кроме того, если я неправильно понял вашу модель, вторая lpSum не обязательно.Вы в основном говорите, что количество контейнеров, запланированных от i до j, должно быть достаточным, чтобы вместить весь продукт, запланированный от i до j;так что я думаю, что вы хотите следующее:

prob += lpSum([x[i][j][k] * container_cap[k] for k in product]) <= z[i][j]
...