Ошибка Cplex: добавление тривиального недопустимого линейного ограничения

Я хочу решить модель целочисленного программирования с помощью cplex python. У меня такая модель:

введите здесь описание изображения

a и h - это матрицы с нулями и единицами. p - это набор чисел. вот часть моего комплексного кода для этой модели:

p=[i for i in range (len(h))]
x=mdl.binary_var_dict(p,name='x')

#objective
mdl.minimize(0)

#constraints
#1
mdl.add_constraints(mdl.sum(h[i][k]*x[i] for  i  in p)==4  for k in T)

#2    
mdl.add_constraints(mdl.sum(a[i][k]*x[i] for i in p)==4  for k in T)

mdl.print_information()
Solution = mdl.solve(log_output=False)
mdl.get_solve_status()
print(Solution)

Когда я запускаю программу, я получаю такую ​​ошибку:

Error: Adding trivial infeasible linear constraint: 0 == 4, rank: 1
Error: Adding trivial infeasible linear constraint: 0 == 4, rank: 1
Error: Adding trivial infeasible linear constraint: 0 == 4, rank: 23
Error: Adding trivial infeasible linear constraint: 0 == 4, rank: 23

«h» - это матрица размером 600 * 22, а «a» - обратная h (если в h есть 1 (или 0), это 0 (или 1) в a). Образец h:


 [1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0],
 [1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0],
 [1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0],
 [1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0],
 [1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0],
 [1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0],
 [1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0],
 [1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0],
 [1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0],
 [1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0],
 [1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0],
 [1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0],
 [1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0],
 [1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0]]

Я не понимаю, в чем проблема.


person Sana.Nz    schedule 16.03.2020    source источник


Ответы (1)


Сообщения об ошибках сообщают вам, что происходит: вы добавили ограничение, которое является тривиально невыполнимым, т.е. которое, очевидно, не может быть выполнено. Из сообщения об ошибке кажется, что вы добавили некоторые == 4 ограничения с пустой левой стороной.

Из вашего кода видно, что это произойдет, если p пуст.

person Daniel Junglas    schedule 16.03.2020
comment
Но ни один из левых параметров и наборов не пуст. - person Sana.Nz; 16.03.2020
comment
Что ж, если p пусто, то все левые части пусты. Или, может быть, все ссылочные значения в a или h равны 0? Вам нужно будет обновить свой вопрос полным кодом (минимальный пример), если вам потребуется дополнительная помощь. - person Daniel Junglas; 16.03.2020
comment
Ok. Отредактировал пост. - person Sana.Nz; 17.03.2020
comment
В вашем примере h вы можете видеть, что все столбцы равны нулю. Это приведет к ограничениям с коэффициентами «все 0» в левой части. Таким образом, в этих ограничениях левая часть равна 0. Вы можете вычислить / распечатать min(max(h[i][k] for i in p) for k in T). Если это 0, то у вас есть все 0 столбцов в h. Ограничения, построенные на основе этого столбца, вызовут указанное выше предупреждение. - person Daniel Junglas; 17.03.2020
comment
Значит, это не связано с проблемой, что у меня нет подходящих решений? - person Sana.Nz; 18.03.2020
comment
Это причина, по которой вы не можете найти подходящих решений. Вы добавляете ограничения, которые никогда не могут быть удовлетворены. docplex предупреждает вас об этой проблеме. Возникла проблема либо с вашей моделью, либо с вашим определением матриц a и h. Пока в вашей матрице есть столбцы все-0 или все-1, модель, которую вы создаете, будет неосуществимой. Возникает вопрос: почему в вашей матрице есть эти столбцы? А может быть, вы случайно переставили матрицу? Прямо сейчас вы создаете ограничение для каждого столбца. Может быть, вы хотите вместо этого создать ограничение для каждой строки? - person Daniel Junglas; 18.03.2020
comment
Хорошо, это действительно помогло. Спасибо. У меня есть еще один вопрос. Теперь у меня есть 2 возможных решения, но я знаю, что есть сотни возможных решений. Как мне получить все решения ?! - person Sana.Nz; 18.03.2020
comment
Пожалуйста, начните новый вопрос по этому поводу. Это не связано с вашим исходным вопросом. - person Daniel Junglas; 18.03.2020