That's a simplified version of what I need and shows the problem. It's a timestabling problem. But here I just want to prevent some sequence of weekday/subject/professor/classroom/hour/class from repeating.
import gurobipy as gp
model = gp.Model()
x = {}
c1, c2, c3, c4, c5, c6 = [], [], [], [], [], []
C1, C2, C3, C4, C5, C6 = [], [], [], [], [], []
for i in range(340):
x[i, 0] = model.addVar(vtype=gp.GRB.INTEGER, ub=4) #weekday
x[i, 1] = model.addVar(vtype=gp.GRB.INTEGER, ub=7) #subject
x[i, 2] = model.addVar(vtype=gp.GRB.INTEGER, ub=15) #professor
x[i, 3] = model.addVar(vtype=gp.GRB.INTEGER, ub=5) #classroom
x[i, 4] = model.addVar(vtype=gp.GRB.INTEGER, ub=16) #hour
x[i, 5] = model.addVar(vtype=gp.GRB.INTEGER, ub=11) #class
for j in range(340):
for i in range(j+1, 340):
c1.append(model.addVar(vtype=gp.GRB.INTEGER)) #integer for weekday
c2.append(model.addVar(vtype=gp.GRB.INTEGER)) #integer for hour
c3.append(model.addVar(vtype=gp.GRB.INTEGER)) #integer for professor
c4.append(model.addVar(vtype=gp.GRB.INTEGER)) #integer for classroom
c5.append(model.addVar(vtype=gp.GRB.INTEGER)) #integer for class
c6.append(model.addVar(vtype=gp.GRB.INTEGER)) #integer for subject
C1.append(model.addVar(vtype=gp.GRB.INTEGER)) #positive integer for weekday
C2.append(model.addVar(vtype=gp.GRB.INTEGER)) #positive integer for hour
C3.append(model.addVar(vtype=gp.GRB.INTEGER)) #positive integer for professor
C4.append(model.addVar(vtype=gp.GRB.INTEGER)) #positive integer for classroom
C5.append(model.addVar(vtype=gp.GRB.INTEGER)) #positive integer for class
C6.append(model.addVar(vtype=gp.GRB.INTEGER)) #positive integer for subject
model.addConstr(c1[-1] == x[i, 0] - x[j, 0]) #weekday i vs weekday j
model.addConstr(c2[-1] == x[i, 4] - x[j, 4]) #hour i vs hour j
model.addConstr(c3[-1] == x[i, 2] - x[j, 2]) #professor i vs professor j
model.addConstr(c4[-1] == x[i, 3] - x[j, 3]) #classroom i vs classroom j
model.addConstr(c5[-1] == x[i, 5] - x[j, 5]) #class i vs class j
model.addConstr(c6[-1] == x[i, 1] - x[j, 1]) #subject i vs subject j
model.addConstr(C1[-1] == gp.abs_(c1[-1]))
model.addConstr(C2[-1] == gp.abs_(c2[-1]))
model.addConstr(C3[-1] == gp.abs_(c3[-1]))
model.addConstr(C4[-1] == gp.abs_(c4[-1]))
model.addConstr(C5[-1] == gp.abs_(c5[-1]))
model.addConstr(C6[-1] == gp.abs_(c6[-1]))
model.addConstr(C1[-1] + C2[-1] + C3[-1] + C4[-1] + C5[-1] + C6[-1] >= 1)
#shouldn't exist a repeated sequence
model.optimize()
print(f"\n{model.status}\n")
With the range of each variable, it has thousands of different sequences and I need only 340. Although, it keeps showing model.status = 3, which means the model is unfeasible. Of course, that's a simplified version of the problem, with limited constraints and no need for an objective function.