0

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.

Jason Aller
  • 3,541
  • 28
  • 38
  • 38

0 Answers0