Несколько рюкзаков со взаимозаменяемыми предметами

#or-tools

#или-инструменты

Вопрос:

Я использую cp_model для решения проблемы, очень похожей на проблему с несколькими рюкзаками (https://developers.google.com/optimization/bin/multiple_knapsack ). Как и в примере кода, я использую некоторые логические переменные для кодирования членства:

 # Variables
# x[i, j] = 1 if item i is packed in bin j.
x = {}
for i in data['items']:
    for j in data['bins']:
        x[(i, j)] = solver.IntVar(0, 1, 'x_%i_%i' % (i, j))
  

Специфика моей проблемы заключается в том, что существует большое количество взаимозаменяемых предметов. Может быть 5 предметов типа 1 и 10 предметов типа 2. Любой предмет можно заменить предметами того же типа. Использование логических переменных для кодирования проблемы неявно предполагает, что порядок присвоения для элементов одного и того же типа имеет значение. Но на самом деле порядок не имеет значения и только отнимает ненужное вычислительное время.

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

Ответ №1:

Вместо создания 5 логических переменных для 5 элементов типа ‘i’ в ячейке ‘b’, просто создайте целочисленную переменную ‘count’ от 0 до 5 элементов ‘i’ в ячейке ‘b’. Затем sum over b (count[i][b]) == #item b