Я хочу сгенерировать двоичную матрицу 20x38, основываясь на некоторых ограничениях, которые я использую, используя модель dpcplex. Некоторые ячейки матрицы имеют предопределенные значения, как показано ниже (строка, столбец, параметр):
[(8,3,0), (14,0,0), (14,2,0), (16 , 0,0), (16,1,0), (12,0,0), (10,0,0), (10,8,0), (10,9,0), (17,7 , 0), (17,8,0), (8,0,0), (13,8,0), (13,9,0), (1,0,1), (15,19,0 )]
Мне нужно заполнить другие ячейки матрицы некоторыми ограничениями:
- сумма столбцов должна быть равна 10
- сумма строк должна быть равна 19
- последние 4 ячейки каждой строки должны быть альтернативными: допускается только 1010 или 0101
- не более 2 последовательных 0 или 1 с
- сумма каждых 5 ячеек в каждой строке должно быть в диапазоне [2,3]: нет 11011 или 00100
- сумма пары последовательных нулей должна быть <= 3: в каждой строке нам не разрешено иметь более 3 пар 00 и 3 пары из 11 </li>
Проблема в том, что моя модель не возвращает никаких решений. Я не уверен, что моя модель верна.
вот мой код:
from docplex.mp.model import Model
cond=[[8,3,0],[1,37,0],[6,9,0]]
model = Model("MatrixComple")
R = [i for i in range(20)]
R1=[i for i in range(38)]
R2=[34,35,36,37]
R3=[i for i in range(36)]
R4=[i for i in range(34)]
R5=[i for i in range(37)]
idx = [(i, j) for i in R for j in R1 ]
x = model.binary_var_dict(idx,name= "x")
"""pre-defined cells"""
for i in R:
for j in R1:
for item in cond:
i1,i2,i3=item
model.add_constraint(x[i1, i2] == i3)
"""sum of columns must be equal to 10 """
model.add_constraints(model.sum(x[i, j] for i in R) == 10 for j in R2)
"""sum of rows must be equal to 19 """
model.add_constraints(model.sum(x[i, j] for j in R1) == 19 for i in R)
"""(apply to all rows)last 4 cells of each row must be alternative: just 1010 or 0101 is allowed"""
model.add_constraints(model.sum(x[(i, j)] for j in R2 ) == 2 for i in R )
model.add_constraints(x[(i, 34)] ==x[(i, 36)] for i in R )
"""no more that 2 consecutive 0s or 1s : 110 or 001 or 101 or 010
this rule can not be applied to pre-defined cells. For example if we have 000 or 111 in pre-defined conditions,
we need to apply this rule for the rest of matrix not the pre-defined cells
"""
model.add_constraints(model.sum(x[i, j]+x[i,j+1]+x[i,j+2] for j in R3) <=2 for i in R)
model.add_constraints(model.sum(x[i, j]+x[i,j+1]+x[i,j+2] for j in R3) >=1 for i in R)
""" (apply to all rows) sum of every 5 cells in each row must be in range [2,3] : no 11011 or 00100 is allowed """
model.add_constraints(model.sum(x[i, j]+x[i,j+1]+x[i,j+2]+x[i,j+3]+x[i,j+4]for j in R4) <=3 for i in R)
model.add_constraints(model.sum(x[i, j]+x[i,j+1]+x[i,j+2]+x[i,j+3]+x[i,j+4]for j in R4) >=2 for i in R)
""" (apply to all rows) sum of pair of consecutive 0s must be <=3 : in each row we are not allowed to have
more than 3 pair of 00 """
for i in R:
s=0
for j in R5:
if x[i, j]==x[i,j+1]==0:
s+=1
model.add_constraint(s<= 3)
""" (apply to all rows) sum of pair of consecutive 1s must be <=3 : in each row we are not allowed to have
more than 3 pair of 11 """
for i in R:
s=0
for j in R5:
if x[i, j]==x[i,j+1]==1:
s+=1
model.add_constraint(s<= 3)
solution = model.solve()
print(solution)